본문 바로가기

JAVA/JPA

JPA에서 Entity에 protected 생성자를 만드는 이유.

728x90

엔티티에서 setter를 쓰는 것보다 생성자를 통해 파라미터를 넘기는 게 좋다.

Setter를 무분별하게 남용하다 보면 여기저기서 객체(엔티티)의 값을 변경할 수 있으므로 객체의 일관성을 보장할 수 없기 때문. 그리고 setter는 그 의도를 알기 힘들기에 setter 사용을 자제해야한다.

 

그러므로 protect 생성자를 생성해서 아무데나 생성되는 걸 막는 게 좋다. (다른 사람이 쓰지 못하도록 제약한다.)

예시) 

Address address = new Address(); 

address.setLocation("광안리"); 

address.setCity("서울");


그러나 JPA 표준 스펙에 디폴트 생성자가 있어야하기에 private 생성자를 사용할 수 없다. 왜냐하면 jpa가 프록시 기술을 쓰는데 거기서 프록시 기술을 쓸 때, jpa hibernate가 객체를 강제로 만들어야하는데 private로 만들면 이것이 다 막혀버리기 때문이다. 그래서 protected 생성자를 사용하는 편이다. 

 

protected로 일일이 치는 것보다는

롬복으로 @NoArgsConstructor(access = AccessLevel.PROTECTED). 엔티티 클래스 위에 선언함으로써 간략하게 protected 생성자를 생성할 수 있다.

728x90

'JAVA > JPA' 카테고리의 다른 글

JPA의 성능은 과연 괜찮을까? (칼럼 한 개 vs 객체 칼럼)  (0) 2021.07.03
JPA(1) - 도메인 설계  (0) 2021.04.15