처음부터 차근차근

Builder pattern과 @Builder 본문

Framework/Spring

Builder pattern과 @Builder

_soyoung 2022. 7. 29. 13:58
반응형

빌더 패턴이란

객체를 정의할 때 생성자를 통해서 정의하는게 아니라 builder를 이용해서 정의하는 방법을 빌더 패턴이라고 한다.

Post post = new Post(1, "테스트", "테스트 내용", "2022-07-28 18:26:39", 0, 1, 2);

->

Post post = Post.builder()
        .id(1)
        .title("테스트")
        .content("테스트 내용")
        .writeTime("2022-07-28 18:26:39")
        .viewCount(0)
        .state(1)
        .writerId(2)
        .build();

 

 

빌더를 사용하는 이유

1. 생성자의 매개변수가 많으면 가독성이 떨어진다.

위의 board에서 봤듯이 각 값들이 어떤 값을 의미하는 지 알기 힘들다.

물론 ide 에서는 매개변수 옆에 어떤 값인지 나와있지만 만약 ide를 사용하지 않고 코드만 본다면 그 의미를 알기 힘들 것이다.

반면에 빌더를 사용하면 옆에 바로 변수명이 있기 때문에 가독성이 좋다.

그리고 값 넣는 순서를 착각하는 것을 방지해서 사전에 에러를 예방할 수 있다.

 

2. 매개변수의 순서를 상관하지 않아도 된다.

생성자는 매개변수를 반드시 순서대로 넣어줘야하는데 빌더는 이름만 맞추면 순서와 상관없이 값을 넣을 수 있다.

 

 

@Builder

class Cat {
    private int age;
    private String name;
}

위 클래스의 builder를 만드려면 아래와 같이 만들어야한다.

class Cat {
	private int age;
	private String name;
   	
   	private Cat(int age, String name) {
   		this.age = age;
   		this.name = name;
   	}
   	
   	public static CatBuilder builder() {
   		return new CatBuilder();
   	}
   	
   	public static class CatBuilder {
   		private int age;
		private String name;
   		
   		private CatBuilder() {}
   		
   		public CatBuilder age(int age) {
   			this.age = age;
   			return this;
   		}
   		
   		public CatBuilder name(String name) {
   			this.name = name;
   			return this;
   		}
   		
   		public Cat build() {
   			return new Cat(age, name);
   		}
   	}
}

참~~~길다.

spring 라이브러리 중 lombok은 @Builder 어노테이션을 지원해서 builder를 자동생성해준다.

@Builder
class Cat {
    private int age;
    private String name;
}

그래서 이렇게 사용하기만 하면 위의 긴 코드를 일일히 다 작성하지 않아도 된다!

 

 

@Builder.Default

빌더 패턴을 통해 객체를 만들 때 특정 필드를 특정 값으로 미리 초기화하는 어노테이션이다.

변수 기본값 지정할 때 사용하기 좋은 어노테이션이다.

 

예를 들어

@ToString
@Builder
class Cat {
    private int age;
    @Builder.Default
    private String name = "nero";
}

이렇게 어노테이션을 붙이고 값을 미리 초기화하면

public class Main {

    public static void main(String[] args) {
        Cat cat = Cat.builder().age(1).build();
        System.out.println(cat.toString());

    }
}

age 변수만 초기화하고 출력해봤을 때 

Cat(age=1, name=nero)

이런식으로 "nero"가 기본 값으로 초기화되서 출력된다.

 

 

참고 : https://pamyferret.tistory.com/67

 

빌더 패턴(Builder pattern)을 써야하는 이유, @Builder

빌더 패턴(Builder pattern)이란? 객체를 정의하고 그 객체를 생성할 때 보통 생성자를 통해 생성하는 것을 생각한다. Bag bag = new Bag("name", 1000, "memo"); 하지만 생성자를 통해 객체를 생성하는데 몇 가

pamyferret.tistory.com

 

반응형
Comments