hayu's 개발 일지

[TIL]240313 Builder Pattern 본문

프레임워크/spring

[TIL]240313 Builder Pattern

hayu00 2024. 3. 13. 21:39

Builder Pattern 이란?

- 복잡한 객체의 생성 과정과 표현 방법을 분리하여 다양한 구성의 인스턴스를 만드는 생성 패턴이다. 

- 생성자에 들어갈 매개 변수를 메서드로 하나한 받아서 마지막에 빌드해서 객체를 생성한다. 

 

Builder Pattern 탄생 배경

- 이전에는 Setter 메서드를 호출함으로써 유연적으로 객체 생성이 가능해졌다. 하지만 이런 방식은 객체 생성 시점에 모든 값들을 주입하지 않아 일관성 문제와 불변성 문제가 나타났다. 

 

일관성문제

- 필수 매개변수는 객체가 초기화될 때 반드시 설정되어야 하는 값이다. 하지만 개발자가 메서드를 호출하지 않았다면 이 객체는 일관성이 무너진 상태가 된다. 즉, 객체가 유효하지 않은 것이다. 

 

불변성문제

- Setter 메서드는 객체를 처음 생성할 때 필드값을 설정하기 위해 존재하는 메서드이다. 하지만 객체를 생성했음에도 여전히 외부적으로 Setter 메소드를 노출하고 있으므로 협업 과정에서 Setter 메서드를 호출해 함부로 객체를 조작할 수 있게 된다. 이것을 불변함을 보장할 수 없다고 한다. 

 

+ Setter 메서드를 사용하면 의도를 파악하기 힘들다. 

 

Builder Pattern

- 이런 문제들을 해결하기 위해 별도의 Builder 클래스를 만들어 메소드를 통해 값을 입력받고 Build() 메소드 하나로 인스턴스를 생성하여 리턴하는 패턴이다. 

 

예시 코드

Post post = Post.builder()
	.name("name")
	.title("story")
	.memo("memo")
	.content("long time")
	.build();

 

@Builder 이란?

- 개발자가 편하게 빌더 패턴을 이용하기 위해 LomBok 에서는 별도의 에너테이션을 지원하는데 클래스에 @Builder 를 붙여주면 클래스를 컨파일할 때 자동으로 클래스 내부에 빌더 API 가 만들어진다. 

 

@Builder
public class Post {
    private final String title;
    private final Long price;
    private final String phone;
    private final String content;
}

 

객체를 다음과 같이 생성할 수 있게된다.

Post post = Post.builder() //어노테이션으로 생성된 빌더클래스 생성자
    .title("게시글")
    .price(3000)
    .phone("010-1234-5678")
    .content("당근 팔아요.")
    .build();