POJO 테스트로 변환 과제
아래 OrderService를 POJO테스트를 위해 변환하고 테스트코드를 작성해보세요
@Service
@RequiredArgsConstructor
public class OrderService {
private final OrderRepository orderRepository;
private final OrderLineRepository orderLineRepository;
private final ProductRepository productRepository;
@Transactional
public Order create(OrderCreateRequest request) {
// 주문 생성
Order order = orderRepository.save(new Order(request.getTotalPrice()));
// 주문 요청한 상품의 ID 리스트
List<Long> productIds = request.getOrderLines().stream()
.map(OrderLineRequest::getProductId)
.toList();
// 주문 요청한 상품 리스트 조회
List<Product> products = productRepository.findByIdIn(productIds);
// DB에 존재하지 않는 상품 ID 가 있을 경우
if (products.size() != productIds.size()) {
throw new RuntimeException("존재하지 않는 상품은 주문할 수 없습니다 !");
}
List<OrderLine> orderLineList = new ArrayList<>();
for (Product product : products) {
for (OrderLineRequest olr : request.getOrderLines()) {
if (product.getId() == olr.getProductId()) {
// 상품 구매 처리 (판매 수 up, 재고 down)
product.purchased(olr.getAmount());
// 주문 상세 내역 생성
orderLineList.add(new OrderLine(order, product, olr.getAmount()));
}
}
}
orderLineRepository.saveAll(orderLineList);
return order;
}
}
https://github.com/MinWoo1995/spring-unit-test
GitHub - MinWoo1995/spring-unit-test
Contribute to MinWoo1995/spring-unit-test development by creating an account on GitHub.
github.com
TIL: 객체 양방향 연관관계 중복 등록 트러블슈팅
1. 문제 상황
현상: POJO 단위 테스트 중 OrderLine 리스트의 사이즈가 예상값(1)보다 큰 값(2)으로 조회되며 테스트 실패.
에러 로그: Expected size: 1 but was: 2 in: [OrderLine@58cf8f94, OrderLine@58cf8f94]
특이사항: 동일한 객체 주소값(@58cf8f94)이 리스트에 두 번 포함됨.
2. 원인 분석
엔티티 로직: OrderLine 생성자 내부에서 부모 객체인 Order의 리스트에 자기 자신을 추가하는 order.addOrderline(this)가 호출됨.
서비스/도메인 로직: Order 엔티티의 createOrderLines 메서드에서 OrderLine을 생성한 후, 다시 한번 this.orderLines.add(orderLine)을 호출함.
결과: 하나의 OrderLine 객체가 생성되면서 한 번, 메서드에서 명시적으로 한 번, 총 두 번 부모 리스트에 담기게 됨.
3. 해결 방안
수정 사항: OrderLine 생성자 내부에 있던 order.addOrderline(this); 로직을 주석 처리(또는 삭제).
이유: Order 엔티티가 OrderLine들을 생성하고 관리하는 도메인 서비스의 역할을 하고 있으므로, Order에서 명시적으로 리스트를 관리하는 것이 흐름 파악에 더 직관적임.
4. 새롭게 알게 된 점
POJO 테스트의 가치: 만약 DB 테스트만 진행했다면 JPA의 고아 객체 보호나 중복 방지 로직 덕분에 DB에는 1건만 저장되어 문제를 발견하지 못했을 수 있음. 하지만 순수 자바 객체 테스트를 통해 메모리상의 객체 상태 불일치를 조기에 발견함.
양방향 매핑의 주의점: 양방향 연관관계 편의 메서드는 편리하지만, 생성자와 도메인 로직 양쪽에서 호출될 경우 의도치 않은 중복이 발생할 수 있음을 체감함.
'spring_2기[본캠프] > 과제' 카테고리의 다른 글
| [과제] 결제 시스템 Day6 (0) | 2026.02.12 |
|---|---|
| [과제] 결제 시스템 Day5 (0) | 2026.02.11 |
| [과제] 결제 시스템 Day5 (0) | 2026.02.10 |
| [과제] 결제 시스템 Day4 (0) | 2026.02.09 |
| [과제] 결제 시스템 Day3 (0) | 2026.02.06 |