https://esoongan.tistory.com/82
빌더 패턴이란
객체일관성/객체불변성과 가독성을 만족시키기 위해 자바 빈즈 패턴을 내부 클래스를 활용하여 발전시킨 디자인패턴입니다.
자바빈즈 패턴
클래스를 구현할 때 필수적인 필드는 생성자로 받고, 선택적인 필드는 setter를 통해서 받는 디자인 패턴.
기존의 점증적 생성자 패턴의 가독성 문제를 해결할 수 있다.
//점증적 생성자 패턴
class Employee {
private String name; // 필수 정보
private String hobby; // 선택적 정보
public Employee(String name) { //필수정보를 생성자에 담음
this.name = name;
}
public Employee(String name, String hobby) { //필수정보에 필수정보를 붙임,
this.name = name; //필드가 많아질 수록 생성자가 엄청 많아짐.
this.hobby = hobby;
}
}
class main {
Employee employee = new Employee("Hong", "game"); //필드의 위치를 알고 있어야함
}
//자바 빈즈 패턴
class Employee {
private String name; // 필수 정보
private String hobby; // 선택적 정보
public Employee(String name) { //필수정보를 생성자에 담음
this.name = name;
}
public setHobby(String hobby) { //setter 함수를 통해 선택적 필드를 받음.
this.hobby = hobby; //모든 조합의 생성자를 만들지 않아도 되기 때문에
} //코드의 가독성이 높아짐
}
class main {
Employee employee = new Employee("Hong"); //필수 필드만 생성자로 받아 강제하고
employee.setHobby("game"); //선택적 필드를 메서드로 받아 기존처럼 순서를 알지 않아도 됨.
}
하지만, set메서드를 통해 쉽게 값을 변경할 수 있기 때문에, 이 방법은 객체의 일관성을 보장할 수 없는 단점이 있다. 이 문제를 해결하기 위해 빌더 패턴이 생겼다.
빌더 패턴
빌더 패턴은 객체에 정보를 저장하는 기능을 내부 클래스로 분리하여, 객체의 일관성/ 변경불가능성을 보장한다. 내부 클래스에서 객체를 생성하고 리턴하기 때문에, 외부 클래스 객체가 완성된 후에는 정보를 변경하기 어렵다. (내부 클래스의 세터 메서드를 이용해도, 원래 값을 수정하는 것이 아닌 객체를 만드는 것이다.)(리플렉션 기법으로 변경할 수 있다고 한다.)
//빌더 패턴
class Employee {
private String name; // 필수 정보
private String hobby; // 선택적 정보
private Employee() {}
static static class Builder { //정보를 할당하고 저장하는 기능을 담당하는 내부 클래스.
private String name; // 필수 정보
private String hobby; // 선택적 정보
public Builder(String name) {
this.name = name; // 필수 정보를 생성자에 담아 강제한다.
}
public Builder setHobby(String hobby) { //선택 정보를 세터함수로 구현
this.hobby = hobby;
return this; //세터 함수마다 객체를 리턴하여 메서드체이닝을 가능하게 함.
}
public Employee build() { //빌더 메서드를 통해 객체를 만들어서 반환
Employee employee = new Employee();
employee.name = this.name;
employee.hobby = this.hobby;
return employee;
}
}
}
class main {
Employee employee = new Employee //객체 생성
.Builder("Hong") // 필수 정보
.setHobby("game") // 선택 정보
.build(); //이 이후에는 정보를 수정할 수 없다.
}
빌더 어노테이션(@Builder)
위의 빌더 패턴을 이용하려면 간단하게 롬복의 빌더 어노테이션을 이용하면 된다.
//Builder어노테이션이 적용된 Employee 객체 생성하기
Employee employee = Emloyee.builder()
.name("Hong")
.hobby("game")
.build();
'Back-end > Spring Boot' 카테고리의 다른 글
| [SpringBoot] SpringSecurity 인증 처리 흐름 (1) | 2022.09.26 |
|---|---|
| [SpringBoot] WebClient 이해하기(feat. block/non-block과 동기/비동기) (0) | 2022.08.01 |
| [SpringBoot] 스프링부트 이해하기 - 6편 리플렉션과 어노테이션으로 디스패처 필터 만들어보기 (0) | 2022.07.21 |
| [SpringBoot] 스프링부트 이해하기 - 5편 Annotation (0) | 2022.07.16 |
| [SpringBoot] 스프링부트 이해하기- 4편 Reflection(feat. 동적 로딩) (0) | 2022.07.16 |