inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

738

214321i3424

작성한 질문수 2

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);
        });
    }

spring springboot jpa

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 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); // 이 줄이 빠져 있습니다.
}

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

섹션3. 11 회원객체 다이어그램

0

15

1

OCP, DIP과 @Qualifier 어노테이션에 대해서 질문합니다.

0

19

1

강의 연장 요청

0

17

1

설정 정보 없이 임베디드 데이터베이스 생성

0

15

1

형 이번에 낸 책이랑 강의 내용에 차이가 있어?

1

36

1

형 나 몰래 책내면 모를 줄 알고?

1

30

1

OrderServiceTest 상문주문 테스트 시 update 쿼리 문의

0

21

1

N+1 관련해서 질문있습니다.

0

33

3

강의 중복 확인 요청

0

26

1

벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?

0

28

2

중복내용 제보?!

1

48

2

여러 파드 환경에서 단일 실행 보장 방식

0

28

2

inheritance startegy 선택시 고려사항

0

22

1

Entity 동등성 비교

0

21

1

패키지 구분에 대해 궁금한게 있습니다

0

27

2

스프링부트 서버 에러나요

0

26

1

코드 자료

0

53

2

조회속도 개선에서 더 개선하는 방법이 궁금합니다.

0

44

2

servlet과 container에 대한 질문입니다

0

31

1

RepositoryTest의 패키지 위치가 domain인 이유

0

37

2

도메인 모델에서 관계와 규칙을 구분하는 방법

0

58

2

16 강의 메세지 retryCount의 의도

0

31

2

JPA Repository 질문이 있습니다!

1

41

2

페이지네이션 처리를 쿼리에서 하는 방식 질문

1

39

1