장바구니 오류 해결
장바구니에 상품을 추가하면 사용자 목록을 조회하면 발생하는 오류를 해결하고 장바구니에 새로운 상품을 추가하면 Lazy 로딩에서 오류가 발생하는 현상을 해결했다.
@Transactional
public void addBasket(User user, Item item){
Optional<Basket> findBasket = basketRepository.findOneByItem(item.getId());
if (!findBasket.isEmpty()){
log.info("1111");
Basket basket = findBasket.get();
int count = basket.getCount() + 1;
basket.setCount(count);
basketRepository.save(basket);
}
else {
log.info("2222");
Basket basket = Basket.createBasket(user, item, item.getPrice(), 1);
basketRepository.save(basket);
}
}
위 코드 때문에 아래와 같은 오류가 발생해서 고생 좀 했다. 위 코드처럼 @Transactional을 붙였는데도 레이지 로딩에서 오류가 발생해서 이것저것 실험해보다가 이게 영속성 컨텍스트와 관련이 있는 것을 알았는데 @Transactional 어노테이션이 있으면 해당 메소드 안에서 객체를 가져와야 영속성 컨텍스트에 저장되서 오류없이 작업을 진행할 수 있다고 이해할 수 있겠다. createBasket 함수의 인자인 user, item 2 객체를 처음에 입력받아서 사용했는데 이렇게 사용하면 @Transactional 밖에서 가져온 데이터가 되므로 user, item 객체대신 itemId, userId 만 받아서 안에서 객체를 직접 조회하면 오류가 발생하지 않는다.
LazyInitializationException: could not initialize proxy - no session
정상적인 코드는 아래와 같다.
@Transactional
public void addBasket(Long userId, Long itemId){
Optional<Basket> findBasket = basketRepository.findOneByItem(itemId);
User user = userRepository.findOne(userId);
Item item = itemRepository.findOne(itemId);
if (!findBasket.isEmpty()){
Basket basket = findBasket.get();
int count = basket.getCount() + 1;
basket.setCount(count);
basketRepository.save(basket);
}
else {
Basket basket = Basket.createBasket(user, item, item.getPrice(), 1);
basketRepository.save(basket);
}
}
'웹 개발 > 맨땅에 헤딩 프로젝트' 카테고리의 다른 글
스프링 데이터 JPA 업그레이드 시작 (0) | 2022.04.26 |
---|---|
주문기능 추가 (0) | 2022.04.24 |
장바구니 기능 추가 (0) | 2022.03.04 |
로그인 필터 기능 추가 (0) | 2022.03.04 |
로그아웃 기능 및 쿠키 세션 기능 추가 (0) | 2022.02.27 |
댓글