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

Builder 패턴을 사용한다면 각 변수별로 값을 세팅하기 때문에
생성자의 매개변수 순서와 개수를 기억하지 않고 유연하고 가독성 높게
객체를 생성할 수 있다.
다시 정리하지면
객체를 안전하고 가독성 있게 생성하기 위한 디자인 패턴이다.
Builder 패턴 구현 방법
해당 내용을 코드로 한 번 봐보자
이름, 비밀번호, email의 변수를 가진 USER라는 클래스가 있다고 한다면
이 USER의 Builder는 아래와 같이 만들 수 있다.
먼저 Builder 클래스를 만들고 필드 맴버를 만들고 싶은 User의 맴버 구성과 동일하게 구성한다.

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

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

전체 코드는 아래와 같다.
이렇게 만든 Builder 클래스는 아래 코드로 호출할 수 있다.
Builder 패턴의 장점
- 직관적인 객체 생성과정
생성자만 사용하여 객체를 생성하는 경우 변수가 많아지면 많아질 수록 가독성이 떨어진다.
하지만 Builder 패턴을 사용하면 직관적으로 어떤 변수에 어떤 값이 설정되는지 한눈에 알 수 있다.
이로 인해 휴먼에러를 방지할 수 있다.
요즘은 IDE에서 매개변수 미리보기 힌트 기능 들이 있기때문에 조금 나은 편이다.

- 필요한 데이터만 설정할 수 있다.
객체 생성시 값이 없어도 되는 값이 있을 수도 있다.
이럴 경우 생성자를 사용하면 선택 값에 null을 입력해주는 방식 등으로 구현해야한다.
하지만 Builder를 사용하면 선택 변수를 세팅하지 않을 수 있다.
- 불변성을 확보할 수 있다.
Builder를 사용하여 객체를 생성한다면 필요한 객체를 항상 새로 생성하기 때문에 변경가능성이 줄어들어 불변성을 확보할 수 있다.
-> 프로젝트에서 Dto에 Setter를 금지하는 것도 동일한 이유이다.
이러한 장점이 있지만 클래스를 생성할 때마다 Builder를 만들 수도 없는 노릇이다.
그래서 사용하는 것이
Lombok 라이브러리 Builder
Lombok 라이브러리에 있는 @Builder 어노테이션을 사용하면 간단하게 Builder 패턴을 클래스에 적용할 수 있다.

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

사용하는 곳에서 객체.builder().변수세팅코드.build()로 사용할 수 있다.
참고 링크
'전공공부' 카테고리의 다른 글
| Nginx란 무엇인가? (1) | 2026.01.10 |
|---|---|
| React useContext (0) | 2025.11.09 |
| React-Query useQuery와 useMutation (0) | 2025.10.12 |
| SPRING의 ioc(Inversion of Control) 와 DI (0) | 2025.09.14 |
| Transaction이란? 전파속성과 분산 트랜잭션 처리까지 (1) | 2025.08.22 |