| 항목 | 내용 |
|---|---|
| 프로젝트명 | BARI(바리) |
| 서비스명 | inventory-service |
| 서비스 유형 | 유통기한 임박 상품 할인 픽업 플랫폼 |
| 개발 기간 | 2026.03.18 ~ 2026.03.25 |
| 개발 인원 | 6명 / inventory-service 담당 |
| 담당 역할 | 재고 도메인 백엔드 API, 서비스 간 통신, Kafka 재고 차감, 배포 설정 구현 |
| 사용 기술 | Java 17, Spring Boot 3.4.3, Spring Web, Spring Data JPA, Spring Security, OpenFeign, Kafka, MariaDB, Swagger, Docker, Kubernetes, Gradle Multi-project, Lombok |
| 플랫폼 | Web Backend / MSA |
BARI는 동네 매장의 유통기한 임박 상품을 사용자가 예약하고 픽업할 수 있도록 돕는 할인 픽업 플랫폼입니다.
inventory-service는 상품별 재고 수량, 가격, 유통기한, 메모를 관리하는 재고 도메인 서비스입니다. 매장 관리자는 상품에 연결된 재고를 등록, 조회, 수정, 삭제할 수 있고, 주문 서비스는 재고 수량을 확인한 뒤 Kafka 이벤트를 통해 재고 차감을 요청합니다.
또한 할인 서비스가 재고 존재 여부와 상품별 재고 목록을 확인할 수 있도록 내부 API를 제공하고, 유통기한 만료 및 임박 재고를 조회하는 기능을 통해 할인/주문 흐름의 기반 데이터를 담당합니다.
| 기능 | 설명 |
|---|---|
| 재고 등록 | product-service와 OpenFeign으로 상품 존재 여부를 검증한 뒤 재고 생성 |
| 상품별 재고 조회 | 상품 ID 기준으로 삭제되지 않은 재고 목록 조회 |
| 재고 수정 | 수량, 가격, 유통기한, 메모 수정 및 음수 수량 검증 |
| 재고 삭제 | 실제 삭제 대신 deletedAt을 기록하는 soft delete 처리 |
| 만료 재고 처리 | 유통기한이 지난 재고를 일괄 soft delete 처리 |
| 유통기한 임박 조회 | 현재 시점부터 3일 이내 만료 예정인 재고 목록 조회 |
| 매장별 재고 조회 | inventories와 products를 조인해 매장 재고와 상품 정보를 함께 반환 |
| 재고 존재 확인 API | discount-service에서 할인 등록 전 재고 유효성을 확인할 수 있는 API 제공 |
| 내부 재고 목록 API | discount-service가 여러 productId의 재고를 한 번에 조회할 수 있는 내부 API 제공 |
| Kafka 재고 차감 | order.reserved 토픽을 구독해 주문 예약 수량만큼 재고 차감 |
| 인증 헤더 연동 | API Gateway가 주입한 X-User-Id, X-User-Role 기반 인증 처리 및 Feign 요청 헤더 전달 |
| 배포 설정 | Dockerfile, Kubernetes Deployment/Service/Secret 구성 |
문제 상황
재고는 주문, 할인, 매장 관리 화면에서 함께 참조되기 때문에 삭제 시 즉시 물리 삭제하면 다른 서비스와의 참조 관계가 깨질 수 있습니다. 또한 삭제된 재고가 일반 조회나 주문 가능 재고에 포함되지 않도록 일관된 필터링이 필요했습니다.
해결 방법
Inventory 엔티티가 BaseTimeEntity를 상속하도록 구성하고, deletedAt 값을 기준으로 활성/삭제 상태를 구분했습니다. 삭제 요청은 inventory.softDelete()로 처리하고, 조회 Repository 메서드는 deletedAt이 null인 데이터만 반환하도록 분리했습니다.
구현 포인트