우리는 데이터를 한번에 담아서 보낼 때 정해진 클래스의 객체를 생성해 객체 내부에 담게 된다.
객체를 한 번에 생성하지 않고, 값을 단계적으로 담아 마지막에 build()로 객체를 만드는 패턴이 바로 빌더 패턴이다.
@Builder
public class User {
private String email;
private String role;
}
위 코드를 작성하게 되면 실제론 아래와 같이 코드가 작동한다.
public class User {
private String email;
private String role;
User(String email, String role){
this.email = email;
this.role = role;
}
public static UserBuilder builder() {
return new UserBuilder();
}
public static class UserBuilder {
private String email;
private String role;
public UserBuilder email(String email){
this.email = email;
return this;
}
public UserBuilder role(String role){
this.role = role;
return this;
}
public User build(){
return new User(email, role);
}
}
}
이렇게 되면 실제로 서비스 계층에서 사용할 때는 다음과 같다.
User user = User.builder()
.email("a@test.com")
.role("USER")
.build();
여기서 주의해야 할 점은 빌더 어노테이션이다.
@Builder 위치에 따라 다르기 때문이다.
클래스 위:
@Builder
class User
→ 모든 필드 기반 builder
생성자 위:
@Builder
public User(String email)
→ 그 생성자 파라미터만 builder
메서드 위:
@Builder
public static User create(...)
→ 메서드 호출용 builder