전체 글

공부한 것 기록합니다
JPA로 양방향 연관관계를 설정하면 N+1 문제가 발생할 수 있다는 얘기를 많이 들어봤다..이번 프로젝트에서도 양방향 연관관계를 설정한 만큼이번 기회에 N+1 문제가 무엇이고 해결 방법에는 무엇이 있는지 정리하고자 한다! N+1 문제`N+1 문제`는 JPA에서 발생할 수 있는 데이터베이스 쿼리 최적화와 관련된 중요한 성능 문제 중 하나이다. 내가 진행했던 프로젝트에서 예를 들면 Shop - Menu 엔티티들은 서로 연관관계를 맺는다Shop은 여러 개의 Menu를 가지니까 Shop이 `@OneToMany`로 Menu 필드를 가지고 Menu가 `@ManyToOne`로 Shop 필드를 가질 수 있을 것이다. (쉽게 말하면 Shop-Menu -> 일대다 관계) 그럼 특정 Shop의 Menu 필드를 조회하는 시나..
들어가면서...이번에 배달 레전드 프로젝트에서는 배달의 민족과 같은 배달 앱을 개발한다.키워드 검색 API를 구현하면서 시도했던 것, 구현한 것을 정리하려고 한다! 먼저 내가 구현하고자 했던 키워드 검색 API의 기능은 특정 키워드로 검색 시해당 키워드가 `가게 이름에 포함된 가게`, 혹은 `해당 키워드가 메뉴 이름에 포함된 가게`들을 조회하는 것이었다. ex) 배달의 민족처럼 가게에 해당 키워드가 포함된 메뉴들이 있다면 뜨도록! 그래서 처음 생각한 방법은 아래와 같다.처음 시도한 방법public Page search(PageRequest pageRequest, String keyword) { // 가게 이름에 해당 키워드가 포함된 가게 가져오기 Page shops = shopRepo.find..
와! 레전드 배달 프로젝트를 진행하면서 `QueryDSL`을 사용할 일이 생겼다.그래서 적용 시키고! 쿼리도 다 짜고! 실행했는데 !!!!!!!!! `no property found for type` 오류가 났다..  남겨둔 나의 코멘트.........  원인은 기존에 설정해둔 `Repository` 인터페이스 이름 때문 ㅠㅠ우리 팀이 정해둔 컨벤션대로 Repository의 이름을 모두 ~Repo 로 설정했었는데 그것이 원인이었다!!!!!!!!!!!!! `QueryDSL` 사용 시에는 레포지토리 이름을 정직하게 작성하자.  첫 번째처럼 Repo로 작성하면 안되고 풀네임을 작성해야 함!!!!!!!아님 QueryDSL로 작성한 메서드도 JPA로 인식이 돼서 no property 오류가 난다! 이걸로 2시간 ..
💡 Overview `레전드 배달 개발하기!` 💡 진행 및 완료 사항가게 단일 조회 API 구현`ShopException` 커스템 예외 객체 생성가게 검색 API 구현 (문제 발생!) 💡 개발 중 발생한 이슈/해결 방법검색 조회 시 페이지네이션 적용하기 (가게 이름 검색, 메뉴 이름 검색) 💡 오늘 새로 알게 된 내용`UUID`를 `Request` `Response`에 담을 때 `String`으로 변환할 시 장점/단점url 명명 규칙예외의 종류`LIKE` `@Query` 작성법Map 사용하여 현재 컬렉션에 담긴 객체 id 확인하기 ! 💡 Referenceurl 명명 규칙https://recordsoflife.tistory.com/59 💡 Takeawaymap 함수 사용에 익숙해진 것 같아 뿌듯!
1. 문자열 처리 `회문 검사`- 주어진 문자열이 거꾸로 읽어도 같은지 확인하는 문제- `s == s[::-1]` 를 사용하여 문자열을 뒤집은 후 원래 문자열과 비교def is_palindrome(s): return s == s[::-1]print(is_palindrome("level")) # Trueprint(is_palindrome("hello")) # False `아나그램 검사`- 두 문자열이 같은 문자들로 이루어졌는지 확인하는 문제- 두 문자열을 sorted()로 정렬한 후 비교def is_anagram(s1, s2): return sorted(s1) == sorted(s2)print(is_anagram("listen", "silent")) # Trueprint(is_anagram..
이제 본격적으로 취업 준비를 해야 한다..맨날 까먹는 파이썬 문법을 정리해보자!  리스트 컴프리헨션- 리스트를 `초기화`하는 방법- 2차원 리스트 초기화 시 매우 효과적 # 0부터 19까지의 수 중에서 홀수만 포함하는 리스트array = [i for i in range(20) if i % 2 == 1]# 1부터 9까지의 수의 제곱 값을 포함하는 리스트array = [i*i for i in range(1,10)]# N * M 크기의 2차원 리스트 초기화n = 3m = 4array = [[0] * m for _ in range(n) ] # [[0,0,0,0],[0,0,0,0], [0,0,0,0]]  리스트 관련 메서드a = [1,4,3]# 리스트에 원소 삽입a.append(2)# 오름차순 정렬a.sort()..
def solution(s): return ''.join(sorted((s), reverse=True)) `sorted()` list로 변환 후 정렬, 따라서 문자열도 정렬 가능함`ord()` 아스키 코드값 반환!!!!
📌 CI/CD`CI`(Continuous Integration)란 개발자가 변경한 코드를 자주 통합하고, 전체 시스템과 잘 어우러지도록 자동으로 테스트하는 프로세스이다. 코드 변경시마다 빌드 및 테스트를 수행하여 문제를 조기 발견할 수 있다!`CD` (Continuous Delivery)란 자동으로 배포하는 프로세스를 포함한다. 코드 변경이 통합되고 테스트 되면, 이를 자동으로 스테이징, 프로덕션 환경에 배포한다. 💡 CI/CD의 장점빠른 피드백자동화된 프로세스일관된 배포높은 품질 유지개발 속도 향상 📌 CI/CD 도구GitHub ActionsGitHub 저장소에 통합되어 있는 CI/CD 도구로, YAML 파일을 사용하여 워크플로우 정의무료 사용 가능 (제한된 런타임)Jenkins오픈 소스 CI/C..
린구
린구의 개발자 되기