Skip to content

feat: 발주처 상세 조회 기능 추가#42

Merged
JoonKyoLee merged 4 commits intomainfrom
feat/vendor-detail
Nov 21, 2025
Merged

feat: 발주처 상세 조회 기능 추가#42
JoonKyoLee merged 4 commits intomainfrom
feat/vendor-detail

Conversation

@JoonKyoLee
Copy link
Contributor

@JoonKyoLee JoonKyoLee commented Nov 21, 2025

✨ 작업 내용

  • 발주처 상세 조회 기능 추가

📝 적용 범위

  • /vendor

📌 참고 사항

Summary by CodeRabbit

  • New Features

    • 발주처 상세 조회 기능 추가: 인증된 사용자가 특정 발주처의 상세 정보를 조회할 수 있는 새로운 엔드포인트 제공. 접근 제어를 통해 보안성 확보.
  • Tests

    • 발주처 상세 조회의 성공 케이스 및 예외 상황(존재하지 않는 발주처, 접근 권한 없음)에 대한 테스트 케이스 추가.

✏️ Tip: You can customize this high-level summary in your review settings.

@JoonKyoLee JoonKyoLee self-assigned this Nov 21, 2025
@JoonKyoLee JoonKyoLee added the enhancement New feature or request label Nov 21, 2025
@coderabbitai
Copy link

coderabbitai bot commented Nov 21, 2025

Walkthrough

발주처 상세 조회 기능을 구현합니다. API 엔드포인트, 서비스 로직, 성공 메시지 상수를 추가하고 단위 테스트를 작성했습니다. 다만 테스트 코드에 중복 삽입이 발견됩니다.

Changes

Cohort / File(s) Summary
성공 메시지 상수 추가
src/main/java/com/almang/inventory/global/api/SuccessMessage.java
GET_VENDOR_DETAIL_SUCCESS enum 상수 추가
발주처 조회 엔드포인트
src/main/java/com/almang/inventory/vendor/controller/VendorController.java
GET /api/v1/vendor/{vendorId} 엔드포인트 추가, 인증 사용자 기반으로 서비스 호출
발주처 상세 조회 로직
src/main/java/com/almang/inventory/vendor/service/VendorService.java
getVendorDetail() 메서드 추가: 사용자/발주처 로드, 접근 제어, VendorResponse 반환
컨트롤러 테스트
src/test/java/com/almang/inventory/vendor/controller/VendorControllerTest.java
조회 성공, 존재하지 않는 발주처 예외 테스트 2개 추가 (중복 삽입됨)
서비스 테스트
src/test/java/com/almang/inventory/vendor/service/VendorServiceTest.java
조회 성공, 존재하지 않는 발주처 예외, 접근 제어 예외 테스트 3개 추가 (중복 삽입됨)

Sequence Diagram

sequenceDiagram
    participant Client
    participant Controller
    participant Service
    participant UserRepo
    participant VendorRepo
    
    Client->>Controller: GET /api/v1/vendor/{vendorId}
    Controller->>Service: getVendorDetail(vendorId, userId)
    Service->>UserRepo: findById(userId)
    UserRepo-->>Service: User
    Service->>VendorRepo: findByIdAndUserId(vendorId, userId)
    alt 접근 권한 있음
        VendorRepo-->>Service: Vendor
        Service->>Service: 로그 기록
        Service-->>Controller: VendorResponse
        Controller-->>Client: ApiResponse (GET_VENDOR_DETAIL_SUCCESS)
    else 접근 권한 없음
        VendorRepo-->>Service: Optional.empty()
        Service-->>Controller: ✗ VENDOR_NOT_FOUND
        Controller-->>Client: ApiResponse (Error)
    end
Loading

Estimated Code Review Effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

주의 필요한 영역:

  • 테스트 코드 중복: VendorControllerTest에서 2개 테스트가 파일 내 두 번 삽입되어 있습니다. VendorServiceTest에서도 3개 테스트가 중복으로 나타납니다. 빌드 시 중복 메서드 정의 오류가 발생할 것으로 예상되므로 즉시 정정 필요합니다.
  • 접근 제어 로직: VendorService.getVendorDetail()에서 사용자의 가게만 접근 가능하도록 하는지 확인하세요. findByIdAndUserId 구현 세부사항 검토 추천.
  • 테스트 커버리지: 성공 경로와 예외 경로는 잘 커버되었으나, 정상 데이터 검증(vendorId, name, channel 등)과 권한 검증이 명확히 구분되어 있는지 확인하세요.

Possibly Related PRs

Poem

🏭 발주처를 자세히 들여다보니,
접근 제어도 빈틈없고 좋네요!
다만 테스트 친구들이 쌍둥이가 되어버렸으니—
중복을 정리하면 더 완벽한 코드가 될 거예요. ✨

Pre-merge checks and finishing touches

❌ Failed checks (2 warnings)
Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning 테스트 파일에서 동일한 테스트 메서드가 중복으로 추가되었으며, 이는 의도된 변경사항이 아닌 것으로 보입니다. VendorControllerTest.java와 VendorServiceTest.java에서 중복된 테스트 메서드를 제거하세요. 각 테스트는 한 번만 선언되어야 합니다.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목 '발주처 상세 조회 기능 추가'는 변경사항의 핵심인 새로운 vendor detail 조회 엔드포인트 구현을 명확하게 요약합니다.
Description check ✅ Passed PR 설명이 템플릿 구조를 따르고 있으며, 작업 내용, 적용 범위, 참고 사항을 모두 포함하고 있습니다.
Linked Issues check ✅ Passed 변경사항이 linked issue #38의 '발주처 아이디를 통한 상세 조회 기능' 구현 요구사항을 완벽하게 충족합니다.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/vendor-detail

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (4)
src/main/java/com/almang/inventory/vendor/service/VendorService.java (1)

51-58: 조회 로직/트랜잭션 설정 모두 자연스럽습니다

getVendorDetailfindUserByIdfindVendorByIdAndValidateAccess를 재사용해서 권한 검증 플로우가 updateVendor와 동일하게 맞춰진 점이 좋습니다. @Transactional(readOnly = true) 설정도 조회 용도에 적합합니다.

선택 사항으로, 추후 로그 모니터링을 강화하고 싶다면 아래처럼 userId도 같이 남기는 형태를 고려해볼 수 있습니다.

log.info("[VendorService] 발주처 상세 조회 성공 - vendorId: {}, userId: {}", vendor.getId(), user.getId());

지금 구조로도 기능적으로는 문제 없습니다.

src/test/java/com/almang/inventory/vendor/controller/VendorControllerTest.java (1)

239-291: 상세 조회 컨트롤러 테스트 구성이 탄탄합니다 (권한 오류 케이스만 더 있으면 좋겠습니다)

  • 성공 케이스에서 HTTP status, SuccessMessage.GET_VENDOR_DETAIL_SUCCESS, 그리고 data의 각 필드를 모두 검증하고 있어서 회귀 방지에 도움이 됩니다.
  • 존재하지 않는 발주처 케이스에서 ErrorCode.VENDOR_NOT_FOUNDhttpStatus, message, data 부재까지 체크하는 것도 전역 예외 핸들러 계약을 잘 검증하고 있습니다.

개선 제안(선택 사항):

  • 서비스 레벨에서는 이미 VENDOR_ACCESS_DENIED를 검증하고 있으니, 컨트롤러에서도 다른 상점 발주처 상세 조회 시 권한 예외(아마 403) 가 적절히 매핑되는지 검증하는 테스트를 하나 더 추가하면 API 레벨 계약이 더 명확해집니다.
    • 예시: vendorService.getVendorDetailVENDOR_ACCESS_DENIED를 던지도록 stubbing 하고, 컨트롤러 응답이 기대하는 HTTP 코드와 JSON 형태로 변환되는지 확인.
    • 관련 개념은 Spring MVC Test의 예외 처리 테스트 부분(Spring 공식 문서의 “Testing Spring MVC controllers” 장)을 함께 참고해 보시면 좋습니다.

기능 자체는 현재 테스트만으로도 잘 커버되고 있습니다.

src/test/java/com/almang/inventory/vendor/service/VendorServiceTest.java (1)

242-309: 상세 조회 서비스 테스트 3종 세트 구성이 좋습니다

  • 정상 조회 테스트에서 VendorResponse의 각 필드를 엔티티 초기값과 비교해 검증하고 있어, 매핑 로직이 변경되었을 때 바로 감지할 수 있습니다.
  • 존재하지 않는 발주처/다른 상점 발주처 케이스에서 각각 VENDOR_NOT_FOUND, VENDOR_ACCESS_DENIED 메시지를 검증하는 것도 도메인 규칙을 명확히 테스트하고 있습니다.
  • 기존 생성/수정 테스트와 스타일과도 일관돼서 읽기 편합니다.

추가로, 추후 검증 범위를 확장하고 싶다면 AssertJ의 extracting을 사용해 여러 필드를 한 번에 비교하는 패턴도 고려해 볼 수 있습니다. (예: assertThat(response).extracting("name", "channel", ...) 형태 — AssertJ 공식 문서의 “Extracting values” 섹션 참고)

지금 상태로도 테스트 품질은 충분히 좋습니다.

src/main/java/com/almang/inventory/vendor/controller/VendorController.java (1)

17-23: 상세 조회 엔드포인트 구현이 기존 패턴과 잘 맞습니다

  • @GetMapping("/{vendorId}") + @AuthenticationPrincipal CustomUserPrincipal 조합이 기존 POST/PATCH 메서드와 동일한 스타일이라, 클라이언트/보안 설정 모두에서 예측 가능성이 높습니다.
  • 컨트롤러에서 userId만 추출하고 나머지 검증은 Service(getVendorDetail)에 위임하는 구조도 계층 분리가 잘 되어 있습니다.
  • 응답은 ApiResponse.success(SuccessMessage.GET_VENDOR_DETAIL_SUCCESS.getMessage(), response)로 다른 API들과 동일한 포맷을 유지하고 있어 프런트엔드 입장에서도 사용성이 좋겠습니다.

선택 사항으로, Swagger 문서에서 “발주처 상세 조회”라는 summary에 맞춰 description을 조금 더 구체적으로(예: “발주처 상세 정보를 조회하고, 현재 로그인한 사용자의 상점에 속한 발주처만 조회 가능합니다.”) 적어 두면 권한 제약 사항을 API 문서만 보고도 이해할 수 있어 도움이 됩니다. 이는 OpenAPI 문서화 가이드(예: summary/description 역할 분리)에 잘 맞는 패턴입니다.

기능/구현 자체는 그대로 사용해도 무방해 보입니다.

Also applies to: 65-78

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 53a3090 and 54ec85d.

📒 Files selected for processing (5)
  • src/main/java/com/almang/inventory/global/api/SuccessMessage.java (1 hunks)
  • src/main/java/com/almang/inventory/vendor/controller/VendorController.java (2 hunks)
  • src/main/java/com/almang/inventory/vendor/service/VendorService.java (1 hunks)
  • src/test/java/com/almang/inventory/vendor/controller/VendorControllerTest.java (2 hunks)
  • src/test/java/com/almang/inventory/vendor/service/VendorServiceTest.java (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-11-20T10:43:47.489Z
Learnt from: JoonKyoLee
Repo: almang2/inventory-server PR: 33
File: src/main/java/com/almang/inventory/product/domain/Product.java:62-66
Timestamp: 2025-11-20T10:43:47.489Z
Learning: In the almang2/inventory-server repository, Product entity update methods (e.g., updateVendor in src/main/java/com/almang/inventory/product/domain/Product.java) do not require null checks on vendor parameters because ProductService validates vendor existence via findVendorByIdAndValidateAccess before calling update methods, and the vendor field has nullable=false constraint ensuring this.vendor is never null for persisted entities.

Applied to files:

  • src/main/java/com/almang/inventory/vendor/controller/VendorController.java
  • src/main/java/com/almang/inventory/vendor/service/VendorService.java
  • src/test/java/com/almang/inventory/vendor/service/VendorServiceTest.java
  • src/test/java/com/almang/inventory/vendor/controller/VendorControllerTest.java
🔇 Additional comments (2)
src/main/java/com/almang/inventory/global/api/SuccessMessage.java (1)

30-37: 발주처 상세 조회 성공 메시지 추가, 일관성 좋습니다

GET_VENDOR_DETAIL_SUCCESS("발주처 상세 조회 성공") 상수가 기존 패턴(도메인별 구분 + 한글 메시지)과 잘 맞고, 컨트롤러/테스트에서도 동일하게 참조되고 있어 유지보수성 측면에서 깔끔합니다. 별도 수정 필요는 없어 보입니다.

src/test/java/com/almang/inventory/vendor/controller/VendorControllerTest.java (1)

9-10: GET 테스트용 import 추가 적절합니다

MockMvcRequestBuilders.get 정적 import 추가가 아래 상세 조회 테스트에서 자연스럽게 사용되고 있고, 기존 post, patch와 동일한 패턴이라 괜찮습니다.

@JoonKyoLee JoonKyoLee merged commit 1bb19ba into main Nov 21, 2025
1 check passed
@JoonKyoLee JoonKyoLee deleted the feat/vendor-detail branch November 21, 2025 19:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEAT] 발주처 상세 조회 기능 구현

1 participant