- 빌더 패턴(Builder pattern) : 디자인 패턴 중 하나
복잡한 객체를 생성하는 클래스와 표현하는 클래스를 분리하여, 동일한 절차에서도 서로 다른 표현을 생성하는 방법
@Builder
애노테이션을 사용하여 간편하게 빌더 패턴 코드를 작성할 수 있다.
함께 보면 좋은 빌더 작성 예제 / 설명 : (Github) java-design-patterns
@Builder
에 대해 알아보자.
먼저 데이터를 가지고 있는 Student
테이블을 생성하여 이름, 나이, 학년 객체를 생성해보았다.
public class Student {
private String name;
private int age;
private String grade;
}
School
클래스를 새로 생성한 뒤 [ 이름 : James / 나이 : 15 / 학년 : 3 ] 의 데이터를 입력해보자.
빌더를 이용하지 않는다면 멤버 변수 초기화 메서드를 작성한 뒤, 메서드 호출로 데이터를 반환해줬을 것이다. 작성하면 이런 식의 코드가 된다.
//Student table의 멤버 변수 초기화 메서드
public Student(String name, int age, String grade) {
super();
this.name = name;
this.age = age;
this.grade = grade;
}
//School table에서 멤버 변수 초기화 시키기
public class School {
public static void main(String[] args) {
BuilderPattern1 b1 = new BuilderPattern1("James ", 15, "3학년");
}
}
그런데 여기 Amy라는 14살의 학생이 있다. 이름과 나이만 알고 학년은 아직 알지 못한다.
Student
테이블에 학년을 제외한 이름과 나이 정보만 입력해보자.
이 경우, 두가지 방법으로 입력할 수 있다.
grade
입력 시, null 입력grade
없이 이름과 나이만 반환하는 멤버 변수 초기화 메서드를 새로 작성하기이와 같이 멤버 변수들의 특정 값만 초기화 시키는 겨우, 메서드를 변경해야하는 번거로움을 줄이기 위해 @Builder
를 이용하는 것이다.
이번에는 빌더를 이용해 정보를 입력해보자.
✅ builder
는 parameter별로 생성자가 있는 것과 같은 효과를 낼 수 있지만, new
로 불러올 수 없기 때문에 Class명.builder
와 같이 호출한다.
- builder 작성 :
ClassName.builder( ).변수명1( data ).변수명2( data ) · · · .build( );
import lombok.Builder;
@Builder // 빌더 적용
@ToString
public class Student {
private String name;
private int age;
private String grade;
}
코드를 작성한 뒤 위에 @Builder
를 적용하고 Import 해주었다!
이후 테스트에서 출력 값을 한번에 모두 확인하기 위해 @ToString
도 함께 작성했다.
먼저, builder
만 출력하면 어떤 값이 나오는지 확인해보자.
public class School {
public static void main(String[] args) {
System.out.println(Student.builder());
}
}
//출력 : Student.StudentBuilder(name=null, age=0, grade=null)
Student 테이블에 있는 멤버 변수들의 기본 값이 출력되는 것을 확인할 수 있다.
public class School {
public static void main(String[] args) {
Student s = Student.builder().name("James").age(15).grade("3학년").build();
System.out.println(s);
}
}
//출력 : Student(name=James, age=15, grade=3학년)
[ 이름 : Amy / 나이 : 14 ] 의 데이터를 입력해보자.
public class School {
public static void main(String[] args) {
Student a = Student.builder().name("Amy").age(14).build();
System.out.println(a);
}
}
//출력 : Student(name=James, age=15, grade=null)
Tim 이라는 이름 값만 입력해보자.
public class School {
public static void main(String[] args) {
Student t = Student.builder().name("Tim").build();
System.out.println(t);
}
}
//출력 : Student(name=Tim, age=0, grade=null)
참고 : [생성 패턴] 빌더 패턴(Builder pattern) 이해 및 예제
참고 : [Design Pattern] GoF 생성 패턴 - 빌더 패턴(Builder Pattern)