엔티티 클래스를 만들때 아래와 같은 어노테이션들을 사용하게된다. 그 중 몇가지 원칙을 알아보자.
@Entity
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class GuestBook {
}
이때 @Setter 어노테이션을 사용하게 된다면 객체(엔티티)의 값을 변경 할 수 있으므로 객체의 안정성 및 일관성을 보장할 수 없다. 또한 객체의 변경이 어디서 누구에 의해 발생했는지 확인하기가 힘들다.
따라서 엔티티 내부에 변경 의도가 명확한 메서드
를 생성하고 이를 사용해야한다.
public GuestBook update(String title, String content, String writer) {
this.title = title;
this.content = content;
this.writer = writer;
return this;
}
기본 생성자(NoArgsConstructor)의 접근제어를 PROTECTED
로 설정한다면 값을 갖지않는 의미없는 객체 생성을 막을 수 있다.
(JPA 기본 스펙상의 기본생성자는 protected로 제어하는것까지 허용)
의미있는 객체 생성을 위해 모든 필드를 가지는 생성자
위에 @Builder
어노테이션을 붙여서 사용한다.
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class GuestBook extends BaseEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long gno;
@Column
private String title;
@Column
private String content;
@Column
private String writer;
public GuestBook update(String title, String content) {
this.title = title;
this.content = content;
return this;
}
@Builder
public GuestBook (String title, String content, String writer) {
this.title = title;
this.content = content;
this.writer = writer;
return this;
}
}
클래스 위에 @Builder 어노테이션과 @NoArgsConstructor 어노테이션을 함께 사용하면 오류가 발생한다.
오류를 해결하기 위해 모든 필드를 가지는 생성자를 생성하는 @AllArgsConstructor 어노테이션을 사용하면 되지만
@AllArgsConstructor 는 클래스에 존재하는 모든 필드에 대한 생성자를 자동으로 생성한다.
이때 인스턴스 멤버의 선언순서에 영향을 받기 떄문에 파라미터 입력 순서를 바꾸면 생성자의 입력값 순서도 바뀌게 된다.
따라서 @AllArgsConstructor 를 사용하지말고 모든 필드를 가지는 생성자
위에 @Builder
어노테이션을 붙여서 사용하면 된다.
참조