Skip to content
@5ingMerryho

5ingMerryho

OingLogistics

{F0676DB8-BDC7-4B11-8FA6-BD27D6A7F8AB}

OingLogistics는 MSA(Microservices Architecture) 기반의 B2B 물류 관리 플랫폼으로, 다양한 기업 간의 물류 흐름을 효율적으로 처리하고 모듈화된 아키텍처를 통해 유연한 확장성과 유지보수성을 지향합니다. 도메인 주도 설계(DDD)를 적용하여 각 비즈니스 도메인을 명확히 분리하고, 서비스 간 통신은 FeignClient와 RabbitMQ를 혼합 활용하여 상황에 따라 최적화된 방식으로 데이터 흐름을 처리하고 있습니다.

🚶 프로젝트 소개

서비스 목표

  • B2B 환경에 최적화된 주문-배송-재고 관리 시스템 구축

    • 다양한 기업 고객을 대상으로 주문 접수, 물류 허브 이동, 배송 추적, 재고 모니터링 등 전 과정을 통합 관리할 수 있는 플랫폼을 제공합니다.
  • 실시간 알림 자동화

    • 배송 시작 및 도착, 배송 담당자 배정 등 주요 이벤트 발생 시 Slack 연동을 통한 실시간 알림 기능을 제공하여, 이벤트 추적과 운영 효율성을 높였습니다.
  • 확장 가능하고 유연한 구조

    • 도메인별 마이크로서비스 아키텍처를 기반으로 설계하여, 새로운 기능이나 비즈니스 요구사항에 대한 빠른 대응과 유연한 확장을 가능하게 하였습니다.

기술적 목표

  • 서비스 간 유연한 통신 전략 구현

    • 요청-응답 기반 통신은 FeignClient, 비동기 이벤트 기반 처리는 RabbitMQ를 활용하여 상황에 따라 최적의 방식으로 서비스 간 통신을 구성하였습니다.
  • 역할 기반 권한 처리 및 접근 제어

    • 인증(Authentication)은 API Gateway에서 처리하고, 인가(Authorization)는 각 마이크로서비스 내부에서 처리하도록 분리 설계하였습니다.
    • 사용자 요청 시 Http Header와 Redis에 저장된 로그인 정보를 비교하여 권한 유효성을 검증합니다.
    • Spring MVC의 Interceptor의 preHandle() 단계를 활용해 Controller 진입 전 권한 확인을 수행합니다.
    • API별로 사용자 역할이 상이할 경우, Service 레이어에서 추가적인 역할 검증을 수행하여 보안성을 강화하였습니다.
  • 캐싱 및 성능 최적화

    • 사용자 로그인 정보 및 인증 관련 데이터는 Redis에 캐싱하여 분산 환경에서도 안정적인 세션 관리와 빠른 인증 처리를 가능하게 하였습니다.
    • 조회 빈도가 높은 정적 데이터(예: 업체 정보, 허브 목록 등) 는 Caffeine Cache를 이용한 로컬 캐싱으로 처리하여 응답 속도와 처리 성능을 크게 향상시켰습니다.
    • 두 캐시 전략을 역할 및 데이터 특성에 따라 분리 적용함으로써, 서비스의 응답성, 확장성, 효율성을 모두 고려한 최적의 캐싱 구조를 구성하였습니다.
  • DB 성능 최적화

    • QueryDSL을 활용한 동적 쿼리를 통해 복잡한 조건 검색에서도 안정적인 성능을 유지하였습니다.
    • 동일 Aggregate에 속한 엔티티 간 조인 시, N+1 문제를 방지하기 위해 IN 절 및 LEFT JOIN 전략을 활용하였습니다.
  • 코드 재사용성과 유지보수성 향상

    • 여러 명의 백엔드 개발자가 협업할 때, 공통 유틸리티 및 서비스 계층을 적극 활용하여 중복 코드 최소화에 초점을 두었습니니다.
    • SOLID 원칙과 DRY(Don’t Repeat Yourself) 원칙을 기반으로 객체지향적인 설계를 지향하였습니다.
    • 각 기능은 단일 책임 원칙(Single Responsibility Principle) 에 따라 모듈화하여 유지보수성을 높였습니다.
    • 코드 컨벤션 및 패턴을 통일하여 일관성 있는 코드베이스를 유지하였습니다.

📝 개발 노션 및 산출물

프로젝트 설계 및 구현 산출물

👷 팀원 역할 분담

김기훈 이예본 이지언 이하은 전은배
김기훈 이예본 이지언(팀장) 이하은 전은배
(사용자, 슬랙, Gateway) (멀티 모듈, 업체, 상품) (허브, infra 관리, Docker) (배송 및 담당자 관리, Config) (주문, DB관리, 캐싱)
GitHub GitHub GitHub GitHub GitHub

📆 개발 기간

2025.03.10 - 2025.03.25 (2주)

🛠️ 사용 기술

🛠 버전

분류 상세
IDE IntelliJ IDEA
Language Java 17
Framework Spring Boot 3.4.3
Build Tool Gradle 8.1
Database PostgreSQL 17
In-Memory DB Redis
Local Cache Caffeine
Message Queue RabbitMQ
API 통신 REST API, FeignClient
컨테이너화 Docker

🛠 주요 기술 스택

분류 상세
Backend
Database
Version & Issue
Infra

🏗️ 아키텍처

Image

📝 ERD

Image

🎥 기능

📝 시퀀스 다이어그램

Image

🖥️ 프로젝트 주요 기능

업체 (company-service)

Company (업체 관리)

  • CompanyAdminController (/admin/v1/companies)
    • 새로운 업체 생성
    • 업체 목록 전체 조회
    • 특정 업체 상세 조회
    • 특정 업체 정보 수정
    • 특정 업체 삭제
  • CompanyController (/api/v1/companies)
    • 새로운 업체 생성
    • 업체 목록 전체 조회
    • 특정 업체 상세 조회
    • 특정 업체 정보 수정
    • 특정 업체 삭제
  • CompanyFeignClientController (/company-service/companies)
    • 특정 업체 상세 조회
배송 (delivery-service)

Delivery (배송 관리)

  • DeliveryAdminController (/admin/v1/deliveries)
    • 새로운 배송 생성 (테스트 용도, 메시지큐 도입으로 사용 중단)
    • 특정 배송 정보 수정
    • 특정 배송 상태 수정
    • 특정 배송 삭제
    • 특정 배송 상세 조회
    • 배송 목록 전체 조회
    • 특정 배송 경로 상세 조회
    • 특정 배송의 경로 목록 조회
    • 특정 배송 경로 상태 수정
  • DeliveryController (/api/v1/deliveries)
    • 특정 배송 정보 수정
    • 특정 배송 상태 수정
    • 특정 배송 삭제
    • 특정 배송 상세 조회
    • 배송 목록 전체 조회
    • 특정 배송 경로 상세 조회
    • 특정 배송의 경로 목록 조회
    • 특정 배송 경로 상태 수정
  • DeliveryManagerController (/api/v1/deliveries/managers)
    • 특정 배송 담당자 상세 조회
    • 특정 배송 담당자 전체 조회
  • DeliveryManagerAdminController (/admin/v1/deliveries/managers)
    • 특정 배송 담당자 상세 조회
    • 특정 배송 담당자 전체 조회
허브 (hub-service)

Hub (허브 관리)

  • HubAdminController (/admin/v1/hubs)
    • 특정 허브 상세 조회
    • 허브 목록 전체 조회
    • 새로운 허브 생성
    • 특정 허브 정보 수정
    • 특정 허브 삭제
  • HubController (/api/v1/hubs)
    • 허브 목록 전체 조회
    • 특정 허브 상세 조회
  • HubFeignClientController (/hub-service)
    • managerId로 허브 정보 조회
    • 최적의 허브 경로 조회
    • 특정 허브 상세 조회
  • HubRouteAdminController (/admin/v1/hub-routes)
    • 새로운 허브 경로 생성
    • 특정 허브 경로 상세 조회
    • 허브 경로 목록 전체 조회
    • 특정 허브 경로 정보 수정
    • 특정 허브 경로 삭제
주문 (order-service)

Order (주문 관리)

  • OrderAdminController (/admin/v1/orders)
    • 주문 목록 전체 조회
    • 새로운 주문 생성
    • 특정 주문 상세 조회
    • 특정 주문 정보 수정
    • 특정 주문 삭제
    • 특정 주문의 상세 주문 삭제
  • OrderController (/api/v1/orders)
    • 주문 목록 전체 조회
    • 특정 주문 상세 조회
    • 새로운 주문 생성
    • 특정 주문 정보 수정
    • 특정 주문 삭제
    • 특정 주문의 상세 주문 삭제
  • OrderFeignClientController (/order-service/orders)
    • 특정 주문 조회
상품 (product-service)

Product (상품 관리)

  • ProductAdminController (/admin/v1/products)
    • 새로운 상품 등록
    • 상품 목록 전체 조회
    • 특정 상품 상세 조회
    • 특정 상품 정보 수정
    • 특정 상품 삭제
  • ProductController (/api/v1/products)
    • 새로운 상품 등록
    • 상품 목록 전체 조회
    • 특정 상품 상세 조회
    • 특정 상품 정보 수정
    • 특정 상품 삭제
  • ProductFeignClientController (/product-service/products)
    • 특정 상품 상세 조회
알림 (slack-service)

Slack (슬랙 메시지 관리)

  • SlackAdminController (/admin/v1/slack-messages)
    • 슬랙 메시지 목록 전체 조회
    • 특정 슬랙 메시지 상세 조회
    • 새로운 슬랙 메시지 생성
    • 특정 슬랙 메시지 수정
    • 특정 슬랙 메시지 삭제
  • SlackController (/api/v1/slack-messages)
    • 새로운 슬랙 메시지 생성 (발송)
사용자 (user-service)

User (사용자 관리)

  • UserAdminController (/admin/v1/users)
    • 사용자 회원가입
    • 사용자 로그인
    • 사용자 로그아웃
    • 새로운 사용자 생성
    • 특정 사용자 조회
    • 사용자 목록 전체 조회
    • 특정 사용자 정보 수정
    • 특정 사용자에게 권한 부여
    • 특정 사용자 권한 업데이트
    • 특정 사용자 권한 삭제
    • 특정 사용자 삭제
    • 슬랙 인증 코드 요청
    • 슬랙 인증 코드 확인
  • UserController (/api/v1/users)
    • 사용자 회원가입
    • 사용자 로그인
    • 사용자 로그아웃
    • 특정 사용자 조회
    • 슬랙 인증 코드 요청
    • 슬랙 인증 코드 확인
  • UserFeignClientController (/user-service/users)
    • 역할별 사용자 목록 조회
    • 배송 서비스 요청으로 역할별 사용자 맵 조회
    • 사용자 ID로 역할 조회
    • 사용자 ID로 슬랙 ID 조회
    • 사용자 ID로 사용자 이름 조회

💻 트러블슈팅

  1. Multi‐Stage Build 를 적용한 도커 이미지 경량화

  2. Interceptor와 Annotation을 활용한 각 서비스 API 별 권한 검증

  3. 멀티 모듈 구조 적용

  4. 동시성 제어와 이벤트 리스너 트랜잭션 관리

📦 프로젝트 구동 방법

1. Project 소스 코드를 Clone 합니다.

git clone https://github.com/5ingMaryho/OingLogistics.git

2. /OingLogistics/eureka-service/src/main/resources 경로로 이동 후, application.yml 파일을 생성합니다.

spring:
  config:
    import:
      - classpath:./application-prod.yml
  profiles:
    group:
      prod: prod
    active: prod
  application:
    name: eureka-service

---
spring:
  config.activate.on-profile: prod

3. /OingLogistics/eureka-service/src/main/resources 경로로 이동 후, application-prod.yml 파일을 생성합니다.

server:
  port: 8761

spring:
  application:
    name: eureka-service


eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://localhost:8761/eureka/
  instance:
    hostname: eureka-service

4. /OingLogistics/config-service/src/main/resources 경로로 이동 후, application.yml 파일을 생성합니다.

  • key는 현재 비공개입니다. 필요 시 제공하겠습니다.
server:
  port: 8888

spring:
  application:
    name: config-service

  profiles:
    active: git

  cloud:
    config:
      server:
        git:
          uri: https://github.com/5ingMaryho/Config.git
          clone-on-start: true
          username: {owner_username}
          password: {owner_password}

5. /OingLogistics/gateway-service/src/main/resources 경로로 이동 후, application.yml 파일을 생성합니다.

spring:
  config:
    import: "optional:configserver:http://localhost:8888/"
  profiles:
    active: prod
  application:
    name: gateway-service

6. /OingLogistics 경로에서 docker-compose.yml 파일을 실행합니다.

  • 초기 빌드 시 시간이 소요될 수 있습니다.
docker compose up -d

📝 프로젝트 회고

프로젝트 개선점 및 고도화 계획

  • 주문 - 상품 동시성 제어
  • 분산 환경에서의 데이터 정합성과 부하를 최소화하는 방안을 탐색

협업 시 우리 팀이 잘한 점

  • 문제나 궁금한 점을 바로 공유하고 함께 해결 방법을 고민하며 함께 성장하는 팀 분위기를 만들었습니다.
  • PR 규칙을 정하고 알고 있는 내용, 배운 내용, 고민사항, 설계를 적극적으로 공유하여 팀 전체의 개발 역량을 향상시켰습니다.

협업 시 아쉽거나 부족했던 부분들

  • 트러블 슈팅 기록과 오류 정리를 체계화해 유사한 문제가 발생했을 때 원인 파악과 해결 시간을 단축하고자 합니다.
  • API 구현 및 새로운 기술에 대한 러닝커브로 예상보다 많은 시간이 소요되어 테스트 코드 작성이나 개발 진행이 지연되었습니다. 깃허브 이슈 관리를 통해, 이런 상황을 최소화하고자 노력했습니다.

Popular repositories Loading

  1. OingLogistics OingLogistics Public

    MSA(Microservices Architecture) 기반의 B2B 물류 관리 플랫폼

    Java 1 1

  2. .github .github Public

Repositories

Showing 2 of 2 repositories

Top languages

Loading…

Most used topics

Loading…