🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

JPA Update 반영이 되지 않습니다.

23.04.10 10:26 작성 23.04.10 12:18 수정 조회수 509

0

안녕하세요! JPA를 사용해서 간단한 장바구니 프로젝트를 진행하고 있습니다.

장바구니에 들어있는 아이템의 수량을 수정하는 테스트코드를 작성하고 있었습니다.
수정할 장바구니아이템 자체는 수정이 되었지만, 장바구니에 들어있는 수정을 요청한 아이템은 수량이 반영되지 않았습니다.

혹시 연관관계나 영속성 문제인가 싶어서 게시판<-> 댓글로 테스트코드를 짜보았는데, 게시판 <-> 댓글 테스트코드는 성공하였습니다. 혹시 어떤 문제인지 알 수 있을까요?

 

아래는 장바구니와 장바구니아이템 연관관계 입니다!

@Entity
@Table(name = "tbl_cart")
public class Cart {
    @Id
    @Column(name = "cart_id", columnDefinition = "BINARY(16)")
    private final UUID id = UlidCreator.getMonotonicUlid().toUuid();

    ...

    @OneToMany(mappedBy = "cart", fetch = FetchType.LAZY)
    private final List<CartItem> cartItems = new ArrayList<>();

    protected Cart() {
    }

    private Cart(User user) {
        this.user = user;
    }

    public static Cart create(User user) {
        return new Cart(user);
    }

    public void addCartItem(CartItem cartItem) {
        cartItems.add(cartItem);
    }

   ...
}
@Entity
@Table(name = "tbl_cart_item")
public class CartItem {
    @Id
    @Column(name = "cart_item_id", columnDefinition = "BINARY(16)")
    private final UUID id = UlidCreator.getMonotonicUlid().toUuid();

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "cart_id")
    private Cart cart;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "item_id")
    private Item item;

    @Column(name = "amount")
    private int amount;

    protected CartItem() {
    }

    private CartItem(Cart cart, Item item, int amount) {
        this.cart = cart;
        this.item = item;
        this.amount = amount;
    }

    public static CartItem create(Cart cart, Item item, int amount) {
        return new CartItem(cart, item, amount);
    }

    ...
}

 

아래는 장바구니아이템의 수량을 수정하는 로직입니다!

@Transactional
@Override
    public void updateCartItemAmount(UUID userId, CartCommand.UpdateCartItemAmount command) {
        User user = userRepository.getUser(userId);
        Cart cart = cartRepository.getCart(user);
        cart.validateHasSameUser(user);

        CartItem cartItem = cartItemRepository.getCartItem(command.cartItemId());
        cartItem.updateAmount(command.amount());
    }

 

아래는 실패한 테스트코드 입니다!

@DisplayName("장바구니 아이템의 수량을 변경한다.")
    @Test
    void 장바구니_아이템의_수량을_변경한다() {
        //given
        cartService.addCartItem(user.getId(), CART_아이템_요청);

        //when
        Cart cart = cartRepository.findByUserId(user.getId())
                .orElseThrow(CartNotFoundException::new);
        CartItem cartItem = cartItemRepository.findByCartAndItem(cart, item)
                .orElseThrow(CartItemNotFoundException::new);

        CartCommand.UpdateCartItemAmount CART_아이템_수량_변경_요청 = CartCommand.UpdateCartItemAmount.builder()
                .cartItemId(cartItem.getId())
                .amount(3)
                .build();
        cartService.updateCartItemAmount(user.getId(), CART_아이템_수량_변경_요청);

        Cart actual = cartRepository.findByUserId(user.getId())
                .orElseThrow(CartNotFoundException::new);
        assertAll(() -> {
            assertThat(cartItem.getAmount()).isEqualTo(3);
            assertThat(actual.getCartItems().get(0).getAmount()).isEqualTo(3);
        });
    }

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.05.24

안녕하세요, 인프런 AI 인턴이에요.

장바구니 아이템의 수량을 수정하는 로직에서 아래와 같이 cartItemRepository.update(cartItem) 메소드가 빠져있는 것 같습니다. 따라서 수정된 내용이 DB에 반영되지 않고 메모리상에서만 수정된 것처럼 동작할 수 있습니다.

@Transactional
@Override
public void updateCartItemAmount(UUID userId, CartCommand.UpdateCartItemAmount command) {
    User user = userRepository.getUser(userId);
    Cart cart = cartRepository.getCart(user);
    cart.validateHasSameUser(user);

    CartItem cartItem = cartItemRepository.getCartItem(command.cartItemId());
    cartItem.updateAmount(command.amount());

    cartItemRepository.update(cartItem); // 이 줄이 빠져 있습니다.
}

위 내용을 수정하시면 문제를 해결할 수 있을 것 같아요. 참고하시기 바랍니다.

채널톡 아이콘