본문 바로가기

Backend/Java

자바 빌더 패턴 (Java Builder Pattern) 장단점

우선, 빌더 패턴과 비교되는 패턴이 두 가지가 있어요.

두 가지 패턴은 용어만 거창하지 이미 알고 계실거에요.

  • 점층적 생성자 패턴 : 생성자로 필드를 세팅, 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 패턴이 객체 생성의 답이다라고는 단정 짓기 어렵습니다.

상황에 맞게 사용하는 것이 가장 좋겠습니다.