Lombok의 Builder 패턴을 반복적으로 사용하면서 빌더 패턴이 정확히 무언인지 궁금해서 조사해보게 되었다.
빌더 패턴이란?
빌더 패턴은 복잡한 객체들을 단계별로 생성할 수 있게하여, 다양한 구성의 인스턴스를 만드는 디자인 패턴이다.
예를 들어 음료 제조 레시피를 들 수 있다. 예를 들어 커피를 제작하려고 한다고 생각해보자. 같은 커피 음료라는 분류 속에서도, 아메리카노, 에스프레소부터 해서 카페 라떼까지, 손님에 따라 주문하는 원두의 종류도 다르고 각 음료의 레시피도 분명히 다를 것이다.

만약 위의 상황을 코드로 구현해보자 한다면, 커피 음료라는 큰 상위 객체(인스턴스)를 만들려고 생각할 것이다. 그리고 음료 제조에 들어가는 재료들을 객체의 속성으로 포함시킬 것이다. 그리고 음료 제조시마다 생성자를 통해 새로 커피 객체를 생성할 것이다. 그런데 생각해보면 우유라는 재료는 라떼류에는 들어가지만, 그 외의 음료에는 들어가지 않는다. 이처럼 만들려는 음료의 종류에 따라 해당 객체 생성 시, 필요한 요소와 그렇지 않은 요소가 존재한다. 그럼 매번 새로 만들 객체의 필요 속성에 따라 각기 다른 개수와 종류의 매개변수를 갖는 생성자를 만들어 놔야 할까? 이 지점이 바로 빌터 패턴이 필요한 이유라고 할 수 있다.
빌터 패턴은 자신의 클래스에서 객체 생성 코드를 추출하여 builders(건축업자들)라는 별도의 객체들로 이동하도록 제안한다. 즉 객체별로 각기 다른 생성자를 미리 정의할 필요없이 사용자의 입맛에 따라 객체의 특정 설정을 제작하는데 필요한 단계들만 호출하면 된다. 여기서 전제는 빌더 패턴을 쓰는 객체에는 가능한 모든 속성이 미리 정의되어 있어야 한다는 점이다. 추가적으로 빌더는 제품이 생성되는 동안 다른 객체들이 해당 객체에 접근하는 것을 허용하지 않는다.
<롬복의 빌더 패턴>
@Builder 주석이 달린 생성자/메서드에 모든 필드를 인수로 사용하여 패키지 전용 생성자를 생성한다고 한다. 때문에 @AllArgsConstructor가 있는 것으로 가정하고 이를 사용하는 코드를 생성하기에 @NoArgsConstructor 만 붙여주고 @Builder를 사용한다면 반드시 @AllArgsConstructor 어노테이션을 붙여줘야 한다.