[Spring] @Builder

밀크야살빼자·2023년 5월 20일
0

빌더 패턴(Builder Pattern)

객체를 정의하고 그 객체를 생성할 떄 보통 생성자를 통해 생성하는 것을 생각한다.

생성자를 통해 객체를 생성 할 때의 단점
객체를 생성할 수 있는 빌더를 builder() 함수를 통해 얻고 거기에 셋팅하고자 하는 값을 셋팅하고 마지막에 build()를 통해 빌더를 작동시켜 객체를 생성한다.

    public User toEntity(){
        return User.builder()
                .userId(id)
                .name(name)
                .password(password)
                .roles(role)
                .build();
    }

빌더 사용 이유

  1. 생성자 파라미터가 많을 경우 가독성이 좋지 않다.
User user = new User("name", 20, "ISFJ","milk","todo",1000);

생성자 파라미터로 받는 값들이 많아지면 각 값들이 어떤 값을 의미하는지 파악하기 어렵다. 하지만 빌더 패턴을 통해 작성하면 각 값들은 빌더의 각 값들의 이름 함수로 셋팅이 되어 각각 무슨 값을 의미하는지 파악하기 쉽다.

User user = User.builder()
	.name("name");
    .age(20)
    .mbti("ISFJ")
    .pet("milk")
    .todo("todo")
    .money(1000)
    .build();
  1. 어떤 값을 먼저 설정하던 상관 없다.
    생성자를 사용하면 파라미터 순서대로 값을 넣어줘야 한다. 하지만 빌더 패턴은 빌더의 이름으로 값을 설정하기 때문에 순서대로 값을 안 넣어줘도 된다.

@Builder

코드로 빌더를 만들고 그 안에서 멤버 필드별로 값을 설정하고 빌더를 반환하는 함수를 만들면 된다.

// Before:
   @Builder
   class Example<T> {
   	private T foo;
   	private final String bar;
   }
   
// After: @Builder 패턴이 없으면 아래와 같이 직접 구현해줘야 한다.
   class Example<T> {
   	private T foo;
   	private final String bar;
   	
   	private Example(T foo, String bar) {
   		this.foo = foo;
   		this.bar = bar;
   	}
   	
   	public static <T> ExampleBuilder<T> builder() {
   		return new ExampleBuilder<T>();
   	}
   	
   	public static class ExampleBuilder<T> {
   		private T foo;
   		private String bar;
   		
   		private ExampleBuilder() {}
   		
   		public ExampleBuilder foo(T foo) {
   			this.foo = foo;
   			return this;
   		}
   		
   		public ExampleBuilder bar(String bar) {
   			this.bar = bar;
   			return this;
   		}
   		
   		@java.lang.Override public String toString() {
   			return "ExampleBuilder(foo = " + foo + ", bar = " + bar + ")";
   		}
   		
   		public Example build() {
   			return new Example(foo, bar);
   		}
   	}
   }

빌더 패턴을 적용할 객체에 @Builder를 작성해주면 된다.

@Builder
public class User{
	private String name;
    private int age;
    private mbti;

빌더를 통해 객체를 생성할 수 있다.

User user = User.builder()
	.name("name")
    .age(20)
    .mbti("ISFJ")
    .build();

📜 참고

https://pamyferret.tistory.com/67

profile
기록기록기록기록기록

0개의 댓글