@Entity 와 @Builder 사용법

kmb·2022년 7월 19일
0

JPA

목록 보기
2/7
post-thumbnail

엔티티 클래스를 만들때 아래와 같은 어노테이션들을 사용하게된다. 그 중 몇가지 원칙을 알아보자.

@Entity
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class GuestBook {

}

1) @Setter 사용 금지

이때 @Setter 어노테이션을 사용하게 된다면 객체(엔티티)의 값을 변경 할 수 있으므로 객체의 안정성 및 일관성을 보장할 수 없다. 또한 객체의 변경이 어디서 누구에 의해 발생했는지 확인하기가 힘들다.

따라서 엔티티 내부에 변경 의도가 명확한 메서드를 생성하고 이를 사용해야한다.

public GuestBook update(String title, String content, String writer) {
	
    this.title = title;
	this.content = content;
	this.writer = writer;
	
    return this;
}

2) @NoArgsConstructor(access = AccessLevel.PROTECTED) 기본 생성자의 접근제어를 PROTECTED로 변경

기본 생성자(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;
    }
}

3) @AllArgsConstructor 사용 금지

클래스 위에 @Builder 어노테이션과 @NoArgsConstructor 어노테이션을 함께 사용하면 오류가 발생한다.

오류를 해결하기 위해 모든 필드를 가지는 생성자를 생성하는 @AllArgsConstructor 어노테이션을 사용하면 되지만

@AllArgsConstructor 는 클래스에 존재하는 모든 필드에 대한 생성자를 자동으로 생성한다.
이때 인스턴스 멤버의 선언순서에 영향을 받기 떄문에 파라미터 입력 순서를 바꾸면 생성자의 입력값 순서도 바뀌게 된다.

따라서 @AllArgsConstructor 를 사용하지말고 모든 필드를 가지는 생성자 위에 @Builder 어노테이션을 붙여서 사용하면 된다.

 

참조

profile
꾸준하게

0개의 댓글