이번에 두 번째 프로젝트인 AI B2B 프로젝트를 진행하면서, Gateway에서 사용자 인증 및 인가 처리를 구현하게 되었다. 나는 기존에 회원가입과 로그인을 구현할 때 사용하던 방식을 그대로 적용하기로 했다. 1.1 각 MSA 서비스로 사용자 인증 정보가 전달되지 않는 문제그래서 Gateway에서 JWT 토큰을 헤더에서 추출한 뒤, 이를 검증하고 사용자 정보를 `SecurityContextHolder`에 저장하는 방식으로 접근했다. 처음에는 이 방법이 잘 작동할 것이라고 생각했지만, MSA 아키텍처 환경에서 문제가 발생했다. 각 서비스 간에 사용자 정보가 공유되지 않는 상황이 발생한 것이다.일일이 로그를 통해 하나씩 확인해 본 결과, Gateway에서 `SecurityContextHolder`에 저장..
배달 레전드 프로젝트가 끝이 났다아쉬운 점도 많지만! 팀원들과 협업하면서 배우고 얻은 것이 많기에 회고하면서 정리하고자 한다.1. 협업협업은 기존대로 디스코드와 깃허브를 활용하여 진행했다.깃허브에 issue, PR 을 발행하면 디스코드에 메시지가 오도록 설정하였다. Github를 사용하여 프로젝트를 체계적으로 관리하고, 효율적으로 협업할 수 있도록 하였다.`Project Board`를 통해 이슈들에 대한 전체적인 진행 상황을 파악하고 컨트롤할 수 있었다. 또 팀원 간 적극적인 코드 리뷰를 통해 코드 품질을 높이고 팀원 간 지식을 공유하였다. 2. 디자인 패턴팀에 엄청난 실력자 분이 계셔서 다양한 디자인 패턴도 배울 수 있었다!정적 팩토리 메서드`정적 팩토리 메서드`는 객체 생성을 위해 정적(static)..
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()..