Skip to content

outbox 패턴 적용#36

Closed
mungsil wants to merge 89 commits into
Chance-Glance:developfrom
mungsil:fix/odsay/stateful
Closed

outbox 패턴 적용#36
mungsil wants to merge 89 commits into
Chance-Glance:developfrom
mungsil:fix/odsay/stateful

Conversation

@mungsil

@mungsil mungsil commented Dec 29, 2025

Copy link
Copy Markdown
Collaborator

📄 PR 요약

outbox 패턴을 적용하여 메시지 유실을 방지했습니다. 메시지 소비 전 소비 기록을 체크하여 멱등성을 보장했습니다.

📋 관련 이슈

관련된 이슈 번호를 링크해주세요. 예: #123

🛠️ 변경 사항 설명

자세하게 변경된 사항을 설명해주세요.

📷 스크린샷

변경 사항을 시각적으로 보여주는 스크린샷을 첨부해주세요. 이미지를 첨부하는 방법은 다음과 같습니다:

📄 추가 정보

추가로 제공하고 싶은 정보가 있다면 작성해주세요.
리뷰어들에게 꼼꼼하게 리뷰받고 싶은 부분이나, 구현하면서 어려웠던 부분,
구현하면서 새로 알게 된 부분 등등 리뷰어의 이해를 돕기 위해 필요한 내용을 적어주세요.

-Google Place API를 Kakao Local API로 대체하였습니다. Kakao Local API를 이용하여 장소에 대한 정보를 가져옵니다.
- 장소 정보를 RDB가 아닌 NoSQL에 저장합니다.
- 기존 ODsay API가 수행하던 장소 간의 이동 시간 및 거리 정보를 Google Distance Matrix API가 수행하도록 합니다.
- 변경 전: 스레드 슬립
- 변경 후: 세마포어와 스케줄러
- 경위도가 같은 장소에 대한 API 중복 호출 방지
- 구글 API 응답의 status 필드를 매개로 유효한 응답인지 확인하는 로직을 추가하였습니다.
- 패키지 이름 및 경로를 변경하였습니다.
- 유효하지 않은 응답임이 확인되면 예외를 throw 하는 로직을 ODsay 어댑터에 작성하였습니다.
- 비동기 논블로킹 방식으로 외부 API 호출
- 외부 클래스로 분리된 최적 여행 경로 계산 메서드 호출
- 서로 다른 장소가 같은 경위도를 가지는 문제를 해결하기 위해 TravelCatalog class 대신 Location class를 이용
- 현재 여행 계획 완료 시 [알림 전송 -> 유저가 조회]하는 플로우입니다.
- 다음과 같은 이유로 유저 기능의 필요성을 느꼈습니다.
- 알림을 위해 필요한 FCM 토큰은 유저 단위로 관리하는게 편리함
- 여행 계획 조회 API 구현 방식의 변화(동기 -> 비동기 알림)에 따라, '요청했던 여행 계획 리스트' 기능이 요구됨. 그러나 해당 조회 기능에 FCM 토큰을 식별자로 사용하는 것은 부적절하다고 생각됨.
- 변경 전: A -> B 하위 경로 구하기
- 변경 후: 여러 하위 경로를 포함하는 최종 경로 구하기
- 코드 내용: TransitRoute 이벤트 발생 시 장소 간 대중 교통 경로를 구함. 이때 '장소'는 '여행 코스'에 소속된 여행 장소임. 해당 소속 관계를 나타내기 위해 여행 코스를 배치 단위로 정의하고, 이벤트 소비 완료 시 배치 상태를 업데이트하는 코드를 작성함.
-  낮은 처리량의 외부 API를 호출하는 여행 코스 이동 경로 안내 API의 처리량 및 응답 속도 저하 문제 발생
- push 모델로 전환하여 UX 저하 방지
- 외부 API 호출 속도를 제한하여 429 에러 발생 방지
# Conflicts:
#	src/main/java/com/example/mohago_nocar/plan/presentation/v1/TravelPlanControllerV1.java
@mungsil mungsil requested a review from mingmingmon as a code owner December 29, 2025 07:25
@mungsil mungsil closed this Dec 29, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant