Class에 붙이는 @Builder
Lombok에서는 @Builder라는 유용한 어노테이션을 제공합니다. 이 어노테이션을 사용하면 Builder를 자동으로 생성해줍니다. 만약 class level에 사용하면 아래와 같이 기본값을 쉽게 줄 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
@Builder
public class Example {
@Builder.Default
private long id = 0;
@Builder.Default
private long created = System.currentTimeMillis();
}
// created를 따로 지정하지 않았지만, 기본 값으로 설정 된다.
Example.builder().build();
하지만 JPA Entity에서 class level builder는 잘 사용하지 않는데, 이유는 아래와 같습니다.
- 모든 필드를 지정할 수 있습니다. 자동생성이 설정된 id와 같이 builder에 포함하지 말아야 할 필드까지 모두 생성됩니다.
- 따로 생성자를 만들지 않으면, Package level의 모든 필드를 포함한 생성자를 만듭니다. 굳이 all argument 생성자가 생기는 셈이죠.
- 생성자를 만들때도 반드시 모든 인자가 포함된 생성자가 있어야 합니다.
그래서 생성자에 Builder를 붙여 쓰는 것을 권장합니다.
생성자에 붙이는 @Builder
1
2
3
4
5
6
7
8
9
10
11
public class Example {
private long id;
private long created;
@Builder
public Example(long created){
this.created = created;
}
}
Example.builder().build();
위와 같이 사용할 수 있습니다. 이렇게 사용하면 created만 지정할 수 있게 Builder가 생성됩니다. 하지만 생성자에 @Builder를 붙이는 방식은 @Builder.Default를 사용할 수 없습니다.
대신 이런 방식으로 기본 값을 줄 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Example {
private long id;
private long created;
@Builder
public Example(long created){
this.created = created;
}
// builder함수는 원래 lombok이 만들어 주는 함수이다.
public static ExampleBuilder builder() {
return new ExampleBuilder()
.created(System.currentTimeMillis())
}
}
Example.builder().build();
builder함수는 따로 만들지 않으면 lombok이 자동으로 생성해줍니다. 물론 이렇게 저희가 직접 재정의할 수도 있습니다.
미리 기본값이 지정된 builder를 생성해서 주는 방식으로 사용하면, 기본값 지정을 흉내낼 수 있습니다.