Spring boot에서 왜 Dto에 Setter를 금지하는가?

이아름·2025년 10월 25일
0

이번 프록젝트에서 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 패턴의 장점

  1. 직관적인 객체 생성과정

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

하지만 Builder 패턴을 사용하면 직관적으로 어떤 변수에 어떤 값이 설정되는지 한눈에 알 수 있다.
이로 인해 휴먼에러를 방지할 수 있다.

요즘은 IDE에서 매개변수 미리보기 힌트 기능 들이 있기때문에 조금 나은 편이다.

예시 이미지 출처 :Inpa Dev

  1. 필요한 데이터만 설정할 수 있다.

객체 생성시 값이 없어도 되는 값이 있을 수도 있다.

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

  1. 불변성을 확보할 수 있다.
    Builder를 사용하여 객체를 생성한다면 필요한 객체를 항상 새로 생성하기 때문에 변경가능성이 줄어들어 불변성을 확보할 수 있다.
    -> 프로젝트에서 Dto에 Setter를 금지하는 것도 동일한 이유이다.

이러한 장점이 있지만 클래스를 생성할 때마다 Builder를 만들 수도 없는 노릇이다.
그래서 사용하는 것이

Lombok 라이브러리 Builder

Lombok 라이브러리에 있는 @Builder 어노테이션을 사용하면 간단하게 Builder 패턴을 클래스에 적용할 수 있다.


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

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

참고 링크

https://velog.io/@2jjong/Spring-Boot-%EA%B0%9D%EC%B2%B4-%EC%83%9D%EC%84%B1%EA%B3%BC-Builder-%ED%8C%A8%ED%84%B4

https://inpa.tistory.com/entry/GOF-%F0%9F%92%A0-%EB%B9%8C%EB%8D%94Builder-%ED%8C%A8%ED%84%B4-%EB%81%9D%ED%8C%90%EC%99%95-%EC%A0%95%EB%A6%AC

profile
반갑습니다

0개의 댓글