본문 바로가기
웹 개발/맨땅에 헤딩 프로젝트

Lazy Initialization Exception 해결

by L3m0n S0ju 2022. 3. 9.

장바구니 오류 해결

 

https://github.com/Lemon-soju/Java_Sping_Shop_Project_01/commit/69138576a948a873fd6d22a249bb3605bdd72190

 

Merge pull request #18 from Lemon-soju/slave-01 · Lemon-soju/Java_Sping_Shop_Project_01@6913857

Resolve Basket Error

github.com

 

장바구니에 상품을 추가하면 사용자 목록을 조회하면 발생하는 오류를 해결하고 장바구니에 새로운 상품을 추가하면 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);
    }
}

 

댓글