Skip to content

[3주차] DAO가 적용된 cart app#4

Open
songtov wants to merge 3 commits intodal-lab:mainfrom
songtov:third-week-cart-app
Open

[3주차] DAO가 적용된 cart app#4
songtov wants to merge 3 commits intodal-lab:mainfrom
songtov:third-week-cart-app

Conversation

@songtov
Copy link

@songtov songtov commented Dec 27, 2024

Summary by CodeRabbit

  • New Features

    • MongoDB 통합 기능 추가
    • 장바구니 관리 기능을 위한 CartService 클래스 도입
    • 장바구니 및 품목 DTO 클래스 추가
    • 새로운 제품 및 장바구니 항목을 추가하는 API 엔드포인트 구현
  • Bug Fixes

    • 장바구니의 총 가격 계산 로직 개선
  • Tests

    • CartServiceCartController에 대한 단위 테스트 추가
    • 입력 데이터 유효성 검사를 위한 테스트 케이스 추가
  • Documentation

    • application.yaml에 MongoDB 관련 구성 추가

@coderabbitai
Copy link

coderabbitai bot commented Dec 27, 2024

개요

Walkthrough

이 풀 리퀘스트는 MongoDB 통합을 위한 포괄적인 변경 사항을 포함하고 있습니다. 프로젝트에 MongoDB 드라이버를 추가하고, 장바구니 서비스를 구현하며, 데이터 액세스 객체(DAO)를 통해 데이터베이스와 상호작용하는 기능을 도입했습니다. 컨트롤러, 서비스, 모델 계층에 걸쳐 새로운 클래스와 메서드가 추가되었습니다.

Changes

파일 변경 요약
build.gradle.kts MongoDB 드라이버 의존성 추가
Application.java MongoDB 클라이언트 및 데이터베이스 빈 구성
CartService.java 장바구니 관리 서비스 추가
CartController.java 장바구니 세부정보 엔드포인트 업데이트
LineItemController.java 제품 추가 로직 구현
application.yaml MongoDB 연결 설정 추가

Sequence Diagram

sequenceDiagram
    participant Client
    participant LineItemController
    participant CartService
    participant LineItemDAO
    participant ProductDAO
    participant MongoDB

    Client->>LineItemController: 제품 추가 요청
    LineItemController->>CartService: addProduct()
    CartService->>ProductDAO: 제품 조회
    ProductDAO-->>CartService: 제품 정보
    CartService->>LineItemDAO: 라인 아이템 저장/업데이트
    LineItemDAO->>MongoDB: 데이터 저장
Loading

Poem

🐰 몽고DB의 마법, 장바구니 춤을 추네
데이터는 흐르고, 서비스는 노래해
코드의 토끼가 뛰어다니며
제품을 담고, 가격을 세어
개발의 즐거움이 여기 있네! 🛒✨

Tip

CodeRabbit's docstrings feature is now available as part of our Early Access Program! Simply use the command @coderabbitai generate docstrings to have CodeRabbit automatically generate docstrings for your pull request. We would love to hear your feedback on Discord.


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

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: 4

🧹 Nitpick comments (18)
src/main/java/com/example/demo/controllers/CartController.java (1)

31-39: LineItem을 DTO로 변환하는 전용 메서드
mapToDto(LineItem lineItem) 메서드를 통해 변환 로직을 명확히 분리한 것은 유지보수에 유리합니다. 필요하다면, 향후 권장되는 방식으로 ModelMapper 같은 라이브러리를 고려할 수도 있습니다.

src/main/java/com/example/demo/controllers/dtos/CartDto.java (1)

5-18: 금액 자료형 및 확장성 고려
CartDtoLineItemDto에서 가격을 int로 처리하고 있는데, 추후 금액 단위를 세분화하거나 소수점 처리가 필요한 경우를 대비해 BigDecimal 같은 타입을 고려해 볼 수 있습니다.

src/main/java/com/example/demo/models/Product.java (1)

3-25: 도메인 모델 설계 적절
Product 클래스가 id, name, price로 간결하게 구성되어 있어 사용 목적이 명확합니다. 다만 향후 통화 처리가 복잡해질 가능성이 있다면 priceBigDecimal 등을 사용하는 방향도 고려해 보세요.

src/main/java/com/example/demo/Application.java (2)

9-9: **Bean 등록 관련 안내 **
MongoDB 클라이언트와 데이터베이스를 Bean으로 등록하여 Spring 컨테이너에서 관리하는 접근 방식은 적절합니다. 다만, 이후 테스트 환경 또는 로컬/운영 환경 분리를 위해, 외부 설정 파일/프로필로 분리하는 방법도 고려해 보시면 유지 보수에 도움이 될 것입니다.


24-30: **MongoDatabase Bean 구현 단순화 **
mongoDatabase Bean은 mongoClient.getDatabase(database) 호출만 포함하여 간단하지만, 추후에 데이터베이스 이름이 동적으로 변하는 경우에 대비해야 할 수도 있습니다. 설정이 바뀌는 경우 재시작이 필요하므로 유연한 설정 방안을 고려해 보세요.

src/main/java/com/example/demo/infrastructure/ProductDAO.java (2)

11-14: **DAO 컴포넌트 네이밍 **
ProductDAO 클래스이지만, 실제로 line_items 컬렉션을 사용하는 점이 살짝 혼동을 줄 수 있습니다. 컬렉션 이름과 DAO 명칭이 일치하거나, 의미에 맞춰 분리하는 방안을 검토해 보세요.


29-33: **Document에서 Product 생성 시 필드 누락 검증 **
document.getString("name") 또는 document.getInteger("price") 값이 없는 경우, null 반환 등 예상치 못한 이슈가 발생할 수 있습니다. 컬렉션에 필드가 항상 존재하도록 제약이 있다면 괜찮지만, 방어적 코드를 추가하는 것도 안전합니다.

src/main/java/com/example/demo/controllers/LineItemController.java (1)

18-20: **CartService 주입 **
Controller에서 Service를 직접 주입받아 사용하는 구조는 전형적인 계층 구조입니다. 향후 ProductDAO 등 추가 의존성이 있으면 Service 레벨에서 일괄 처리하므로 Controller의 복잡도를 줄일 수 있습니다.

src/test/java/com/example/demo/MongoTest.java (2)

18-19: **DB 접속 정보 하드코딩 **
테스트 코드에서도 URL, DB 이름을 프로퍼티로 분리하면 환경 설정별 테스트가 용이해집니다. 하드코딩된 값 대신 @TestPropertySource 등 적용을 권장합니다.


30-39: **단위 테스트 vs. 통합 테스트 **
컬렉션에 직접 접근해 데이터를 가져오는 구조이므로, 이 테스트는 실제 DB에 의존하는 통합 테스트입니다. 향후 CI/CD 환경에서 DB 전략이 필요하니, TestContainers나 임베디드 MongoDB 사용을 검토해 보세요.

src/test/java/com/example/demo/controllers/CartControllerTest.java (1)

12-13: List import와 공백 처리
List 자료구조 사용 시 컬렉션 초기화 방식이 올바른지, 필요 없는 공백 라인이 있는지 확인해주세요.

src/main/java/com/example/demo/models/LineItem.java (3)

40-42: getProductName() 메서드
상품 명을 동적으로 갱신하고 있으니, DB나 캐시에 변경이 생겼을 때 어떻게 대응할지 검토 필요합니다.


48-50: setQuantity() 메서드
setter를 활용해 수량을 변경할 수 있으므로, CartService와의 유기적 동작이 중요합니다.


56-58: setProductName() 메서드
DB의 상품명을 라인 아이템에서 수정하는 경우, 캐싱/일관성 문제가 없도록 주의해야 합니다.

src/main/java/com/example/demo/infrastructure/LineItemDAO.java (1)

41-47: add(LineItem lineItem)
LineItem의 ID를 자동으로 할당하려는 의도가 보이며, product_id, quantity 필드만 반영되고 있습니다. 추가 필드(productName, unitPrice, totalPrice)도 저장이 필요한지 검토해주세요.

src/main/java/com/example/demo/application/CartService.java (1)

27-48: getCart() 메서드
LineItem 목록을 가져온 뒤, 각 아이템에 대해 상품 정보를 enrich하여 totalPrice를 계산하는 로직이 핵심입니다. productDAO.find() 호출 오류나 null 리턴 가능성 등에 대한 에러 처리를 고려해볼 수 있습니다.

src/test/java/com/example/demo/controllers/LineItemControllerTest.java (1)

20-21: MockBean 사용 시 주의사항
@MockBean으로 선언한 CartService를 테스트 내에서 실제로 호출하여 검증할 수 있습니다. 필요 시 when/then 패턴을 통해 모의 객체의 행위를 정의해주세요.

src/test/java/com/example/demo/application/CartServiceTest.java (1)

65-77: 오탈자 및 테스트 설명 주의
@DisplayName("장바구니가 있는 상풍 총 가격은 0이다.")에서 '상풍'은 '상품'의 오탈자로 보입니다. 문서를 통해 의도를 명확히 표현하는 편이 좋습니다.

- @DisplayName("장바구니가 있는 상풍 총 가격은 0이다.")
+ @DisplayName("장바구니가 있는 상품 총 가격은 0이다.")
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9ff8df4 and f5cc551.

📒 Files selected for processing (17)
  • build.gradle.kts (1 hunks)
  • src/main/java/com/example/demo/Application.java (1 hunks)
  • src/main/java/com/example/demo/application/CartService.java (1 hunks)
  • src/main/java/com/example/demo/controllers/CartController.java (1 hunks)
  • src/main/java/com/example/demo/controllers/LineItemController.java (1 hunks)
  • src/main/java/com/example/demo/controllers/dtos/AddProductToCartDto.java (1 hunks)
  • src/main/java/com/example/demo/controllers/dtos/CartDto.java (1 hunks)
  • src/main/java/com/example/demo/infrastructure/LineItemDAO.java (1 hunks)
  • src/main/java/com/example/demo/infrastructure/ProductDAO.java (1 hunks)
  • src/main/java/com/example/demo/models/Cart.java (1 hunks)
  • src/main/java/com/example/demo/models/LineItem.java (1 hunks)
  • src/main/java/com/example/demo/models/Product.java (1 hunks)
  • src/main/resources/application.yaml (1 hunks)
  • src/test/java/com/example/demo/MongoTest.java (1 hunks)
  • src/test/java/com/example/demo/application/CartServiceTest.java (1 hunks)
  • src/test/java/com/example/demo/controllers/CartControllerTest.java (1 hunks)
  • src/test/java/com/example/demo/controllers/LineItemControllerTest.java (3 hunks)
🔇 Additional comments (50)
src/main/java/com/example/demo/controllers/CartController.java (3)

3-7: 신규 임포트와 의존성 연결이 명확합니다.
MongoDB 연동과 DTO, 모델 접근에 필요한 임포트를 잘 추가하셨습니다.


14-18: 생성자 주입 방식 사용
CartService를 생성자에서 주입하는 방식은 의존성 주입 원칙을 잘 지키고 있습니다. 테스트가 용이하고 유지보수성이 높아집니다.


22-29: Cart 반환 로직 점검
detail() 메서드에서 CartDto를 직접 생성하여 반환하는 로직이 깔끔합니다. 다만 cartService.getCart()null을 반환할 가능성에 대한 에러 처리를 검토해 보시기 바랍니다.

src/main/java/com/example/demo/controllers/dtos/AddProductToCartDto.java (1)

6-12: 필드 유효성 검증이 잘 적용되었습니다.
@NotBlank, @Positive 등의 애노테이션을 활용해 DTO에서 기본적인 검증을 수행하는 점이 좋습니다.

src/main/java/com/example/demo/models/Cart.java (1)

6-22: 바깥에서 컬렉션을 변경할 수 없도록 방어적 접근이 잘 되어 있습니다.
Collections.unmodifiableList(lineItems)로 반환하여 불변성을 보장하는 점이 좋습니다. 금액 역시 동적으로 변경될 가능성이 있다면 업데이트 로직도 함께 고려해 보시는 것을 권장합니다.

src/main/java/com/example/demo/Application.java (2)

3-5: **MongoDB 드라이버 임포트 확인 **
MongoDB 관련 클래스를 불러오는 코드가 정상적으로 추가되었습니다. 의존성 역시 build.gradle.kts에 잘 반영되어 있어 보입니다.


17-22: **MongoClient Bean 구현 점검 **
mongoClient Bean이 URL 문자열에서 바로 생성되는데, 환경 변수나 설정 파일 값이 올바르지 않을 경우 연결 오류가 발생할 수 있습니다. 프로필별로 URL을 다르게 설정할 때 문제없이 동작하는지 확인이 필요해 보입니다.

src/main/java/com/example/demo/infrastructure/ProductDAO.java (2)

15-17: **생성자에서의 컬렉션 초기화 **
MongoDatabase에서 컬렉션을 가져오는 코드 흐름이 명확합니다. 컬렉션 사용이 간단히 이해되며 적절하게 초기화되었습니다.


25-27: **문서가 없을 때 null 반환 **
조회 결과가 없으면 단순히 null을 반환하는 로직입니다. 이후 로직에서 null 접근을 방어하고 있는지 확인해 주세요.

src/main/java/com/example/demo/controllers/LineItemController.java (2)

3-5: **서비스 클래스 및 DTO 연결 **
CartServiceAddProductToCartDto를 활용하는 구조가 명확하며, 의존성 주입 방식도 적절해 보입니다.


24-30: **HTTP 요청 DTO 유효성 검증 **
@Valid 처리로 DTO 필드에 대해 검증할 수 있지만, productId가 유효한 ObjectId 형식인지 확인할 필요가 있습니다. DTO에서 형식만 확인하거나, Service에서 예외를 처리하는 로직이 있는지 점검해 보세요.

src/test/java/com/example/demo/MongoTest.java (1)

21-25: **MongoClient 리소스 관리 **
테스트 수행 후 client.close()가 호출되지 않습니다. 잠재적으로 연결이 남을 수 있으므로, 테스트 완료 시점에 리소스를 정리해 주는 것이 좋습니다.

src/test/java/com/example/demo/controllers/CartControllerTest.java (6)

3-4: 의존성 주입 관련 import 추가 확인
새로운 CartService와 Cart 클래스를 테스트에서 활용하기 위해 import가 추가되었습니다. 테스트 코드와 연동이 올바르게 동작하도록 확인해주세요.


9-9: MockBean 사용으로 테스트 격리
CartService를 MockBean으로 선언하여 테스트 범위를 Controller 계층에 집중시킨 점이 적절해 보입니다.


14-15: 테스트에서의 정적 메서드 import
Hamcrest와 MockMvc에서 제공하는 정적 메서드를 명시적으로 import해 코드 가독성을 개선한 점이 좋습니다.

Also applies to: 17-17


25-27: CartService 목 객체 주입
테스트 중 CartService의 동작을 모의하기 위한 MockBean 선언이 적절합니다. 향후 서비스 내부 로직 변경 시 유연하게 대응 가능해 보입니다.


31-33: 테스트 더미 데이터 생성
Cart 객체를 List.of()와 0으로 초기화해 간단한 상태를 확인하는 용도로 쓰는 방식이 깔끔합니다.


35-38: Cart 응답 내용 검증
응답 본문 내 lineItems 필드 존재 여부를 검증함으로써 Controller와 Service의 연동을 간단히 확인할 수 있어 좋습니다.

src/main/java/com/example/demo/models/LineItem.java (10)

3-4: DB 스키마와 유사한 구조
LineItem 클래스가 DB 스키마처럼 설계되어 있어서 도메인 모델에 대한 이해가 용이해집니다.


5-11: 필드 정의
id, productId, quantity, productName, unitPrice, totalPrice 등의 필드가 명확히 구분되어 있어, 각 항목을 체계적으로 관리할 수 있습니다.


13-16: 생성자 1: 필수 필드만
특정 상황에서 id 없이 productId와 quantity만으로 객체를 생성할 수 있도록 만들어 다양한 시나리오를 지원하는 점이 좋습니다.


18-22: 생성자 2: id 포함
id를 외부에서 주입받아 객체를 구성할 수 있으므로, DB 조회 후 재활용하는 경우 등에 유용해 보입니다.


24-26: getId() 메서드
id가 null일 수도 있으므로, 사용하는 곳에서 null 여부를 주의 깊게 살펴야 합니다.


28-30: getProductId() 메서드
제품 식별자 필드 반환. 현재 코드상에서는 별다른 추가 처리 없이 단순 조회 기능만 있음을 확인했습니다.


32-34: getQuantity() 메서드
수량을 읽는 메서드로, 재고 연동 시 주의가 필요할 수 있으니 향후 확장 가능성을 염두에 두세요.


36-38: getTotalPrice() 메서드
totalPrice 필드는 setter를 통해만 갱신되는 구조이므로, 로직상 무결성 유지가 잘 될지 확인이 필요합니다.


44-46: getUnitPrice() 메서드
상품 단가 확인. 재고 연동이나 할인 로직이 추가될 경우 함께 검토해야 합니다.


61-63: setUnitPrice() 메서드
동일하게 단가를 임의로 변경 시 DB와의 불일치가 발생할 가능성을 고려해야 합니다.

src/main/java/com/example/demo/infrastructure/LineItemDAO.java (5)

1-2: DAO 패키지 구조
infrastructure 패키지에 DAO를 위치시켜 도메인 로직에서의 분리를 명확히 하였습니다.


3-11: 필수 의존성 import
MongoDB 관련 라이브러리를 활발히 사용하고 있으며, Spring @component로 IOC 컨테이너에 등록된 점이 확인되었습니다.


19-21: MongoDB 컬렉션 설정
생성자에서 line_items 컬렉션을 지정하여, DAO 내에서 일관성 있게 컬렉션을 다룰 수 있습니다.


23-31: findAll() 메서드
문서 목록을 조회 후 스트림을 통해 LineItem으로 매핑하는 방식이 비교적 깔끔하며, mapToModel을 잘 활용하고 있습니다.


33-39: mapToModel() 메서드
MongoDB 문서에서 _id, product_id, quantity를 안전하게 추출해 LineItem으로 변환합니다. id 변환과정에서 ObjectId → String 변환이 문제없는지 검증이 필요합니다.

src/main/java/com/example/demo/application/CartService.java (3)

12-13: 서비스 레이어 주석 및 의미
@service 어노테이션으로 CartService가 스프링 컨텍스트에 관리되는 빈이 되었으며, Cart 기능을 담당하는 주요 로직이 이곳에 모입니다.


16-17: LineItemDAO와 ProductDAO
서로 다른 DAO를 주입받아 한 서비스를 구성하는 구조로, 장바구니 로직에서 다양한 데이터 소스에 접근할 수 있게 되어 있습니다.


19-25: CartService 생성자
DI 컨테이너에서 DAO 구현체가 주입되어 테스트나 확장에 유리한 구조입니다.

src/test/java/com/example/demo/controllers/LineItemControllerTest.java (4)

3-3: CartService 임포트 확인
테스트에서 CartService를 주입받아 기능을 검증할 수 있도록 적절히 임포트되었습니다.


8-8: MockBean 적절성
@MockBean 애너테이션을 통해 CartService를 테스트 환경에서 모의 객체로 주입받도록 설정했습니다. Spring Boot Test 구성과 잘 맞습니다.


38-53: 입력 값 검증 테스트(유효하지 않은 productId)
빈 문자열로 넘어온 productId에 대해서 400 Bad Request가 예상대로 반환되는지 확인하는 테스트 케이스입니다. 컨트롤러 수준에서 유효성 검증이 올바르게 동작함을 보장합니다.


55-69: 입력 값 검증 테스트(유효하지 않은 quantity)
수량이 1보다 작은(예: 0) 경우를 테스트하여 컨트롤러가 400 Bad Request를 반환하는지 확인합니다. 올바른 유효성 검증 로직을 잘 확인하고 있습니다.

src/test/java/com/example/demo/application/CartServiceTest.java (8)

1-22: CartServiceTest 클래스 생성 확인
MongoDB DAO를 모의 객체로 사용하여 CartService를 테스트하는 구조는 적절합니다. 테스트 범위가 명확히 설정되어 좋습니다.


24-37: 테스트 데이터 초기화 주의
Product 인스턴스들의 기본 속성과 가격을 설정하는 부분이 명확히 표현되어 있습니다. 테스트 간 의존관계가 없도록 BeforeEach에서 잘 초기화해주셨습니다.


52-63: totalPriceIsZero 테스트
장바구니가 비어 있을 때 총 가격이 0인지 확인하는 테스트입니다. 예외 상황이나 추가 조건이 없는지 계속 주시해주세요.


78-95: 여러 상품 추가 시 총액 계산
여러 LineItem이 존재할 때 총합 계산 로직을 검증하는 테스트입니다. product1, product2의 가격 및 수량을 각각 확인한 후 합산을 검증하는 점이 명확하여 좋습니다.


97-112: 빈 장바구니에 상품 추가 테스트
비어있는 장바구니에 상품이 추가되는지 확인하는 테스트로, lineItemDAO.add()를 검증합니다.


114-131: 이미 존재하는 상품의 수량 업데이트 테스트
동일한 상품이 장바구니에 이미 존재할 때 수량이 업데이트되는 로직을 올바르게 검증하고 있습니다.


133-151: 새로운 상품 장바구니 추가 테스트
기존 장바구니에 다른 상품이 있을 때 새 상품이 LineItem으로 추가되는지 검증합니다.


153-162: 헬퍼 메서드 구조화
clearCart()addProductToCart() 유틸 메서드를 통해 테스트 중복을 줄이는 것은 유지보수에 유리합니다.

src/main/resources/application.yaml (1)

2-7: MongoDB 설정 추가 확인
application.yaml에 MongoDB 연결 설정(url, database)이 잘 구성되었습니다. 로컬 환경에서 데이터베이스 접속 시 정상 동작 여부를 확인해주세요.

build.gradle.kts (1)

22-23: MongoDB 드라이버 의존성 추가
mongodb-driver-coremongodb-driver-sync 의존성이 잘 추가되었습니다. 로컬 환경 및 CI 환경에서 호환성을 확인해보세요.

Comment on lines +20 to +23
public Product find(String productId) {
Document document = collection.find(
Filters.eq("_id", new ObjectId(productId))
).first();
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

**ObjectId 변환 예외 처리 필요성 **
new ObjectId(productId) 호출 시, 잘못된 형식의 문자열이 들어오면 예외가 발생할 수 있습니다. 예외 처리를 통해 사용자 입력 검증이 필요합니다.

 public Product find(String productId) {
-    Document document = collection.find(
-            Filters.eq("_id", new ObjectId(productId))
-    ).first();
+    ObjectId objectId;
+    try {
+        objectId = new ObjectId(productId);
+    } catch (IllegalArgumentException e) {
+        // 잘못된 ObjectId 형식 처리
+        return null;
+    }
+    Document document = collection.find(Filters.eq("_id", objectId)).first();
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
public Product find(String productId) {
Document document = collection.find(
Filters.eq("_id", new ObjectId(productId))
).first();
public Product find(String productId) {
ObjectId objectId;
try {
objectId = new ObjectId(productId);
} catch (IllegalArgumentException e) {
// 잘못된 ObjectId 형식 처리
return null;
}
Document document = collection.find(Filters.eq("_id", objectId)).first();

Comment on lines +52 to +54
public void setTotalPrice(int totalPrice) {
this.totalPrice = totalPrice;
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

setTotalPrice() 메서드
totalPrice는 모델 관점에서는 계산값이므로, setter 사용 시 혹시 모를 동기화 이슈나 중복 계산을 주의해주세요.

Comment on lines +50 to +58
public void update(LineItem lineItem) {
collection.updateOne(
Filters.eq("_id", new ObjectId(lineItem.getId())),
Updates.combine(
Updates.set("product_id", lineItem.getProductId()),
Updates.set("quantity", lineItem.getQuantity())
)
);
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

update(LineItem lineItem)
_id로 문서를 찾아 product_id, quantity 두 필드만 업데이트하는 구조입니다. 필요 시 productName, totalPrice 등 다른 필드들도 고려할 수 있습니다.

Comment on lines +50 to +66
public void addProduct(String productId, int quantity) {
List<LineItem> lineItems = lineItemDAO.findAll();

LineItem lineItem = lineItems.stream()
.filter(i -> i.getProductId().equals(productId))
.findFirst()
.orElse(null);

if (lineItem == null) {
lineItem = new LineItem(productId, quantity);
lineItemDAO.add(lineItem);
return;
}

lineItem.setQuantity(lineItem.getQuantity() + quantity);
lineItemDAO.update(lineItem);
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

addProduct() 메서드
LineItem의 존재 여부를 확인 후 삽입 또는 갱신 로직을 수행하는 구조가 명확합니다. 다만, 동시성(멀티스레드 환경)에서 동일 상품 추가 요청이 겹칠 경우에 대한 처리가 필요할 수 있습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant