Conversation
Walkthrough입고(Receipt) 엔티티의 삭제 방식을 변경합니다. 기존 활성화 상태 플래그 기반에서 Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20-25 minutes
Possibly related PRs
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (2)
src/main/java/com/almang/inventory/receipt/service/ReceiptService.java (2)
251-251:deletedAt(null)명시적 설정은 선택적입니다.
LocalDateTime필드의 기본값은null이므로 생략 가능하지만, 코드 가독성 측면에서 명시적으로 작성한 것은 괜찮습니다. 취향의 영역입니다. 🤷
287-298:deletedAt수동 체크가@Where어노테이션과 중복됩니다.
Receipt엔티티에@Where(clause = "deleted_at IS NULL")가 적용되어 있으므로,findById()호출 시 삭제된 레코드는 자동으로 필터링되어Optional.empty()가 반환됩니다. 따라서 Lines 291-293의 수동 체크는 일반적으로 도달하지 않습니다.권장 사항:
@Where를 신뢰한다면 수동 체크 제거 고려- 또는 Native Query 등
@Where가 적용되지 않는 케이스에 대한 방어 코드로 유지현재 구조에서는 방어적 코딩으로 볼 수 있으나, Receipt.java의
@SQLDelete어노테이션 문제와 함께 soft-delete 전략을 통일하는 것이 좋겠습니다.#!/bin/bash # Description: Check if there are native queries or other methods that might bypass @Where clause # Search for native queries or custom repository methods related to Receipt echo "=== Checking for native queries or custom repository methods ===" rg -n "@Query.*nativeQuery.*true" --type=java echo "" echo "=== Checking ReceiptRepository methods ===" ast-grep --pattern 'interface ReceiptRepository { $$$ }'
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (3)
src/main/java/com/almang/inventory/receipt/domain/Receipt.java(3 hunks)src/main/java/com/almang/inventory/receipt/service/ReceiptService.java(3 hunks)src/test/java/com/almang/inventory/receipt/service/ReceiptServiceTest.java(2 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-11-22T18:12:13.172Z
Learnt from: JoonKyoLee
Repo: almang2/inventory-server PR: 66
File: src/main/java/com/almang/inventory/order/domain/OrderItem.java:41-53
Timestamp: 2025-11-22T18:12:13.172Z
Learning: In the almang2/inventory-server repository, OrderItem entity update methods (updateQuantity, updatePrice in src/main/java/com/almang/inventory/order/domain/OrderItem.java) do not require null checks because OrderService will validate parameters before calling these update methods, following the same pattern as Product entity updates.
<!--
Applied to files:
src/test/java/com/almang/inventory/receipt/service/ReceiptServiceTest.java
🔇 Additional comments (3)
src/main/java/com/almang/inventory/receipt/domain/Receipt.java (1)
73-83:delete()메서드 로직이 잘 구현되었습니다.상태 검증 후
deletedAt,activated,status를 함께 설정하여 기존 로직과의 하위 호환성을 유지합니다. 마이그레이션 기간 동안 안전한 접근 방식입니다. 👍src/test/java/com/almang/inventory/receipt/service/ReceiptServiceTest.java (1)
882-889: 테스트 로직이 새로운 soft-delete 흐름에 맞게 잘 수정되었습니다.
DeleteReceiptResponse를 통한 성공 여부 확인과 삭제된 입고 조회 시 예외 발생 검증이 적절합니다.@Where어노테이션으로 인해 삭제된 레코드는 자동 필터링되어RECEIPT_NOT_FOUND예외가 발생합니다. 깔끔! ✨src/main/java/com/almang/inventory/receipt/service/ReceiptService.java (1)
145-145:receipt.delete()호출이 올바르게 적용되었습니다.
deactivate()에서delete()로의 메서드명 변경이 의도를 더 명확하게 표현합니다.
| @SQLDelete(sql = "UPDATE receipts SET deleted_at = NOW() WHERE receipt_id = ?") | ||
| @Where(clause = "deleted_at IS NULL") |
There was a problem hiding this comment.
@SQLDelete 어노테이션이 실제로 사용되지 않습니다.
@SQLDelete는 JPA의 EntityManager.remove() 또는 CrudRepository.delete(entity) 호출 시에만 트리거됩니다. 현재 ReceiptService.deleteReceipt()는 receipt.delete() 도메인 메서드를 호출하여 필드만 설정하므로, @SQLDelete가 실행되지 않습니다.
두 가지 접근 방식 중 하나를 선택하세요:
- 도메인 메서드 방식 유지:
@SQLDelete어노테이션 제거 (현재 로직에서 불필요) - JPA 방식 사용:
receiptRepository.delete(receipt)호출로 변경하고, 도메인delete()메서드에서deletedAt설정 제거
@Where 어노테이션은 조회 시 삭제된 레코드를 자동 필터링하므로 유지하면 좋습니다.
참고: Hibernate Soft Delete 공식 문서
🤖 Prompt for AI Agents
In src/main/java/com/almang/inventory/receipt/domain/Receipt.java around lines
23-24, the @SQLDelete annotation is unused because delete logic calls the domain
method receipt.delete() instead of EntityManager/Repository.delete(), so remove
the @SQLDelete line, keep the @Where(clause = "deleted_at IS NULL") to continue
filtering soft-deleted rows, and ensure any imports related only to @SQLDelete
are removed; alternatively, if you prefer the JPA approach, change
ReceiptService.deleteReceipt() to call receiptRepository.delete(receipt) and
remove the domain delete() setter, but do not keep both patterns.
✨ 작업 내용
📝 적용 범위
/receipt📌 참고 사항
Summary by CodeRabbit
릴리스 노트
새로운 기능
개선사항
✏️ Tip: You can customize this high-level summary in your review settings.