JPA Update 반영이 되지 않습니다.
752
작성한 질문수 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); // 이 줄이 빠져 있습니다.
}
위 내용을 수정하시면 문제를 해결할 수 있을 것 같아요. 참고하시기 바랍니다.
HelloSpringApplication.java 클래스 실행 오류
0
5
1
build 시 에러 해결방법 공유(docker.desktop 업데이트 -> 의존성 버전 수정)
0
16
1
Inner class로 Config를 지정하는 이유
0
21
1
네이버 API | '검색 - 책' API 제공 중단
0
37
2
Part 2 듣기전 복습하던 중, 아키텍처에 관한 질문이 있습니다.
0
44
2
장치 의존성과 CSR
0
35
1
테스트는 인터페이스를 대상으로 만드는것에 대해 궁금한 점이 있습니다.
0
30
1
[영한님]Spring Boot 및 프로젝트 생성
0
52
2
리뉴얼 시기
0
46
2
JPA 엔티티로 만들었다고 기술종속이 아닌지에 대한 질문
0
54
3
강의 요청 문의
0
39
2
클로드코드 명령어-대화&세션관리 수업 자료
0
42
1
PlatformTransactionManager, ResourcelessTransactionManager 질문
1
66
2
자료 한번에 다운받기
0
33
1
스프링 빈 등록 방법 2가지 다 알아야하는 이유
0
59
1
mybatis 를 이용한 crud에서 insert에서 resultType='long" 이라고 하셨는데요,
0
27
1
설계 트레이드 오프 링크 접속 안됨
0
85
2
테스트 질문, 어떤것을 사용할것인것에 대해서
0
46
1
깃허브주소 궁금합니다.
0
36
2
mariaDB 설정
0
33
1
섹션4 퀴즈 오타있어요.
0
46
1
service-discovery 프로세스 가동 이유
0
50
1
AWS 배포 성능테스트
0
75
2
퀴즈가 안열려요
0
75
2





