[JAVA] 빌더 패턴(Builder Pattern)을 사용해야 하는 이유

배세훈·2021년 11월 29일
2

java

목록 보기
10/16

1. 빌더 패턴(Builder Pattern)을 사용해야 하는 이유

빌더 패턴 장점

  1. 필요한 데이터만 설정할 수 있음
  2. 유연성을 확보할 수 있음
  3. 가독성을 높일 수 있음
  4. 불변성을 확보할 수 있음

1. 필요한 데이터만 설정할 수 있음

예를 들어 User 객체를 생성하는데 age라는 parameter가 필요 없는 상황이라고 가정.
생성자나 정적 메소드를 이용하는 경우라면 우리는 age에 더미 값을 넣어주거나 age가 없는 생성자를 새로 만들어주어야 한다.

// 1. 더미 값
User user = new User("테스트", 0, 181, 121);

// 2. 생성자 또는 정적 메소드를 추가하는 방법
@NoArgsConstructor
@AllArgsConstrctor
public class User{
	private String name;
    private int age;
    private int height;
    private int iq;
    
    public User(String name, int height, int iq){
    	this.name = name;
        this.height = height;
        this.iq = iq;
    }
    
    public User static of(String name, int height, int iq){
    	return new User(name, 0, 181, 121);
    }
}

이러한 작업이 한두번이면 괜찮지만 반복적인 경우 시간 낭비로 이어지게 된다. 하지만 빌더를 이용하면 동적으로 이를 처리할 수 있다.

User user = User.builder()
			.name("테스트")
            .heihgt(181)
            .iq(121).build();

그리고 이렇게 필요한 데이터만 설정할 수 있는 빌더의 장점은 생성자 또는 정적 메소드와 비교하여 테스트용 객체를 생성할 때 용이하게 해주고 불필요한 코드의 양을 줄이는 등의 이점을 안겨준다.

2. 유연성을 확보할 수 있음

예를 들어 User 클래스에 몸무게를 나타내는 새로운 변수 weight를 추가해야 한다고 하자. 하지만 이미 생성자로 객체를 만드는 코드가 있다고 가정

// ASIS
User user = new User("테스트", 19, 181, 121);

// TOBE
User user = new User("테스트", 19, 181, 121, 79);

그러면 우리는 새롭게 추가되는 변수 때문에 기존의 모든 코드를 수정해야 하는 상황에 직면하게 된다. 하지만 빌더 패턴을 이용하면 새로운 변수가 추가되는 등의 상황에 직면하여도 기존의 코드에 영향을 주지 않을 수 있다.

3. 가독성을 높일 수 있음

빌더 패턴을 사용하면 매개변수가 많아져도 가독성을 높일 수 있다. 생성자로 객체를 생성하는 경우에는 매개변수가 많아질수록 코드 리딩이 급격하게 떨어진다.

User user = new User("테스트", 19, 181, 121);

19, 181, 121이 무엇을 의미하는지 바로 파악하기 힘들고 파라미터의 개수가 많아질수록 코드를 읽기 더 힘들어진다. 하지만 다음과 같이 빌더 패턴을 적용하면 가독성을 높일 수 있고 직관적인 데이터를 파악할 수 있다.

User user = User.builder()
			.name("테스트")
            .age(19)
            .height(181)
            .iq(121).build();

4. 불변성을 확보할 수 있음

많은 개발자들이 수정자 패턴(Setter)를 흔히 사용한다. 하지만 Setter를 구현하다는 것은 불필요하게 확장 가능성을 열어두는 것이다. 이는 Open-Closed 법칙에 위배되고 불필요한 코드 리딩 등을 유발한다. 그렇기 때문에 클래스 변수를 final로 선언하고 객체의 생성은 빌더에 맡기는 것이 좋다.

@RequiredArgsConstructor
@Builder
public class User{
	private final String name;
    private final int age;
    private final int height;
    private final int iq;
}
profile
성장형 인간

0개의 댓글