public class ProductRestController {
@Autowired
private ProductService productService; // 기존 쓰던거
@RequiredArgsConstructor
public class ProductRestController {
private final ProductService productService; // @RequiredArgsConstructor가 final을 붙힌 생성자를 자동으로 만들어줌
// 그러면 스프링이 자동으로 IOC컨테이너에서 찾아서 넣어줌(빈 생성자가 사라졌으니까)
db에서 찾을 때, where에 pk나 유니크로 찾으면 1건이거나 0건이니까, null 처리해야해서 Optional로 감싸서 주는데,
그냥 전부 찾거나 해서 List로 받을땐, 0건 찾았어도 빈 리스트니까 null은 아니라서 null처리 안해도 됨
application.yml설정
OSIV (Open Session In View)
오픈인뷰
오픈 인 뷰
open-in-view: false (디폴트는 ture, 실무에선 보통 false씀)
면 서비스에서 컨트롤러로 돌아오면 db연결 세션 끊김 그래서 lazy로딩 못찾음
근데 또 true하면
메세지컨버터 순환참조로 무한루프니까
@jsonignore, @jsonignoreproperties 엔티티에 붙여야함
근본적으로 엔티티를 컨트롤러까지 보내지 않고 서비스에서 컨트롤러로 dto를 줬다면 안일어났을 일이다
서비스 클래스에
@Transactional(readOnly = true)
오픈인뷰가 false일 때, 영속성 컨텍스트는 트랜잭션 범위를 벗어나는 순간
Entity는 영속성 컨텍스트의 관리를 받지 않는 준영속 상태가 되어버린다.
Lazy Loading의 동작이 불가능하다는 의미이다.