JPA Update 반영이 되지 않습니다.
742
작성한 질문수 2
안녕하세요! 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 인턴이에요.
장바구니 아이템의 수량을 수정하는 로직에서 아래와 같이 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); // 이 줄이 빠져 있습니다.
}
위 내용을 수정하시면 문제를 해결할 수 있을 것 같아요. 참고하시기 바랍니다.
강사님 질문 있어요.
0
18
2
RestTemplate과 webClient, RestClient에 대해서 질문드립니다.
0
25
2
회원 도메인 인터페이스 개발
0
26
1
setter 사용하지 않기
0
35
1
세션을 제대로 이해한게 맞는지 궁금합니다
0
23
1
jsp의 상대경로와 Controller에서 반환하는 이름이 달라도 괜찮나요?
0
26
1
안녕하세요 토비님 혹시 완성된 코드의 repository 주소는 없을까요?
0
41
2
자막 오타 제보
0
37
1
운영환경에 적용해볼 수 없을때...고민입니다 ㅠㅠ
0
41
1
rabbitmq에 configservice 연결에 대해 질문있습니다.
0
36
1
빈 스코프 개념의 중요성
0
29
1
트랙잭션 격리수준 선택에 대해서 질문
0
30
1
안녕하세요 치킨 디도스 이벤트 보고 흉내내보려 들어왔습니다..
0
33
2
실무 내용 문의드려요
0
32
2
join에대해 질문드립니다.
0
23
1
코드 질문
0
35
2
To-Do App
0
29
1
twitterdb 연결이 안돼요
1
34
2
SingletonService가 JVM이 뜰 때 생성되는게 맞나요?
0
76
2
임포트 오류
0
42
2
답을언제쯤받아볼수있나요
0
73
2
형 책 어떻게 받아?
1
74
1
@JsonIgnore 이후 Internal Server Error가 발생하지 않습니다.
0
52
3
mvc 패턴 - 적용 강의에서 회원가입할 때 redirect가 아닌 forward인 이유가 궁금합니다.
0
37
1





