이번 프록젝트에서 Spring boot + mybatis를 사용하는데
DTO에 Lombok 라이브러리의 Setter를 사용하면 build 오류가 나는 규칙이 있어서
왜 Setter를 금지하고 대신 Builder를 권장할까? 라는 의문에서 이번 공부를 시작했다.
Builder 패턴은 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 해주는 패턴이다.
이게 무슨 뜻이냐?

개발을 하다보면 생성자에 여러 인수가 들어가야 하는데
많은 매개변수의 순서를 기억하기 어렵고 가독성이 떨어지게 된다.
이 경우 사용하기 좋은 패턴이 Builder 패턴이다.

Builder 패턴을 사용한다면 각 변수별로 값을 세팅하기 때문에
생성자의 매개변수 순서와 개수를 기억하지 않고 유연하고 가독성 높게
객체를 생성할 수 있다.
다시 정리하지면
객체를 안전하고 가독성 있게 생성하기 위한 디자인 패턴이다.
해당 내용을 코드로 한 번 봐보자

이름, 비밀번호, email의 변수를 가진 USER라는 클래스가 있다고 한다면
이 USER의 Builder는 아래와 같이 만들 수 있다.
먼저 Builder 클래스를 만들고 필드 맴버를 만들고 싶은 User의 맴버 구성과 동일하게 구성한다.

그리고 각 맴버에 대한 Setter 함수를 구현한다.

가독성을 위해 set 키워드를 제외하고 변수명으로 setter 함수를 구성했다.
이때 return this를 하여 Builder 자신을 리턴한다.
이를 통해 매서드 호출 후 연속적으로 빌더 베서드를 체이닝하여 호출할 수 있다.

마지막으로 return값으로 원하는 User 객체를 만들어주는 build 함수를 만들어준다.

전체 코드는 아래와 같다.

이렇게 만든 Builder 클래스는 아래 코드로 호출할 수 있다.

생성자만 사용하여 객체를 생성하는 경우 변수가 많아지면 많아질 수록 가독성이 떨어진다.

하지만 Builder 패턴을 사용하면 직관적으로 어떤 변수에 어떤 값이 설정되는지 한눈에 알 수 있다.
이로 인해 휴먼에러를 방지할 수 있다.
요즘은 IDE에서 매개변수 미리보기 힌트 기능 들이 있기때문에 조금 나은 편이다.

객체 생성시 값이 없어도 되는 값이 있을 수도 있다.
이럴 경우 생성자를 사용하면 선택 값에 null을 입력해주는 방식 등으로 구현해야한다.
하지만 Builder를 사용하면 선택 변수를 세팅하지 않을 수 있다.

이러한 장점이 있지만 클래스를 생성할 때마다 Builder를 만들 수도 없는 노릇이다.
그래서 사용하는 것이
Lombok 라이브러리에 있는 @Builder 어노테이션을 사용하면 간단하게 Builder 패턴을 클래스에 적용할 수 있다.

Dto 클래스에 @Builder 어노테이션을 추가하고

사용하는 곳에서 객체.builder().변수세팅코드.build()로 사용할 수 있다.