우선, 빌더 패턴과 비교되는 패턴이 두 가지가 있어요.
두 가지 패턴은 용어만 거창하지 이미 알고 계실거에요.
- 점층적 생성자 패턴 : 생성자로 필드를 세팅, ex) new UserInfo(userId, password);
- 자바빈 패턴 : Setter 메서드로 필드를 세팅, ex) userInfo.set(userId);
- 빌더 패턴
이제, 빌더 패턴을 직접 구현해볼게요.
Builder 패턴 직접 구현
@Getter
public class UserInfo {
private String userId;
private String nickname;
private String password;
private String email;
public static UserInfoBuilder builder() {
return new UserInfoBuilder();
}
public static class UserInfoBuilder {
private String userId;
private String nickname;
private String password;
private String email;
public UserInfoBuilder userId(String userId) {
this.userId = userId;
return this;
}
public UserInfoBuilder nickname(String nickname) {
this.nickname = nickname;
return this;
}
public UserInfoBuilder password(String password) {
this.password = password;
return this;
}
public UserInfoBuilder email(String email) {
this.email = email;
return this;
}
public UserInfo build() {
return new UserInfo(this);
}
}
private UserInfo(UserInfoBuilder builder) {
this.userId = builder.userId;
this.nickname = builder.nickname;
this.password = builder.password;
this.email = builder.email;
}
}
Lombok @Builder 어노테이션 사용
@Getter
@Builder
public class UserInfo {
private String userId;
private String nickname;
private String password;
private String email;
}
비즈니스 로직
UserInfo userInfo = UserInfo.builder()
.userId("gofnrk")
.password("1234")
.email("gofnrk@nate.com")
.nickname("홍아지")
.build();
Builder 패턴의 목적은 유동적으로 필드에 값을 세팅하고, 객체를 생성한 후, 변경불가능 상태로 만드는 것이에요.
이 부분을 Builder 패턴의 가장 큰 장점이라고 소개해요.
반대로, 객체를 생성한 후 수정해야하는 경우에 빌더 패턴을 적용해버리면 결국 setter도 함께 사용하게 되요.
또한, Lombok을 사용하지 않으면 저 긴 코드를 다 작성해줘야 하고, Builder 클래스가 만들어지기 때문에 영향이 크진 않지만 성능적으로도 불리할 수 있습니다.
그래서 꼭 Builder 패턴이 객체 생성의 답이다라고는 단정 짓기 어렵습니다.
상황에 맞게 사용하는 것이 가장 좋겠습니다.
'Backend > Java' 카테고리의 다른 글
자바 싱글톤 패턴 (Java Singleton Pattern) (2) | 2019.11.12 |
---|---|
자바 템플릿 메소드 패턴 (Java Template Method Pattern) (0) | 2019.11.12 |
자바 파일 확장자 추출 (+ Spring) (0) | 2019.10.11 |
자바 인터페이스 사용 이유 (Java Interface) (15) | 2019.09.25 |
Java Lombok 설치 가이드 및 주의사항 (0) | 2019.08.24 |