1. Builder 패턴이란?
Builder 패턴은 복잡한 객체의 생성 과정을 단순화하고 가독성을 높이기 위해 사용되는 생성 패턴(Creational Pattern) 중 하나입니다. 특히 매개변수가 많은 클래스를 생성할 때, 생성자 또는 정적 팩토리 메서드보다 더 직관적이고 명확한 방법을 제공합니다.
2. Builder 패턴의 장점
- 가독성 향상: 어떤 필드가 어떤 값으로 설정되는지 명확하게 보입니다.
- 불변성 유지: 객체 생성 후 필드를 변경할 수 없게 하여 불변 객체를 쉽게 만들 수 있습니다.
- 유연한 객체 생성: 필수 매개변수와 선택 매개변수를 구분하여 유연하게 객체를 생성할 수 있습니다.
- 코드 중복 감소: 여러 생성자 오버로딩 없이 다양한 조합으로 객체를 생성할 수 있습니다.
3. 전통적인 Builder 패턴 예제
public class User {
private final String firstName;
private final String lastName;
private final int age;
private final String email;
// private 생성자
private User(Builder builder) {
this.firstName = builder.firstName;
this.lastName = builder.lastName;
this.age = builder.age;
this.email = builder.email;
}
// static nested Builder 클래스
public static class Builder {
private String firstName;
private String lastName;
private int age;
private String email;
public Builder firstName(String firstName) {
this.firstName = firstName;
return this;
}
public Builder lastName(String lastName) {
this.lastName = lastName;
return this;
}
public Builder age(int age) {
this.age = age;
return this;
}
public Builder email(String email) {
this.email = email;
return this;
}
// 최종적으로 객체를 생성하는 build 메서드
public User build() {
return new User(this);
}
}
@Override
public String toString() {
return "User{" +
"firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
", age=" + age +
", email='" + email + '\'' +
'}';
}
}
// 객체 생성 예제
public class Main {
public static void main(String[] args) {
User user = new User.Builder()
.firstName("John")
.lastName("Doe")
.age(30)
.email("john.doe@example.com")
.build();
System.out.println(user);
}
}
User{firstName='John', lastName='Doe', age=30, email='john.doe@example.com'}
4. Lombok의 @Builder 어노테이션 사용
Lombok은 자바에서 보일러플레이트 코드를 줄이기 위해 사용하는 라이브러리입니다. @Builder 어노테이션을 사용하면 위와 같은 Builder 패턴을 자동으로 생성해줍니다.
Lombok 사용 예제:
import lombok.Builder;
import lombok.ToString;
@Builder
@ToString
public class User {
private String firstName;
private String lastName;
private int age;
private String email;
}
public class Main {
public static void main(String[] args) {
User user = User.builder()
.firstName("John")
.lastName("Doe")
.age(30)
.email("john.doe@example.com")
.build();
System.out.println(user);
}
}
User(firstName=John, lastName=Doe, age=30, email=john.doe@example.com)
5. 전통적인 Builder 패턴 vs Lombok @Builder
항목전통적인 Builder 패턴Lombok @Builder 사용
코드 길이 | 길고 보일러플레이트 코드가 많음 | 코드가 간결하고 깔끔함 |
유연성 | 직접 커스터마이징 가능 | 기본적인 기능은 자동 생성되나, 커스터마이징은 제한적임 |
의존성 | 추가 라이브러리 필요 없음 | Lombok 라이브러리 필요 |
가독성 및 유지보수 | 가독성이 좋지만 코드가 길어짐 | 가독성과 유지보수 모두 용이 |
6. 결론
- 전통적인 Builder 패턴은 커스터마이징이 필요하거나, 라이브러리 의존성을 피하고 싶은 경우 유용합니다.
- Lombok의 @Builder는 코드의 가독성과 개발 생산성을 높여주며, 특히 간단한 객체 생성을 빠르게 처리할 수 있습니다.
'웹 > Spring' 카테고리의 다른 글
Spring core 오픈소스 분석 01 -AnnotatedElementUtils getMergedAnnotationAttributes (0) | 2025.04.05 |
---|---|
Async 어노테이션 ,@Async 비동기 처리 (0) | 2025.02.19 |
Reflection api GetMethod (0) | 2024.04.20 |
Spring Data JPA - 구성 (0) | 2024.02.25 |
Spring Data JPA- repository 인터페이스의 정의 (0) | 2024.02.18 |