Spring을 다루다 보면 빌더 패턴을 자주보게 되는데 이걸 왜 쓰는 거고, 

어떻게 쓰는 건지 알아보자

 

 

 

 

빌더 패턴(Builder Pattern)이란?

복잡한 객체를 단계별로 구성해 나가며 생성할 수  있게 해주는 객체 생성 디자인 패턴

클래스의 필드가 많다면 생성자가 너무 많아지고, 생성자의 파라미터도 많아져 가독성이 떨어질 수 있다.

User user = new User("subin", 25, "010-1234-5678", "subin@example.com", true);

 

이런 상황에서 빌더 패턴을 쓰면 여러 장점이 있다.

먼저 빌더 패턴을 적용하면 어떻게 되는지부터 보자

User user = new User.Builder()
                .name("수빈")
                .age(25)
                .phone("010-0000-0000")
                .build();

 

이렇게 User을 만드는걸 메서드 체이닝으로 만들 수 있다.

이러면 순서 상관없이 작성할 수 있다.

 

빌더 패턴 장점

장점  설명
가독성 ↑ 어떤 필드에 어떤 값이 들어가는지 명확
유연성 ↑ 선택적인 값만 지정할 수 있다
불변 객체 생성 용이 모든 필드를 final로 지정하고 생성 시점에만 초기화 가능
유지보수 쉬움 생성자 오버로딩이 필요 없어 코드가 깔끔함

 

 

이러한 빌더패턴을 만드는 형식이 있다.

public class User {
    private final String name;
    private final int age;
    private final String phone;

    private User(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.phone = builder.phone;
    }

    public static class Builder {
        private String name;
        private int age;
        private String phone;

        public Builder name(String name) {
            this.name = name;
            return this;
        }

        public Builder age(int age) {
            this.age = age;
            return this;
        }

        public Builder phone(String phone) {
            this.phone = phone;
            return this;
        }

        public User build() {
            return new User(this);
        }
    }
}

 

이렇게 User 객체 내에 Builder라는 클래스를 만들다.

이 클래스 안에 자신을 반환하는 setter 느낌의 메서드들이 있고

이를 통해 User에 필드를 설정하면서 메서드 체이닝이 가능하다.

 

하지만 매번 이렇게 만드는게 힘들기에 Lombok에서 지원하는 @Builder를 사용하면 자신의 필드들로
Builder 패턴을 적용시켜 준다.

 

import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class User {
    private String name;
    private int age;
    private String phone;
}

 

이렇게 매우 간단하게 만들 수 있는 것이다.

 

이런 Builder 패턴은 DTO에서 자주 사용된다.

DTO를 @Builder로 만들면 기본 생성자가 없을 수 있기에 @NoArgsConstructor(access = AccessLevel.PROTECTED)를 함께 써주는게 좋음

또한 불변객체를 만들때도 사용된다.

불변객체란 생성되고 값이 변경되지 않는 건데, 빌더 패턴으로 만든 객체는 별도의 setter가 없이 필드를 final로 둔다.

이 객체는 무조건 생성자로 초기화가 되어야하는데 아까 봤던 단점들에 그대로 노출된다.

그렇기에 빌더패턴이 불변객체와 잘 맞는 것이다.

 

 

+ Recent posts