Post

Builder 패턴을 써야되는 이유

프로젝트를 진행하다 builder 패턴을 적용하면서 배운 것들을 정리한 글이다.

문제점

처음 JPA를 프로젝트에 사용하면서 Entity 객체의 생성에 많은 제약이 필요하다는 점을 배웠다.

그래서 처음에는 생성자를 private를 막아 캡슐화 한 뒤 팩토리 메서드를 사용해 create method를 구현했다.

생성자 + 팩토리 메서드 (생성자와 정적 팩터리 메서드)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private Board(Member member, String title, String content, int price, LocalDate meetingTime, Point point) {
        this.point = point;
        this.member = member;
        this.title = title;
        this.content = content;
        this.price = price;
        this.meetingTime = meetingTime;
        status = BoardStatus.RECRUITING;
    }

    /**
     * Board 생성 메서드
     */
    public static Board createBoard(Member member, String title, String content, int price, LocalDate meetingTime) {
        Board board = new Board(title, content, price, meetingTime);
        board.member = member;
        return board;
    }

근데 이런 식으로 구현하자니 Entity에 필드가 추가되거나 객체 생성 시 생성자에 넘길 값이 바뀔 때마다 새로운 생성자를 구현하고 팩토리 메서드를 수정해야되므로 ocp에 위반된다고 생각해 다른 방식을 찾아야했다.

그래서 생각한 방식이 팩토리 메서드를 사용하지 않고 필요한 생성자를 그때 그때 만들려고 했다.

생성자 생성 (점층적 생성자 패턴)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public Board(Member member, String title, String content, int price, LocalDate meetingTime, Point point) {
        this.point = point;
        this.member = member;
        this.title = title;
        this.content = content;
        this.price = price;
        this.meetingTime = meetingTime;
        status = BoardStatus.RECRUITING;
    }

public Board(Member member, String title) {
    this.member = member;
    this.title = title;
}
// 계속 생성 ....

근데 이런 방식을 적용하자니 번거로움이 크고 데이터가 많아지면 많아질수록 생성자가 늘어난다는 점이 문제였다. 그래서 찾은 방식이 Builder 패턴을 적용하는 것이었다.

Builder 패턴 적용

이펙티브 자바에서 사용하는 Builder 패턴을 사용해 리펙토링 했다.

1
2
3
4
5
6
7
8
9
10
@Builder
    public Board(Member member, String title, String content, int price, LocalDate meetingTime, Point point) {
        this.point = point;
        this.member = member;
        this.title = title;
        this.content = content;
        this.price = price;
        this.meetingTime = meetingTime;
        status = BoardStatus.RECRUITING;
    }

빌더 패턴의 가장 큰 특징은 불변성에 있다. Builder의 경우도 setter와 비슷한 역할을 하는 메서드들이 존재하는데 가장 큰 차이점은 바로 불변성이다. 빌더 패턴의 경우 객체 생성 전 값을 넣기 때문에 만드는 객체의 상태가 다른 곳에서 변경될 여지가 적어 안정성이 올라간다는 장점이 있다.

물론 Builder 패턴에도 단점이 있다.

성능과 코드가 복잡해 보인다는 것인데 그래서 생성자에 파라미터가 많으면 Builder 패턴을 사용하고 적으면 생성자 or 팩토리 메소드를 적용하는 방식을 적용하자.

Builder 패턴에 대해 좀 더 자세히 공부해야겠다…

This post is licensed under CC BY 4.0 by the author.