@NoArgsConstructor(access=Level.PROTECTED)

2023. 11. 26. 17:42기술공부

@NoArgsConstructor = 아무런 매개변수가 없는 생선자를 생성한다.

 

왜 권한을 PROTECTED로 설정했을까??

엔티티의 연관관계에서는 지연 로딩의 경우 실제 엔티티가 아닌 프록시 객체를 통해서 조회를 한다.

-> 연관관계의 엔티티를 조회할때 @OneToMany나 @MantToMany와 같은 연관된 엔티티가 여러개일 경우 사용되는 디폴트 전략이다.

-> 사용법 : @ManyToOne(fetch=FetchType.LAZY)

 

이어서 프록시 객체를 사용하기 위해서 JPA 구현체는, 실제 엔티티의 기본 생성자를 통해서 프록시 객체를 생성하는데, 이때 접근 권한이 private이면 프록시 객체를 생성할 수 없게 된다. -> 즉시 로딩으로 구현하면 프록시 객체가 아닌 실제 엔티티를 생성하므로 문제가 생기지 않는다.

 

예시) List 코드

위와 같이 user_id를 조회해야하는 경우

 

user와 list모두 protected일경우

user의 접근권한이 protected이므로 프록시 객체를 정상정으로 생성하고, user entity값이 필요해질 때 프록시 객체가 초기화해서 실제 entity를 참조해서 값을 가져온다.

 

user는 protected이고 list는 private인 경우

user의 접근권한이 protected이므로 프록시 객체를 정상정으로 생성하고, user entity값이 필요해질 때 프록시 객체가 초기화해서 실제 entity를 참조해서 값을 가져온다. list객체의 경우 entitymanager가 객체를 조회해주기 때문이다.

 

user는 privated이고 list는 protected인 경우

user의 접근권한이 private이므로 지연 로딩시 JPA구현체가 user프록시 객체를 생성할 때 접근할 수 없기 때문이다.

 

 

번외)

같은 클래스에서 위의 코드에서 엔티티를 불러온적이 있으면 영속성 컨텍스트에 남아있으므로, JPA가 이와 관련된 객체에 대해 지연로딩을 할때에 프록시객체를 생성하지 않는다.

'기술공부' 카테고리의 다른 글

객체지향 프로그래밍(SOILD)  (0) 2024.03.13
지수 백오프(Exponential Backoff)  (0) 2024.03.05
AOP(Aspect Oriented Programming)/Spring  (1) 2023.11.20
WEB 서버와 WAS의 차이  (0) 2023.11.13
쿠키와 세션 그리고 jwt  (0) 2023.11.05