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 |