Skip to content

πŸ›Β Fix: κ΅¬λ§€μ œμ•ˆ μ±„νŒ…λ°© 생성 - #406

Merged
Chungs0604 merged 1 commit into
developfrom
fix/404-μ±„νŒ…λ°©μƒμ„±μˆ˜μ •
Aug 13, 2026

Hidden character warning

The head ref may contain hidden characters: "fix/404-\ucc44\ud305\ubc29\uc0dd\uc131\uc218\uc815"
Merged

πŸ›Β Fix: κ΅¬λ§€μ œμ•ˆ μ±„νŒ…λ°© 생성#406
Chungs0604 merged 1 commit into
developfrom
fix/404-μ±„νŒ…λ°©μƒμ„±μˆ˜μ •

Conversation

@Chungs0604

Copy link
Copy Markdown
Collaborator

πŸ”— κ΄€λ ¨ 이슈

πŸ“Œ μž‘μ—… λ‚΄μš©

  • 판맀 등둝(Product) 없이 ꡬ맀 μ œμ•ˆ(PurchaseOffer)만으둜 μ‹œμž‘λœ μ±„νŒ…λ°© 생성/쑰회 지원
  • ꡬ맀 μ œμ•ˆ 수락(ACCEPTED) 후에도 μ±„νŒ…λ°© 생성 κ°€λŠ₯ν•˜λ„λ‘ μˆ˜μ •
  • PurchaseOffer 기반 κ±°λž˜λŠ” Productκ°€ μ—†λŠ” μ„€κ³„μ΄λ―€λ‘œ, μ±„νŒ…λ°© μ‘λ‹΅μ—μ„œ product κ΄€λ ¨ ν•„λ“œ
    nullable 처리

πŸ“Œ λ³€κ²½λœ API

  • POST /chats β€” productStatus, price, productId ν•„λ“œ nullable λ³€κ²½
    • 판맀 등둝 μ—†λŠ” μ•„μ΄ν…œ + ꡬ맀 μ œμ•ˆ(SENT/ACCEPTED)인 경우 μ„Έ ν•„λ“œ null λ°˜ν™˜
  • GET /chats/{chatRoomId} β€” λ™μΌν•˜κ²Œ productStatus, price, productId nullable λ³€κ²½

πŸ“Œ ν…ŒμŠ€νŠΈ κ²°κ³Ό

  • ON_SALE μƒν’ˆ β†’ μ±„νŒ…λ°© 생성 200 βœ…
  • HIDDEN μƒν’ˆ + SENT offer β†’ μ±„νŒ…λ°© 생성 200 βœ…
  • 판맀 등둝 μ—†λŠ” μ•„μ΄ν…œ + SENT offer β†’ μ±„νŒ…λ°© 생성 200, product ν•„λ“œ null βœ…
  • 판맀 등둝 μ—†λŠ” μ•„μ΄ν…œ + ACCEPTED offer β†’ μ±„νŒ…λ°© 생성/쑰회 200, product ν•„λ“œ null βœ…
  • offer μ—†κ³  ON_SALE/TRADING도 μ•„λ‹˜ β†’ 409 βœ…
  • SOLD μƒν’ˆ + offer β†’ 409 βœ…
  • μ±„νŒ…λ°© λͺ©λ‘ β€” λͺ¨λ“  μΌ€μ΄μŠ€ 정상 λ…ΈμΆœ βœ…

πŸ“Œ 확인 ν•„μš” 사항

  • ν”„λ‘ νŠΈμ—”λ“œ: productStatus, price, productId null 처리 ν•„μš”
    • productId null β†’ μƒν’ˆ 상세 링크 λ―Έλ…ΈμΆœ
    • price null β†’ 가격 ν‘œμ‹œ λ―Έλ…ΈμΆœ λ˜λŠ” 별도 처리

βœ… 체크리슀트

  • κΈ°λŠ₯ μš”κ΅¬μ‚¬ν•­μ„ μΆ©μ‘±ν–ˆλŠ”κ°€?
  • API 응닡 ν˜•μ‹μ΄ ν†΅μΌλ˜μ–΄ μžˆλŠ”κ°€?
  • μ˜ˆμ™Έ 상황이 적절히 μ²˜λ¦¬λ˜μ—ˆλŠ”κ°€?
  • 인증/인가 검증이 λˆ„λ½λ˜μ§€ μ•Šμ•˜λŠ”κ°€?
  • Entityλ₯Ό 직접 μ‘λ‹΅ν•˜μ§€ μ•Šμ•˜λŠ”κ°€?
  • 쀑볡 μ½”λ“œκ°€ κ³Όλ„ν•˜μ§€ μ•Šμ€κ°€?
  • λ©”μ„œλ“œμ™€ 클래슀의 역할이 λͺ…ν™•ν•œκ°€?
  • ν…ŒμŠ€νŠΈκ°€ ν•„μš”ν•œ 핡심 λ‘œμ§μ— ν…ŒμŠ€νŠΈκ°€ μž‘μ„±λ˜μ—ˆλŠ”κ°€?

@github-actions

Copy link
Copy Markdown

Gemini 파일 λ‹¨μœ„ μš”μ•½ 리뷰

src/main/java/com/tenure/domain/purchase/repository/PurchaseOfferRepository.java

λ³€κ²½ μš”μ•½

  • μ œμ•ˆμž ID, μ†Œμœ μž ID, μ•„μ΄ν…œ ID 및 μƒνƒœ λͺ©λ‘(statuses)을 쑰건으둜 ꡬ맀 μ œμ•ˆ(PurchaseOffer)의 쑴재 μ—¬λΆ€λ₯Ό ν™•μΈν•˜λŠ” existsByProposerIdAndOwnerIdAndItemIdAndStatusIn λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.

영ν–₯ λ²”μœ„

  • κΈ°λŠ₯ 및 흐름: "ꡬ맀 μ œμ•ˆμ€ μ‚¬μš©μžλ‹Ή μ•„μ΄ν…œλ³„ 1회 μ œν•œ" 정책을 κ²€μ¦ν•˜κΈ° μœ„ν•΄, 기쑴에 μ œμ•ˆν•œ 이λ ₯(νŠΉμ • μƒνƒœκ°’λ“€μ„ κ°€μ§„ 이λ ₯)이 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ— 영ν–₯을 μ€λ‹ˆλ‹€.
  • 계측: μ˜μ†μ„±(Repository) 계측 및 이λ₯Ό ν˜ΈμΆœν•˜λŠ” μ„œλΉ„μŠ€(Service) 계측에 영ν–₯을 μ€λ‹ˆλ‹€.

확인 ν•„μš”

  • μ—†μŒ

μ œμ•ˆ

  • μ„±λŠ₯ μ΅œμ ν™”λ₯Ό μœ„ν•œ @Query 제거 및 쿼리 λ©”μ„œλ“œ ν™œμš©:
    ν˜„μž¬ μž‘μ„±λœ @Query("select count(po) > 0 ...") 방식은 DBμ—μ„œ 쑰건에 λ§žλŠ” λͺ¨λ“  λ ˆμ½”λ“œλ₯Ό μΉ΄μš΄νŠΈν•˜λ―€λ‘œ 데이터가 λ§Žμ•„μ§ˆ 경우 μ„±λŠ₯ μ €ν•˜ μš°λ €κ°€ μžˆμŠ΅λ‹ˆλ‹€. Spring Data JPAλŠ” existsBy... 넀이밍을 μ§€μ›ν•˜λ©°, 이λ₯Ό μ‚¬μš©ν•˜λ©΄ λ‚΄λΆ€μ μœΌλ‘œ LIMIT 1을 μ‚¬μš©ν•˜λŠ” 효율적인 EXISTS 쿼리λ₯Ό μžλ™ μƒμ„±ν•©λ‹ˆλ‹€. λ”°λΌμ„œ μ•„λž˜μ™€ 같이 @Query μ–΄λ…Έν…Œμ΄μ…˜μ„ μ œκ±°ν•˜κ³  Spring Data JPA의 κΈ°λ³Έ 쿼리 λ©”μ„œλ“œ κΈ°λŠ₯을 ν™œμš©ν•˜λŠ” 것을 μ œμ•ˆν•©λ‹ˆλ‹€.
    boolean existsByProposerIdAndOwnerIdAndItemIdAndStatusIn(
            Long proposerId,
            Long ownerId,
            Long itemId,
            Collection<PurchaseOfferStatus> statuses);

src/main/java/com/tenure/domain/chat/service/ChatRoomService.java

λ³€κ²½ μš”μ•½

  • ꡬ맀 μ œμ•ˆ(Purchase Offer) 쑴재 μ—¬λΆ€ 검증 μ‹œ, 단일 μƒνƒœ(SENT) μ‘°νšŒμ—μ„œ 볡수 μƒνƒœ(SENT, ACCEPTED) 쑴재 μ—¬λΆ€(existsBy...) 확인 λ°©μ‹μœΌλ‘œ 쿼리λ₯Ό μ΅œμ ν™”ν•˜κ³  λŒ€μƒμ„ ν™•μž₯ν–ˆμŠ΅λ‹ˆλ‹€.
  • 판맀 등둝이 λ˜μ§€ μ•Šμ€ μ•„μ΄ν…œ(Productκ°€ null인 μƒνƒœ)μ—μ„œλ„ μ±„νŒ…λ°©μ„ μƒμ„±ν•˜κ±°λ‚˜ μ§„μž…ν•  수 μžˆλ„λ‘, productRepository.findByItemId() κ²°κ³Όκ°€ 없을 λ•Œ μ˜ˆμ™Έλ₯Ό λ˜μ§€λŠ” λŒ€μ‹  null을 λ°˜ν™˜ν•˜λ„λ‘ μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.
  • productκ°€ null일 λ•Œ λ°œμƒν•  수 μžˆλŠ” NullPointerException을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ μ‚Όν•­ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•œ λ°©μ–΄ μ½”λ“œλ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.

영ν–₯ λ²”μœ„

  • κΈ°λŠ₯: μ œμ•ˆ(Offer) 기반의 μ±„νŒ…λ°© 생성/쑰회(findOrCreateChatRoom) 및 μ±„νŒ…λ°© μ§„μž…(enterChatroom) 흐름
  • 계측: Service λ ˆμ΄μ–΄ (ChatRoomService) 및 Repository λ ˆμ΄μ–΄ (PurchaseOfferRepository, ProductRepository)
  • μ‹€ν–‰ 흐름: 판맀 등둝(Product) 없이 μ•„μ΄ν…œλ§Œ μ‘΄μž¬ν•˜λŠ” μƒνƒœμ—μ„œ μ œμ•ˆμ„ 톡해 μ±„νŒ…λ°©μœΌλ‘œ μ§„μž…ν•˜λŠ” λΉ„μ¦ˆλ‹ˆμŠ€ 흐름 지원

확인 ν•„μš”

  • findOrCreateChatRoom λ©”μ„œλ“œ λ‚΄μ—μ„œ productκ°€ null이 될 수 μžˆλ„λ‘ 변경됨에 따라, diff에 λ…ΈμΆœλ˜μ§€ μ•Šμ€ ν•΄λ‹Ή λ©”μ„œλ“œμ˜ ν•˜μœ„ λΌμΈμ—μ„œ product 객체의 λ©”μ„œλ“œ(예: product.getId(), product.getSeller())λ₯Ό 직접 ν˜ΈμΆœν•˜μ—¬ NullPointerException이 λ°œμƒν•  μœ„ν—˜μ΄ μ—†λŠ”μ§€ 전체 λ©”μ„œλ“œ 바디에 λŒ€ν•œ 검증이 ν•„μš”ν•©λ‹ˆλ‹€.

μ œμ•ˆ

  • purchaseOfferRepository.existsByProposerIdAndOwnerIdAndItemIdAndStatusIn 호좜 μ‹œ μ‚¬μš©λ˜λŠ” List.of(SENT, ACCEPTED)λŠ” 자주 λ³€κ²½λ˜μ§€ μ•ŠλŠ” μƒνƒœ κ·Έλ£Ήμ΄λ―€λ‘œ, μ„œλΉ„μŠ€ 클래슀 내에 private static final List<PurchaseOfferStatus> ACTIVE_OFFER_STATUSES = List.of(SENT, ACCEPTED);와 같이 μƒμˆ˜λ‘œ μ„ μ–Έν•˜μ—¬ μž¬μ‚¬μš©μ„±κ³Ό 가독성을 λ†’μ΄λŠ” 것을 μ œμ•ˆν•©λ‹ˆλ‹€.

src/main/java/com/tenure/domain/chat/dto/response/ChatRoomResponse.java

λ³€κ²½ μš”μ•½

  • ChatRoomResponse.from 정적 νŒ©ν† λ¦¬ λ©”μ„œλ“œ λ‚΄μ—μ„œ product 객체에 λŒ€ν•œ Null-Safe 처리 μΆ”κ°€
  • productκ°€ null일 경우 productStatus, price, productId ν•„λ“œλ₯Ό null둜 μ„€μ •ν•˜μ—¬ NullPointerException λ°©μ§€

영ν–₯ λ²”μœ„

  • μ±„νŒ…λ°© 정보λ₯Ό λ°˜ν™˜ν•˜λŠ” API 응닡 생성 흐름
  • μƒν’ˆ(Product)이 아직 λ“±λ‘λ˜μ§€ μ•Šμ€ μ•„μ΄ν…œ(Item) 기반 μ±„νŒ…λ°© 쑰회 κΈ°λŠ₯

확인 ν•„μš”

  • ChatRoomResponse μƒμ„±μžμ˜ νŒŒλΌλ―Έν„° 쀑 price와 productIdκ°€ μ›μ‹œ νƒ€μž…(int, long)이 μ•„λ‹Œ 래퍼 νƒ€μž…(Integer, Long)으둜 μ •μ˜λ˜μ–΄ μžˆλŠ”μ§€ 확인이 ν•„μš”ν•©λ‹ˆλ‹€. λ§Œμ•½ μ›μ‹œ νƒ€μž…μœΌλ‘œ μ •μ˜λ˜μ–΄ μžˆλ‹€λ©΄, null 전달 μ‹œ μ–Έλ°•μ‹± κ³Όμ •μ—μ„œ NullPointerException이 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ œμ•ˆ

  • μƒν’ˆμ΄ μ—†λŠ” μ±„νŒ…λ°©(예: 일반 μ•„μ΄ν…œ 문의 λ“±)이 λΉ„μ¦ˆλ‹ˆμŠ€ μš”κ΅¬μ‚¬ν•­μƒ 정상적인 μΌ€μ΄μŠ€μΈμ§€ μž¬ν™•μΈν•˜κ³ , λ§Œμ•½ 항상 μƒν’ˆμ΄ μ‘΄μž¬ν•΄μ•Ό ν•˜λŠ” ꡬ쑰라면 null 처리λ₯Ό ν•˜κΈ°λ³΄λ‹€λŠ” 이전 단계(μ„œλΉ„μŠ€ λ ˆμ΄μ–΄)μ—μ„œ 검증 μ˜ˆμ™Έλ₯Ό λ˜μ§€λŠ” 것이 μ•ˆμ „ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@Chungs0604
Chungs0604 merged commit cf26d5f into develop Aug 13, 2026
2 checks passed
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.

2 participants