Skip to content

logistics-delivery/Back-end

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

594 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Logistics-delivery

프로젝트 소개

- 각 기능에 따른 개별 애플리케이션을 생성하여 서비스가 독립적으로 존재할 수 있도록 구현한 MSA 기반 물류 관리 및 배송시스템 프로젝트입니다.

- 서로다른 애플리케이션 간의 데이터 연동과 기능요청을 경험하며 실무에서 발생할 수 있는 다양한 상황에 대한 협업경험을 쌓는것을 목표로합니다.

핵심기술 목표

1. 각 기능별 서비스 분리(MSA 기반 시스템 설계)

  • 기능에 따른 개별 애플리케이션을 생성하여 서비스가 독립적으로 존재할 수 있도록 구현.
  • 한 서비스에서 이슈가 발생하더라도 다른서비스에는 영향을 미치지않아 시스템의 가용성 향상.
  • 서비스 추가에 대한 확장성을 고려한 설계.

2.서비스 간 데이터 공유 및 동기화

  • 독립적인 서비스로 구현되어있지만, 서로 정보를 주고받을 수 있도록 서비스간 통신 설계.
  • 트랜젝션 관리를 구현하여 하나라도 실패 시 전체롤백처리.
  • 데이터 일관성을 유지하기위한 로직 구현.

3. 인증 및 보안

  • 데이터를 보호하기위해 인증된 사용자만이 접근할 수 있도록 구현.
  • 각 서비스 별 접근가능한 권한을 설정하여 보안을 강화.
  • JWT(Json Web Token) 를 활용한 인증 및 인가체계를 구현하여 서비스의 보안을 유지

4. 배포 및 확장성

  • 시스템은 클라우드 기반에서 배포되며, 각 서비스는 필요에 따라 확장이 가능하도록 구현되어야함.
  • 컨테이너화(Docker)를 활용한 시스템 배포 및 관리기능 구현.

구현 목표

1. MSA 기반 아키텍처 & 커뮤니케이션

  • 멀티모듈 프로젝트 구조로 각 기능을 독립적인 마이크로서비스로 분리하여 개발진행.
  • 서비스 내 통신은 REST API를 통해 이루어지며, 다른 서브모듈 간의 통신은 FeignClient 사용.
  • Spring Cloud Eureka를 이용한 서비스 디스커버리 및 Spring Cloud Gateway를 통한 API 라우팅.

2. 서비스 확장성 및 유연성

  • 각 마이크로서비스는 수평 확장이 가능하며, 필요한 경우 독립적인 배포 및 유지보수.
  • Layered Architecture로 클린 코드 유지 및 DDD를 통한 도메인 기반 설계.

3. 권한관리 및 보안

  • JWT 인증: 사용자 인증 및 권한 관리를 위해 JWT를 사용하며, 각 요청에서 JWT 토큰을 검증하여 인증된 사용자만 접근하도록 처리.
  • GateWay의 WebFluxSecurity: API Gateway에서 WebFluxSecurity를 이용해 JWT 토큰을 검증하고, 권한에 따라 요청에 대한 접근을 인가 처리.
  • AOP를 통한 권한 인가: 서브모듈에서 세부 API별로 AOP를 활용해 권한 인가를 처리, 각 API에 맞는 권한 검사를 자동화
  • 비밀번호 암호화: BCrypt 해시 알고리즘을 사용하여 비밀번호 입력 시 암호화 하여 저장.
  • 데이터 유효성 검사: Spring Validator로 서버 측에서 유효성 검사 진행.

4. 사용자 경험 개선

  • 슬랙 API 연동: 슬랙 API와 연동하여 메시지 작성 후 발송 시 실시간으로 전달되도록 구현.

5. 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

설계 산출물

개발 산출물

트러블 슈팅

공통 관심 사항

시스템을 발전 시키기 위해 더 해본다면?

  • 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을 활용한 주문 검색 기능 구현 (주문명 + 상태 검색)

About

MSA 기반 물류 배송 서비스

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors