@Entity
@Getter@Setter
public class Member {
@Id@GeneratedValue
private Long id;
private String username;
// JPA에서는 꼭 기본 생성자가 있어야 한다.
protected Member(){}
public Member(String username){
this.username = username;
}
}
JPA 스펙에서는, 생서자를 [Protect,Public], 이 2가지로 제한을 하고 있다.
(생성자를 private으로 지정하면 에러남)
왜냐하면, 그 이유는 크게 2가지 이다.
1. Public : 클라이언트 코드에서 생성자를 사용하지 않는 경우는 거의 없다.
고로, 클라이언트 코드에서도 생성자를 사용할 수 있게 해줘야 한다.
2. Protected : Protect는 기본적으로 상속 관계에 있는 클래스 내에서만 사용이 가능하다.
고로, 클라이언트 코드에서는 생성자 사용이 불가능해 진다.
Q. 그럼 Protect 생성자는 어디에서 사용이 되는 걸까?
A. 바로, Proxy 객체를 생성하기 위함이다.
-> JPA에서는 Lazy Loading(지연 로딩)을 지원을 한다.
대부분의 개발에 있어서, Lazy Loading 사용은 절대적인 지침이다(성능 최적화 때문).
근데, JPA는 Lazy Loading이 걸린 객체에 대해서는 그 객체의 [메서드]를 호출하기 전까지는
그 클래스를 [상속] 받아서, 그 클래스에 대한 [가짜]객체, 즉 [Proxy] 객체를 [내부]에서 생성을 한다.
-> 그래서 생성자에 [Private] 설정을 하면, 어디에서도 생성자를 호출하지 못 하니,
[Protected], [Public] 중 1개로 생성자의 접근 지정자를 설정을 해야 한다.
'CS 잡지식' 카테고리의 다른 글
인텔리J - 메서드의 매개변수 조회 단축키(Feat. ctrl + P) (0) | 2023.05.09 |
---|---|
JPA에서 같은 [식별자]로 Context에서 조회를 하면.... (0) | 2023.05.09 |
@RunWith(SpringRunner.class) (0) | 2023.05.09 |
Spring Data JPA에 대한 OverView (0) | 2023.05.07 |
JPA 설정 시, 주의 사항!!! (0) | 2023.05.07 |