티스토리 뷰

반응형

Builder 패턴?

  Builder 패턴은 생성 패턴(creational pattern)의 한 종류이다. 해당 패턴은 복잡한 객체를 생성하는데 도움을 준다.

 

Lombok 빌더

  Lombok에서는 @Builder라는 어노테이션을 통해서 빌더를 지원해준다.

Book 클래스

  Book 클래스는 title, price 2개의 필드만 가지는 간단한 클래스이다. 이 클래스에 @Builder 어노테이션을 적용했을 때, 어떻게 빌더 패턴이 적용되는지 확인하겠다.

public class Book {
    String title;
    Integer price;

    Book(String title, Integer price) {
        this.title = title;
        this.price = price;
    }

    public static Book.BookBuilder builder() {
        return new Book.BookBuilder();
    }

    public static class BookBuilder {
        private String title;
        private Integer price;

        BookBuilder() {
        }

        public Book.BookBuilder title(String title) {
            this.title = title;
            return this;
        }

        public Book.BookBuilder price(Integer price) {
            this.price = price;
            return this;
        }

        public Book build() {
            return new Book(this.title, this.price);
        }

        public String toString() {
            return "Book.BookBuilder(title=" + this.title + ", price=" + this.price + ")";
        }
    }
}

  빌더 어노테이션이 적용되고 나서의 코드이다. 클래스 안에 Builder 클래스가 생성된다. 그리고 이 빌더 클래스는 필드명과 동일한 메서드를 가지고, 메서드에서 값을 설정하고 자기 자신 this를 리턴한다. 이렇게 this를 리턴함으로써 체인 형태로 값을 설정할 수 있다.

 

Builder를 사용해서 객체를 생성한 코드

  빌더 패턴에서 객체를 생성하는 방법은 맨 처음에는 빌더 객체를 생성해줘야 한다. 그래서 builder() 메서드가 제일 앞에 온다. 그 다음에는 필드 값을 설정한다. 그리고 최종적으로 builder() 메서드를 호출해줘야 객체를 생성할 수 있다.

 

빌더의 단점

  빌더 패턴의 단점으로는 객체 생성을 하기 위해서는 빌더가 필요하다는 단점이 있다. 위의 코드를 보면 코드가 복잡해 진 것을 확인할 수 있다.

 

빌더 사용 이유

  코드가 복잡해지지만, 빌더를 사용하는 이유가 있다.

  클래스의 생성자의 필드가 10개라고 가정해 보자. 그럼 클래스를 사용해서 인스턴스를 생성할 때 10개의 필드를 모두 작성해 줘야 한다. 이런 경우 필드에 실수로 잘못된 값을 넣을 수도 있다. 그리고 생성자를 확인하여 해당 위치에는 어떤 필드를 채워야 하는지 확인해야 한다. 생성자에서 N번깨 필드가 문자열, 그리고 그 다음 N+1번째 필드가 문자열일 때 N+1번째 필드에 N번째 필드에 들어갈 값을 넣어도 컴파일 시점에 실수를 잡지 못할 수도 있다. 이런 경우에 Builder 패턴을 사용하면 유용하다.

  또 다른 경우 클래스의 필드를 모두 사용하지 않는 객체를 생성할 때이다. 이런 경우에도 생성자를 여러개 선언하는 것 보다는 빌더 패턴을 사용해서 필요한 필드만 사용하면 된다. 이런 경우 setter을 사용해서 값을 설정할 수도 있다. Java에서는 setXxx 메서드를 사용해서 객체의 값을 설정하는데 이렇게 하면 체인 형태로 값을 설정할 수 없다. 이 경우 빌더로 객체를 생성하는 것이 코드의 양도 더 적다.

 

참고 자료

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함