본문 바로가기

CS 잡지식

JPA에서 생성자의 접근 지정자 - Protected, Pulibc(Feat. Lazy, Proxy)

@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개로 생성자의 접근 지정자를 설정을 해야 한다.