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로 둔다.
이 객체는 무조건 생성자로 초기화가 되어야하는데 아까 봤던 단점들에 그대로 노출된다.
그렇기에 빌더패턴이 불변객체와 잘 맞는 것이다.
'공부일지 > 개인학습' 카테고리의 다른 글
[사이드 프로젝트 일지] #01 스웨거 작성, 비밀번호 찾기 / 회원 정보 변경 추가 (0) | 2025.06.29 |
---|---|
[Spring] OAuth2 적용기 (1) | 2025.06.26 |
기존 프로젝트 OAuth2 분석 (0) | 2025.06.20 |
[리눅스 마스터 2급] 시험 후기 (0) | 2025.06.16 |
Spring Security 정리 (1) | 2025.06.15 |