본문 바로가기

Java/Lombok

Lombok @Builder 로 Builder 패턴 적용하기

Builder Pattern

 

UserEntity.java 에 다음과 같이 Builder 패턴을 적용할 수 있다.

 

UserEntity.java 제약사항

Field Description
id auto_increment
name 필수값
- 빈 문자열을 입력할 수 없음.
nickname Optional
- 입력시 빈 문자열을 입력할 수 없음.
createdAt Database에 입력한 시간
- 사용자가 설정할 필요 없음.

 

Builder Pattern

위 코드는 제약사항을 만족하는 Builder 패턴을 작성한 것이다.

 

 

Lombok @Builder 패턴

Lombok의 @Builder 애너테이션을 이용해서 Builder 패턴을 "쉽게" 적용할 수 있다.

 

 

1. @Builder 애너테이션을 입력한다.

 

 

그리고 실행하면 다음과 같은 에러가 발생한다.

 

 

@Builder 애너테이션은 클래스에 작성한 모든 field를 포함하는 생성자가 있어야 한다.

 

 

2. @AllArgsConstructor(access = AccessLevel.PRIVATE)

 

Lombok 이 제공하는 @AllArgsConstructor는 class 에 선언한 모든 field를 Argument 로 가지는 생성자를 만들어준다. AccessLevel 을 설정하지 않으면, 모든 클래스에서 UserEntity 객체를 생성할 수 있기 때문에 AccessLevel을 private 으로 설정한다. 

 

 

여기까지 진행하면 문제없이 빌드가 되는것을 확인할 수 있다.

 

여기서 끝이 아니다. UserEntity 제약사항에는 입력받아서는 안되는 값(id, createdAt), 반드시 입력해야하는 값(name), 선택적으로 입력할 수 있는 값(nickname)으로 구분되어있다.

 

 

 

현재 UserEntity는 사용자가 모든 값을 직접 입력할 수 있다. 이러면 객체를 생성하고 setter 로 값을 입력하는 것과 다르지 않다. 오히려 setter를 이용하는 쪽이 간단하기까지 하다. 사용자가 UserEntity를 생성하고 사용할 때, 기대하는 동작을 제대로 수행할 수 없게 된다.

 

원하는 값에만 Builder 패턴을 적용하려면, 생성자 레벨에서 @Builder 를 적용해야 한다.

 

 

3. 생성자 레벨에 @Builder 적용

 

 

이제 name 필드만 입력할 수 있게 되었다. 그래도 여전히 name 을 입력하지 않아도, UserEntity 객체를 생성할 수 있다.

 

 

 

4. @Builder(builderMethodName = "customBuilder")

 

builderMethodName 에 customBuilder 를 입력하면, UserEntity.UserEntityBuilder 를 반환하는 customBuilder 메소드가 생성되고, builder 메서드에 필수값인 "name" 이 argument로 들어간 메소드가 생성된다.

 

이젠 다시 사용자가 설정할 필요가 없는 값을 설정할 수 있게 되었다.

 

 

......... 더이상 진행할 자신이 없다.

 

 

마치며

 

Lombok 에서 제공하는 @Builder 애너테이션으로 제약사항에 맞는 Builder패턴을 설정하려 노력했다. 과연 Lombok 의 @Builder 애너테이션으로 Builder패턴을 생성하는게 쉬운지 다시 물어보고 싶다.

 

Lombok의 @Builder 를 사용하기위해, 사용하지도 않는 @AllArgsConstructor를 입력하고, 외부에서 모든 Argument가 있는 생성자에 접근하지 못하도록 accessLevel을 private으로 설정했다. 각종 제약사항을 만족하기위해 이런저런 방법을 사용해보았다. 그러나 만족할만한 결과가 나오지 않았다.

 

지금까지 시도를 하며 느낀것은 "@Builder 를 사용하는게 이득인가?" 에 대한 의문 뿐이다. 나는 이득이 아니라 생각한다.

 

Builder 패턴을 이해하고 있다면, 객체의 제약사항에 맞게 직접 Builder 패턴을 작성하는게 더 빠르고 명확하다.

 

 

참고자료

- Effective Java 3/E "Item 2. 생성자에 매개변수가 많다면 빌더를 고려하라" pp. 14

- https://projectlombok.org/features/Builder

'Java > Lombok' 카테고리의 다른 글

@RequiredArgsConstructor  (0) 2021.09.12