Server/Spring Boot

[Spring Boot] 빌더(Builder) 패턴의 정의, 생성자 패턴 빌더 패턴 비교

Nellie29 2023. 9. 25. 00:43


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

 

[Spring Boot] 빌더(Builder) 패턴 및 단위 테스트

복잡한 객체의 생성 과정 및 표현 방법을 분리해 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴어떤 필드에 어떤 값을 채워야 할지 명확히 지정할 수 있음필수 및 선택인

velog.io

 

[Spring] 빌더 패턴(Bulider Pattern)에 대해 알아보자

빌더 패턴은 GoF 디자인 패턴 중 생성 패턴에 해당하고 주로 복잡한 단계를 거쳐야 생성되는 개체의 구현을 서브 클래스에게 넘겨줄 때 많이 사용된다. 빌더의 생성자나 메소드에서 유효성 확인

its-ward.tistory.com