[Spring Boot] 객체 생성과 Builder 패턴

2jjong·2023년 11월 10일
0

개발을 진행하다보면 객체를 생성할 때 생성자를 통해 생성하게 됩니다.
생성자를 통해 객체를 생성하게 되면 아래와 같은 여러 불편함들이 있습니다.

  • 매개변수가 많은 경우 순서를 정확히 기억해야 하기에 번거롭다.
  • 일부 매개변수가 선택적인 경우 기본값을 가진 생성자를 추가하거나 다중 생성자를 사용해야 한다.
  • 생성자에 길게 나열된 매개변수는 가독성을 떨어뜨릴 수 있다.

이러한 불편한 점들을 해결 할 수 있는 Builder 패턴에 대해서 알아보도록 하겠습니다.

Builder 패턴

Builder 패턴은 여러 생성자 인수가 필요한 복잡한 개체를 만드는 문제를 해결하는 데 사용되는 생성 디자인 패턴입니다. Builder 패턴은 객체의 구성과 표현을 분리합니다. 이를 통해 동일한 구성 프로세스에서 다른 표현을 만들 수 있습니다.

Builder 패턴에는 아래와 같은 장점들이 있습니다.

  • Builder 패턴은 각 메소드 호출이 객체의 어떤 부분을 설정하는지 명확하게 알 수 있어서 가독성이 향상됩니다.
  • Builder 패턴을 사용하면 불변 객체를 쉽게 구현할 수 있습니다. 한 번 객체가 생성되면 불변하게 사용할 수 있어 예측 가능하고 안정적인 코드를 작성할 수 있습니다.
  • Builder 메소드를 통해 필요한 매개변수만 선택적으로 설정할 수 있습니다.

이러한 Builder 패턴은 Spring Boot에서 주로 Lombok 라이브러리를 활용하여 적용됩니다.
이번 포스팅에서도 Lombok을 사용하여 Builder 패턴을 사용하는 방법을 알아보겠습니다.

순수 코드로 구현

Builder 패턴을 구현하는 방법에는 순수 코드로 구현과 라이브러리를 사용한 구현이 있습니다.
먼저 순수 코드로 구현하는 방법을 알아보겠습니다.

Builder 패턴을 사용할 클래스

public class User {
    private String username;
    private String password;
    private String email;

    public User(String username, String password, String email) {
        this.username = username;
        this.password = password;
        this.email = email;
    }

    // Getter 메소드는 생략

    public static class Builder {
        private String username;
    	private String password;
    	private String email;

        public Builder() {
        }

        public Builder(User user) {
        	this.username = user.username;
            this.password = user.password;
            this.email = user.email;
        }
        
        public Builder username(String username) {
            this.username = username;
            return this;
        }
        
        public Builder password(String password) {
            this.password = password;
            return this;
        }

        public Builder email(String email) {
            this.email = email;
            return this;
        }

        public User build() {
            return new User(username, password, email);
        }
    }
}

위와 같이 클래스 내부에서 따로 Builder 클래스를 선언하여 사용할 수 있습니다.

Builder 패턴을 사용하여 객체 생성

public class Main {

	public static void main(String[] args) {
 
		User user = User.builder()
        .username("홍길동")
        .password("password1234")
        .email("hong@example.com")
        .build();

	}

}

객체를 생성할 때 클래스명.builder()를 입력한 후 원하는 변수들을 주입하여 합니다.
마지막으로 .build()로 객체를 생성합니다.

Lombok을 사용하여 구현

Lombok 라이브러리에 있는 @Builder 어노테이션을 사용하면 매우 간편하게 Builder 패턴을 적용시킬 수 있습니다.

Builder 패턴을 사용할 클래스

import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class User {
    private String username;
    private String password;
    private String email;
}

@Builder 어노테이션 하나만 적용시켜주면 Builder 패턴을 사용할 수 있는 클래스가 됩니다.

Builder 패턴을 사용하여 객체 생성

public class Main {

	public static void main(String[] args) {
 
		User user = User.builder()
        .username("홍길동")
        .password("password1234")
        .email("hong@example.com")
        .build();

	}

}

객체를 생성할 때 클래스명.builder()를 입력한 후 원하는 변수들을 주입하여 합니다.
마지막으로 .build()로 객체를 생성합니다.

profile
student

0개의 댓글