JPA Update 반영이 되지 않습니다.
759
작성한 질문수 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); // 이 줄이 빠져 있습니다.
}
위 내용을 수정하시면 문제를 해결할 수 있을 것 같아요. 참고하시기 바랍니다.
JpaPagingItemReader는 좋은게 없는거야..??
0
34
1
리프레시토큰
0
42
1
DB 연결 후 회원가입 시 생성되는 id 번호 질문
0
40
1
로그인 확인
0
66
3
서비스에서와 컨트롤러의 @Vaild 적용 차이에 대해서
0
67
2
해결했습니다
0
51
1
copilot-instruction.md
0
46
2
지금 강의가 어려우신분 추천드립니다.
0
72
1
기존의 완성된 CRUD의 Build.gradle에 security관련 dependency를 추가하면 문제가 생깁니다.
0
73
2
"폴더를 찾을 수 없습니다." 라는 응답만 계속 나옵니다.
0
58
1
EmailSender 관련 문의
0
68
1
CRA ? 질문입니다
0
65
1
[해결됨]마지막 강의 내용 수정 화면이 기능을 못하네요.
0
59
1
[해결됨]부분적으로 화면 이동이 안되는 부분이 있습니다.
0
93
6
aws 계정 생성 질문
1
89
1
조회 메서드 네이밍 질문
0
82
1
Properties 설정이 추가되었는데
0
45
1
음성불량
0
61
1
isInterrupted 질문 있다.
0
42
1
fieldInjectionTest() 질문
0
68
1
AutoAppConfig의 존재이유
0
58
1
장애 격리 관련해서 궁금한 부분이 있어요
0
68
2
RunIdIncrementer batch 5랑 6랑
1
76
2
AppConfig와 스프링 빈 질문
0
63
1





