[Java] Builder Pattern

Yoon Uk·2023년 5월 31일
0

언어 - Java

목록 보기
4/5
post-thumbnail

0. Builder Pattern을 사용하기 전의 상황

Builder 패턴을 알기 전엔 DTO를 만들 때 Mapper라는 클래스를 만들어 변환해줬습니다.

public static ArticleResponseDto articleToDto(Article article) {
    ArticleDto articleDto = new ArticleDto();

    ArticleDto.setTitle(article.getTitle());
    ArticleDto.setContents(article.getContents());
    ArticleDto.setAuthor(article.getAuthor());
    ArticleDto.setCreatedAt(article.getCreatedAt());

    return ArticleDto;
}

하지만 Builder Pattern이라는 것을 알게된 뒤론

public static ArticleResponseDto articleToDto(Article article) {
    ArticleResponseDto articleDto = ArticleResponseDto.builder()
            .articleId(article.getArticleId())
            .title(article.getTitle())
            .contents(article.getContents())
            .author(article.getTitle())
            .createdAt(article.getCreatedAt())
            .build();

    return articleDto;
}

이렇게 더욱 쉽게 객체와 DTO를 변환할 수 있었습니다.

이러 경험을 이유로 Builder Pattern에 대해 정리해보았습니다.

1. Builder Pattern 이란?

Builder Pattern은 객체 생성을 단순화하고 가독성을 높이는 디자인 패턴입니다.
Builder Pattern은 생성자의 매개변수가 많거나 선택적인 경우에 유용하게 사용할 수 있습니다.

2. Builder Pattern의 장점

Builder Pattern의 장점은 다음과 같습니다.

  • 객체 생성 코드가 명확하고 이해하기 쉽습니다.
  • 생성자의 매개변수 순서에 신경 쓸 필요가 없습니다.
  • 선택적인 매개변수를 쉽게 설정할 수 있습니다.
  • 불변 객체를 만들 수 있습니다.

3. 사용 예시

Builder Pattern의 예시는 다음과 같습니다.

// Person 클래스
public class Person {
    // 필수 매개변수
    private final String name;
    private final int age;

    // 선택적 매개변수
    private final String gender;
    private final String address;
    private final String phone;

    // private 생성자
    private Person(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.gender = builder.gender;
        this.address = builder.address;
        this.phone = builder.phone;
    }

    // getter 메소드
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getGender() {
        return gender;
    }

    public String getAddress() {
        return address;
    }

    public String getPhone() {
        return phone;
    }

    // Builder 클래스
    public static class Builder {
        // 필수 매개변수
        private final String name;
        private final int age;

        // 선택적 매개변수
        private String gender = "";
        private String address = "";
        private String phone = "";

        // public 생성자
        public Builder(String name, int age) {
            this.name = name;
            this.age = age;
        }

        // setter 메소드
        public Builder gender(String gender) {
            this.gender = gender;
            return this;
        }

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

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

        // build 메소드
        public Person build() {
            return new Person(this);
        }
    }
}

// 객체 생성 예시
Person person1 = Person.Builder("김철수", 25)
                          .gender("남")
                          .address("서울")
                          .phone("010-1234-5678")
                          .build();

Person person2 = Person.Builder("이영희", 30)
                          .gender("여")
                          .build();

4. @Builder

Lombok 라이브러리가 지원해주는 @Builder 어노테이션을 사용하면 더욱 쉽게 Builder Pattern을 사용할 수 있습니다.

1) 기본 사용법

// Person 클래스
@Builder
@Getter
public class Person {
    // 필수 매개변수
    private final String name;
    private final int age;

    // 선택적 매개변수
    private final String gender;
    private final String address;
    private final String phone;
}

// 객체 생성 예시
Person person1 = Person.Builder("김철수", 25)
                          .gender("남")
                          .address("서울")
                          .phone("010-1234-5678")
                          .build();

매우 간단하게 Builder Pattern을 사용할 수 있습니다.

2) 객체의 복사본

@Builder 주석에 toBuilder = true 속성을 추가하여 객체의 복사본 또는 거의 복사본을 만들 수 있습니다.

이는 Lombok에게 toBuilder() 메소드를 클래스에 추가하도록 지시합니다.
toBuilder() 메서드를 호출하면 호출된 인스턴스의 속성으로 초기화된 빌더가 반환됩니다.

@Builder(toBuilder = true)
@Getter
public class Person {
    // 필수 매개변수
    private final String name;
    private final int age;

    // 선택적 매개변수
    private final String gender;
    private final String address;
    private final String phone;
}

Person copiedPerson = Person.builder("김철수", 25)
                          .gender("남")
                          .address("서울")
                          .phone("010-1234-5678")
                          .build();

// 복사본이 생김
Person.PersonBuilder personBuilder = copiedPerson.toBuilder();

Lombok에 의해 생성 된 빌더 클래스의 이름이 "Builder"가 추가 된 클래스와 같은 이름을 가졌음을 알 수 있습니다.

0개의 댓글