1️⃣ 빌더 패턴
💚 빌더 패턴
- 복잡한 객체 생성 과정 및 표현 방법을 분리해, 동일한 생성 절차에서 서도 다른 표현 결과를 만들 수 있게 하는 패턴
💚 빌더 패턴 장점
- 어떤 필드에 어떤 값을 채워야 할지 명확히 지정할 수 있음
- 필수 및 선택인자가 많아질수록 생성자 방식보다 가독성이 좋다
- 자바빈 패턴(setter를 이용하는 방식)보다 안전함.
- setter 생성을 방지하기 때문에 객체를 변경할 수 없음 (불변성 보장)
2️⃣ 생성자 패턴 vs 빌더 패턴
💚 생성자 패턴 예시
지금 채워야 할 필드가 무엇인지 명확히 지정할 수 없음
변수의 위치가 뒤바뀐 채로 생성되어도 문제점을 찾지 못하고 넘어갈 수 있음
public class Person {
private String name;
private int age;
private String grade;
public Person(String name, int age, String grade){
this.name = name;
this.age = age;
this.grade = grade;
}
// Getter
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getGrade() {
return grade;
}
}
String name = "jueun";
int age = 24;
String grade = "4";
Person p1 = new Person(name, age, grade);
// String type 변수가 위치가 바뀌어도 문제점 찾지 못함
Person p2 = new Person(grade, age, name);
💚 빌더 패턴 예시
어떤 데이터가 name에 들어가야 하는지, age에 들어가야하는지 명시적으로 표현하고 있어 직관적으로 보기 좋음
public class Person {
// final 키워드를 사용해 생성자를 통한 입력
private final String name, grade;
private final int age;
// 클래스 내에 static 형태의 내부 클래스(inner class) 생성
protected static class Builder{
private String name;
private String grade;
private int age;
//name 입력값 받음 : return type을 Builder로 지정 후 this return
public Builder name(String value) {
name = value;
return this;
}
//grade 입력값 받음
public Builder grade(String value) {
grade = value;
return this;
}
//age 입력값 받음
public Builder age(int value) {
age = value;
return this;
}
// build() 메소드 실행하면 this가 return 되도록 지정
public Person build() {
return new Person(this);
}
}
// 생성자를 private으로 함
// 외부에서 접근 x + Builder 클래스에서 사용 가능
private Person(Builder builder){
name = builder.name;
age = builder.age;
grade = builder.grade;
}
// 빌더 소환 : 외부에서 Person.builder() 형태로 접근 가능하게 static method로 생성
public static Builder builder() {
return new Builder();
}
//Geter 생략
}
Person p1 = Person.builder()
.name("jueun")
.age(24)
.grade("4")
.build();
}
💚 롬복으로 빌더 패턴 적용
package kr.pe.playdata.domain;
import lombok.Builder;
import lombok.Getter;
@Getter //Getter 생성
public class LombokPerson {
private String name;
private String grade;
private int age;
@Builder // 생성자 만든 후 위에 @Build 어노테이션 적용
public LombokPerson(String name, String grade, int age) {
this.name = name;
this.grade = grade;
this.age = age;
}
}
💻 reference
'Server > Spring Boot' 카테고리의 다른 글
[Spring Boot] JWT를 사용한 인증, 인가 과정 (Access Token, Refresh Token 이용) (0) | 2023.10.01 |
---|---|
[Spring] DAO, Entity, DTO, VO의 개념과 비교 (0) | 2023.09.25 |
[Spring] 스프링 의존성 주입 종류와 @RequiredArgsConstructor 어노테이션을 사용한 생성자 주입 (0) | 2023.09.24 |
[Chapter 03] 스프링 부트에서 JPA로 데이터베이스 다뤄보자 (1) - 등록 (0) | 2023.09.24 |
[Chapter 02] 스프링 부트에서 테스트 코드를 작성하자 (0) | 2023.09.16 |