프로젝트 이름: eleven-logistics (MSA, DDD 구조 설계)
본 프로젝트는 마이크로서비스 아키텍처를 기반으로 설계되었으며, 서비스 간 비동기 통신을 위해 RabbitMQ를 메시징 시스템으로 사용합니다.
개발 환경:
- Java: 17
- Spring Boot: 3.4.3
- 데이터베이스: PostgreSQL, Redis
- 개발 도구: Docker, Github
- 메시징 시스템 : RabbitMQ
허브 등록 (Master)
- 허브를 등록하기 위한 POST /api/hub Controller 기능 구현.
- 응답 객체와 메시지, HttpStatus code를 같이 묶어서 응답할 수 있게 ApiResponseData 클래스 생성.
- NAVER Geocoding API를 사용해서 허브를 등록할 때 허브의 주소를 기반으로 해당 위치의 위도, 경도를 받아서 같이 등록하는 기능 구현.
- 허브와 허브가 관리하는 업체는 1 : N 관계로, 하나의 허브에서는 여러 업체를 등록하고 관리할 수 있다.
- 처음에는 위도, 경도를 직접 요청하고 등록하는 방식을 구현하다가 향후 확장성과, 허브의 정보를 수정할 때 위도, 경도도 같이 수정해야 한다는 문제점을 깨닫게 되었다.
- 저는 NAVER를 좋아하기 때문에, NAVER API를 사용해서 허브의 주소를 요청받으면 해당 주소로 위도, 경도를 자동으로 찾아줄 수 있는 기능을 구현하게 되었다.
- 허브를 수정할 때 새로운 주소를 입력하면 위도, 경도가 해당 주소에 맞게 자동으로 수정될 수 있게 되면서 사용자에게 편리성을 제공할 수 있다고 생각했다.
특정 허브 조회 (All)
- 특정 허브 목록을 조회하기 위해 GET /api/hub/{hubId} Controller 기능 구현.
- deleted 상태가 아닌 허브와 업체를 조회할 수 있도록 허브 엔티티와 매핑한 Repository에 findByIdAndDeletedAtIsNull 메서드로 간단하게 구현.
- 하나의 허브에 여러 업체가 포함될 수 있고, 자주 조회될 수 있다고 생각하여 특정 허브를 조회할 때 딸려오는 업체 데이터는 Redis 캐싱 전략을 사용해서 조회 시간 단축 ( ex 180ms -> 32ms) (Cache-Aside)
- 팀원들과 FeignClient로 데이터를 요청해야 했기 때문에, 특정 허브를 조회하는 과정에서 허브만 조회를 할 것인지, 허브에 속한 업체도 같이 포함할 것인지 고민을 함.
- 우선 기본적인 CRUD를 구현하고, 계속해서 회의를 통해 리팩토링 하는 과정을 거치게 됨.
- PageImpl에는 기본 생성자가 없기 때문에 처음 조회 이후, Redis에 담긴 value로 응답값에 담아 보내려고 하다보니 역직렬화 문제가 발생했다.
- Serializable 인터페이스를 받아서 만든 구현체로 PageResponseDto클래스를 통해 page를 재정의해서 직렬화, 역직렬화 문제를 해결했다.
허브 전체 조회 (All)
- 모든 허브를 조회하기 위해 GET /api/hub Controller 기능 구현.
- 허브는 자주 변경되지 않는 정보이기 때문에 여기도 Cache-Aside전략을 사용해서 조회 시간 단축 ( ex 93ms -> 23ms)
- 특정 허브 조회와 같이 Page로 된 데이터를 역직렬화 하지 못하는 오류가 발생해서 PageResponseDto를 사용해서 응답 객체를 구성했다.
허브 삭제 (Master)
- 허브를 삭제하기 위해 DELETE /api/hub/{hubId} Controller 기능 구현.
- 삭제를 요청한 뒤, deletedBy를 삭제처리한 사용자의 이름으로 수정함 (실제로 데이터베이스에 정보가 삭제되지 않게 처리함.
허브 수정 (Master)
- 허브의 정보를 수정하기 위해 PUT /api/hub/{hubId} Controller 기능 구현.
- 수정을 요청한 뒤, updatedBy를 수정처리한 사용자의 이름으로 수정함.
- 허브의 이름과, 주소만 수정해도 위도, 경도가 자동으로 반영되게 할 수 있도록 NAVER API를 사용해서 구현.
'🔥 스파르타 TIL (프로젝트)' 카테고리의 다른 글
두 번째 프로젝트 기록하기 3 (0) | 2025.03.28 |
---|---|
두 번째 프로젝트 기록하기 2 (1) | 2025.03.26 |
NAVER Geocoding API 사용해서 위도, 경도 추가하기 (0) | 2025.03.19 |
Slack API 적용해서 사용자에게 DM 보내는 기능을 만들어보자 (0) | 2025.03.18 |
프로젝트 기록하기 3 (1) | 2025.02.20 |