물류 관리 시스템(Logistics Management System) CARGOFLOW 은 물류 프로세스를 관리하는 시스템으로, 허브, 업체, 상품, 주문 등의 정보를 효율적으로 연동하고 검색할 수 있는 기능을 제공합니다.
이 프로젝트는 Spring Cloud, FeignClient, Eureka, Config Server, API Gateway 등의 기술을 활용하여 마이크로서비스 간 독립성을 유지하며, 도메인 주도 설계(DDD)를 적용하여 개발되었습니다. 또한 외부 서비스와의 데이터 통신을 원활하게 처리하는 것을 목표로 했습니다.
- 개발 기간: 24.08.01 ~ 24.09.06
- 팀 구성: 4명
- 주요 도전과제:
- 마이크로서비스 간 통신 문제 해결: Spring Cloud Eureka와 FeignClient를 이용한 서비스 간 통신 구현
- 중앙 설정 관리: Config Server를 통해 각 마이크로서비스의 설정 정보를 중앙 관리하며, 환경별 설정 변경을 용이하게 처리.
- 라우팅 및 인증 처리: API Gateway를 통해 요청을 적절한 마이크로서비스로 라우팅하고, JWT 기반의 인증/인가를 처리.
- 복잡한 검색 기능 구현: QueryDSL을 이용해 검색 조건을 확장하고, 다양한 도메인의 데이터를 효율적으로 검색하는 시스템 구축
- 캐싱 처리 적용: Redis를 사용하여 허브 정보 및 경로 정보를 캐싱함으로써 API 호출 빈도를 줄이고 성능을 향상.
- 도메인 주도 설계(DDD) 적용: 허브, 허브 경로, 주문, 업체 등 각 도메인을 분리하고, 서비스와 리포지토리를 도메인 중심으로 설계하여 유지보수성을 향상
- 각 도메인의 CRUD + Search 구현.
- FeignClient를 이용하여 외부 서비스와의 연동을 구현.
- Config Server를 통해 중앙 설정 관리를 자동화하여, 운영 환경에서의 효율성을 증대.
- QueryDSL을 통해 복잡한 검색 기능 조건을 처리하여 다양한 데이터를 빠르고 효율적으로 검색
- Redis를 이용한 캐시 기능으로 API 호출 성능을 최적화.
-Language: JAVA 17
-Framework: Spring Boot 3.3.3
-DB: Postgresql, Redis
-Build Tool: Gradle 8.10
- 계층구조 : DDD 및 클린 아키텍처
➡️ 위성구 :
- Spring Eureka, FeignClient, Config Server, Api Gateway, Zipkin 초기 셋팅 및 실행
- AWS S3를 사용한 공유라이브러리 운영
- 깃 리포지토리를 사용하여 설정파일 관리
- Api Gateway JWT 검증 및 인가 구현
- 각 마이크로 서비스에서 프록시를 사용한 권한 정보를 사용한 확인 구현
➡️ 김휘수 :
- 회원가입 및 로그인 기능 구현
- 사용자 관리 기능 구현
- 스프링 시큐리티 및 JWT 인증 시스템 구축
- 배송담당자 도메인 설계 및 구현
- 슬랙 메시지 서비스 초안 설계
- 깃 리포지토리 관리
➡️ 이성원 :
- 허브, 허브 경로 도메인 구현
- QueryDsl 이용 Search 기능 구현
- Redis로 데이터 캐싱 처리
- 슬랙 메시지 발송, ai api로 날씨 정보 요약 기능 구현
➡️ 김민철 :
- 업체 및 상품 도메인 설계 및 구현
- QueryDsl를 활용한 복잡한 검색 기능 개발
- FeignClient를 사용해 외부 서비스와의 통신 및 데이터 연동 처리
➡️ 발생한 문제
- 공유 라이브러리를 Maven Repository에 배포 실패
- AWS S3를 사용하여 배포 (멀티 모듈 프로젝트로 구성으로 해결가능)
- 프로젝트 클론 및
docker설치 후 로컬 환경에서 순차적으로 실행
-
프로젝트 클론
git clone https://github.com/notitle12/cagoflow.git -
도커 컴포즈 명령어 실행
docker-compose up -d -
application.yml(로컬용) or application-product.yml(배포용) 작성
(작성 예시)
spring: application: name: HubService config: import: optional:configserver:${CONFIG_SERVER_URL} datasource: url: jdbc:postgresql://${host}:${port}/${database} username: ${username} password: ${password} driver-class-name: org.postgresql.Driver jpa: hibernate: ddl-auto: update dialect: org.hibernate.dialect.PostgreSQLDialect show-sql: true data: redis: host: ${REDIS_HOST} port: ${REDIS_PORT} password: ${REDIS_PASSWORD} sql: init: mode: always jwt: secret: key: ${secretKey}
-
애플리케이션 실행
-
Postman 등의 API 테스트 도구를 사용하여 API 테스트

