- 각 기능에 따른 개별 애플리케이션을 생성하여 서비스가 독립적으로 존재할 수 있도록 구현한 MSA 기반 물류 관리 및 배송시스템 프로젝트입니다.
- 서로다른 애플리케이션 간의 데이터 연동과 기능요청을 경험하며 실무에서 발생할 수 있는 다양한 상황에 대한 협업경험을 쌓는것을 목표로합니다.
- 기능에 따른 개별 애플리케이션을 생성하여 서비스가 독립적으로 존재할 수 있도록 구현.
- 한 서비스에서 이슈가 발생하더라도 다른서비스에는 영향을 미치지않아 시스템의 가용성 향상.
- 서비스 추가에 대한 확장성을 고려한 설계.
- 독립적인 서비스로 구현되어있지만, 서로 정보를 주고받을 수 있도록 서비스간 통신 설계.
- 트랜젝션 관리를 구현하여 하나라도 실패 시 전체롤백처리.
- 데이터 일관성을 유지하기위한 로직 구현.
- 데이터를 보호하기위해 인증된 사용자만이 접근할 수 있도록 구현.
- 각 서비스 별 접근가능한 권한을 설정하여 보안을 강화.
- JWT(Json Web Token) 를 활용한 인증 및 인가체계를 구현하여 서비스의 보안을 유지
- 시스템은 클라우드 기반에서 배포되며, 각 서비스는 필요에 따라 확장이 가능하도록 구현되어야함.
- 컨테이너화(Docker)를 활용한 시스템 배포 및 관리기능 구현.
- 멀티모듈 프로젝트 구조로 각 기능을 독립적인 마이크로서비스로 분리하여 개발진행.
- 서비스 내 통신은 REST API를 통해 이루어지며, 다른 서브모듈 간의 통신은 FeignClient 사용.
- Spring Cloud Eureka를 이용한 서비스 디스커버리 및 Spring Cloud Gateway를 통한 API 라우팅.
- 각 마이크로서비스는 수평 확장이 가능하며, 필요한 경우 독립적인 배포 및 유지보수.
- Layered Architecture로 클린 코드 유지 및 DDD를 통한 도메인 기반 설계.
- JWT 인증: 사용자 인증 및 권한 관리를 위해 JWT를 사용하며, 각 요청에서 JWT 토큰을 검증하여 인증된 사용자만 접근하도록 처리.
- GateWay의 WebFluxSecurity: API Gateway에서 WebFluxSecurity를 이용해 JWT 토큰을 검증하고, 권한에 따라 요청에 대한 접근을 인가 처리.
- AOP를 통한 권한 인가: 서브모듈에서 세부 API별로 AOP를 활용해 권한 인가를 처리, 각 API에 맞는 권한 검사를 자동화
- 비밀번호 암호화: BCrypt 해시 알고리즘을 사용하여 비밀번호 입력 시 암호화 하여 저장.
- 데이터 유효성 검사: Spring Validator로 서버 측에서 유효성 검사 진행.
- 슬랙 API 연동: 슬랙 API와 연동하여 메시지 작성 후 발송 시 실시간으로 전달되도록 구현.
- Swagger를 사용하여 API 문서 자동화 지원.
- spring boot 3.4.3
- Gradle
- java 17
- Docker
| 분류 | 상세 |
|---|---|
| Backend | Java & Spring Boot Spring Cloud (Eureka) Spring Gateway JPA Feign Client Spring AOP QueryDSL |
| Database | PostgreSQL |
| Infra | Docker, Docker Compose |
| Auth | Spring Security JWT |
| Documentation | Swagger |
| Test | Spring Boot Test JUnit |
- Docker Desktop 필요(데이터베이스 연동, 서비스 실행)
# 프로젝트 클론
git clone https://github.com/logistics-delivery/Back-end.git
cd Back-end
# 빌드 및 실행
# 1. 데이터베이스만 docker container로 실행한 뒤, 각 애플리케이션을 개별실행
$ docker compose up -d postgres
# 2. 데이터베이스와 개별 서비스를 함께 docker container로 업로드하여 실행하는경우
$ docker compose up -d
- 도메인 다이어그램
- 테이블 설계서
- ERD
- API 명세서
- 인프라 설계서
- [Conventions] : 우리 조의 개발 규칙
- [[Commit Message Conventions]]
- [[Java Code Style]]
- [[Git-flow]]
- [[Package Structure]]
트러블 슈팅
공통 관심 사항
- AOP @Rolecheck 사용방법
- AuditorAwareImpl 구현 및 @SQLRestriction 설정
- Git 시크릿 키 보호 방법
- Docker 명령어
- 설계 대비 API 구현률
- ai 자동생성 배송메세지 구현
- 매일 6시 슬랙 알림 발송기능 구현
- 슬랙 이름이 Null값인 관리자 권한 사용자의 다른 사용자와의 테이블 분리
- Zipkin을 통한 분산 추적 기능 구현
- 비동기 이벤트 통신이 필요한 서비스 간의 호출을 Feign client 가 아닌 메세징 시스템으로 전환
- 페이징 처리 공통모듈에서 관리
- 예외처리 도메인 책임으로 분리
- 서비스 디스커버리 도입
- Eureka 를 활용해 서비스의 동적 등록과 검색이 가능해짐.
- API 게이트웨이 활용
- Gateway를 통해 JWT 토큰 검증 및 권한정보 인가처리를 진행하여 보안이 강화됨.
- DDD 설계를 위한 4계층 구조 활용
- MSA환경에서 4계층 구조를 사용함으로써 인프라스트럭처 코드와 순수한 자바 도메인 코드를 명확히 분리함.
- 이를 통해 서로 다른 서비스 간에 기술적인 의존도를 줄일 수 있게됨.
- AOP를 도입
- 서비스간 권한 체크를 하여 코드 중복을 줄이고 공통 관심사를 효율적으로 처리할 수 있게함.
- Pull Request 를 통한 코드 리뷰
- dev에 두 명 이상의 승인이 이루어지게 Pull Request를 열어놓아 코드 변경 사항에 대해 팀원들과 공유하고 검토하는 과정을 거쳐 코드 품질을 높임.
- GitHub Issues를 통한 이슈 관리
- 이슈 트래킹을 통해 진행사항을 파악하는데 도움이 됨.
- 데일리 스크럼을 통한 원활한 커뮤니케이션
- 매일 스크럼을 진행하여 모든 팀원의 진행 상황을 공유하고, 이슈를 공유 및 논의 함으로써 신속히 처리할 수 있었음.
-
MSA 방식의 프로젝트를 처음 진행하며 레이어드 계층 구성에 대한 어려움을 겪음
→ MSA 에서의 4계층 구조의 필요성을 팀원들과 공유하고, 도입하여 각 계층의 역할을 명확히 정의하여 코드의 가독성과 유지보수성을 높임. -
개발 초기 서버간 통신에 대한 규약을 정하지 않고, 각자 기능 구현에 집중하여 서비스 간 통신시 데이터 포맷 및 명세 불일치 문제 발생
→ 연관된 서비스 담당자들 간의 주기적인 커뮤니케이션을 강화하고, 공통 API 명세서를 보완하여 협업 효율을 높임
| 역할 | 담당자 | 세부 업무 |
|---|---|---|
| 인증인가, 사용자API |
신다은 (팀장) |
- 회원가입,로그인 등의 사용자 정보CRUD 구현 - 로그인 성공 시 JWT 토큰을 생성하여 사용자에게 전달되도록 함 - JWT 토큰을 사용하여 회원정보를 인증, 내부payload값을 추출하여 서브모듈에서 사용가능하도록 구현 - 인증된 정보를 바탕으로 사용자의 권한이 요청 url에 접근가능한지 gateway에서 우선적으로 인가처리를 할 수 있도록 구현 - gateway에서 기본 인가 처리 후, AOP와 Custom Annotation을 사용하여 각 API의 세부 기능별로 권한을 추가로 체크하는 접근 인가 기능을 구현. |
| 슬랙API | 신다은 (팀장) |
- 슬랙 메세지 관리 CRUD 구현 - 슬랙 외부 API를 연동하여 메세지 발송 시 실제 슬랙 사이트로 알림메세지가 전송되도록 함. - Base Entity를 사용한 생성,수정,삭제 기록 저장 및 SoftDelete 처리 - QueryDSL을 이용한 슬랙 메세지 검색기능 구현 |
| 허브API | 이소현 (테크리드) |
- Naver API 를 이용한 주소→위경도 변환 및 허브 생성 기능 구현 - 허브 조회 및 수정, 삭제 기능 구현 - QueryDSL을 활용한 허브 검색 기능 구현 - 위경도 계산을 통한 허브 경로 생성 구현 - 허브 경로 조회 및 삭제 구현 - 다익스트라 알고리즘을 이용한 최단 경로 기반 체크포인트 생성 구현 - 허브 경로 체크포인트 조회 및 삭제 기능 구현 - Feign client를 이용한 허브 내 입출고 관리 기능 구현 - 공통 모듈 : BaseEntity 구현 - 공통 모듈 : 전역 예외 처리(Exception Handling) 구현 - 배송 서비스 내에 허브 입출고 정보를 수신 및 저장하는 기능 구현 - 모든 도메인이 직접 구현한 BaseEntity를 상속받아 생성일, 수정일, 삭제일을 자동으로 기록하며, Soft Delete를 지원하도록 설계 |
| 상품API | 서진영 (테크리드) |
- 상품 CRUD 및 QueryDSL 기반 검색 기능 구현 - Swagger 설정 및 Auditor Aware 등 공통 모듈 구축 - FeignClient를 통한 마이크로서비스 간 통신 처리 - DDD 기반 4계층 아키텍처 설계 및 적용 - 시스템 흐름에 대한 플로우 차트 작성 및 공유 - 프로젝트 내 미숙한 기술에 대한 문서화 및 설명을 통해 팀 기술 이해도 향상 기여 |
| 배송API | 권길남 | - 배송, 배송 로그, 배송 담당자 CRUD 구현 - 배송 담당자 배정 알고리즘 구현 - QueryDSL을 사용한 배송정보 검색기능 구현 - Docker 개발 환경세팅 |
| 업체API | 원지윤 | - Company-service CRUD 개발 및 Spring Boot 기반 4계층 아키텍처 적용 - QueryDSL 기반 동적 검색 조건 및 페이징 기능 구현 - HTTP API 테스트, 도메인 및 서비스 계층 테스트 코드 작성 |
| 주문API | 이용재 | - 주문 CRUD 구현 - 주문 생성 시 Product 서비스에 재고 차감 요청 기능 연동 (FeignClient 사용) - 주문 생성 시 Shipping 서비스에 배송 생성 요청 기능 연동 (FeignClient 사용) - Slack 도메인 연동을 위한 주문 + 배송 정보 응답 API 제공 - QueryDSL을 활용한 주문 검색 기능 구현 (주문명 + 상태 검색) |