객체생성시 @Builder 를 사용하는 이유

프로젝트

목록 보기
13/39

의문 ❓❓

서비스를 테스트하는데, 객체를 만들어야 하는 일이 생겼다.(채팅방 만들기)
근데 어떤 방식을 이용해서, 어떤 메서드를, 어디에 만들어서 이용해야 할까? 라는 궁금증을 갖고 구글링을 하게됐다.
https://hyeonic.tistory.com/191 라는 블로그를 보다가
static 메서드에 대해서 궁금해져서 아래의 두 링크를 발견했다.

  • static 기본
  • 정적 팩토리 메서드
  • 정적 팩토리 메서드 : 객체 생성을 캡슐화하는 기법
    그리고 전에 했던 프로젝트에서 @Builder를 사용했는데 정확한 이유를 몰라서 이를 찾아봤다.

Builder? → 진짜 설명 잘돼있음

  • 객체를 생성하기 위해서는 생성자 패턴, 정적(static) 메소드 패턴, 수정자(setter) 패턴, 빌더 패턴 등을 사용할 수 있다.

[ 빌더 패턴(Builder Pattern)의 장점 ]

  • 필요한 데이터만 설정할 수 있음
    • 생성자나 정적 메소드를 이용하는 경우라면 우리는 더미 값을 넣어주거나, 필요없는 데이터의 생성자를 새로 만들어주어야 한다.
    • 빌더는 필요한 데이터만 설정할 수 있다.
  • 유연성을 확보할 수 있음
  • 가독성을 높일 수 있음
  • 변경 가능성을 최소화할 수 있음
    • setter 사용안해도 된다.

➡︎ @Setter
➡︎➡︎ Setter를 구현한다는 것은 불필요하게 변경 가능성을 열어두는 것이다.
이는 유지보수 시에 값이 할당된 지점을 찾기 힘들게 만들며 불필요한 코드 리딩 등을 유발한다.
만약 값을 할당하는 시점이 객체의 생성뿐이라면 객체에 잘못된 값이 들어왔을 때 그 지점을 찾기 쉬우므로 유지보수성이 훨씬 높아질 것이다.
그렇기 때문에 클래스 변수는 변경 가능성을 최소화하는 것이 좋다.
➡︎💡변경 가능성을 최소화하는 가장 좋은 방법은 변수를 final로 선언함으로써 불변성을 확보하는 것이다.


그래서 결국 Builder 사용

https://johngrib.github.io/wiki/pattern/builder/

  • 위는 빌더 패턴의 종류에 대해서 설명하고 있다.
  • 내가 사용할 것은 이펙티브 자바에서 설명하는 빌더패턴에서 조금 더 쉽게 쓸 수 있는 Lombok의 @Builder 어노테이션을 이용할 것이다.
    -> 클래스 선언부에 달지 않기!! 메서드에 달기~!

  • builder 패턴(이펙티브 자바 스타일)의 장점은
    • 각 인자가 어떤 의미인지 알기 쉽다.
    • setter 메소드가 없으므로 변경 불가능 객체를 만들 수 있다.
    • 한 번에 객체를 생성하므로 객체 일관성이 깨지지 않는다.
    • build() 함수가 잘못된 값이 입력되었는지 검증하게 할 수도 있다.

  • 대부분의 경우에는 빌더 패턴을 적용하는 것이 좋다. 그러나 변수가 늘어날 가능성이 거의 없으며, 변수의 개수가 2개 이하인 경우에는 정적 팩토리 메소드를 사용하는 것이 더 좋을 수도 있다.
    빌더의 남용은 오히려 코드를 비대하게 만들 수 있으므로 변수의 개수와 변경 가능성 등을 중점적으로 보고 빌더 패턴을 적용할지 판단하면 된다.

dto에도 빌더를 넣고 엔티티에도 builder를 넣어야하는가?

dto를 만드는 이유가 직접적으로 entity에 접근하지 않도록 하는것이 아닌가..?

  • Client의 요청을 Controller로 통해 @RequestBody를 붙여 DTO로 받아오게 되는데(ObjectMapper가 바인딩하여 deSerialize(역직렬화)통해 JSON을 DTO로 가져온다.)
    ➡︎➡︎ RequestBody, ResponseBody가 이 역할을 해줌 (RestController 포함)

이때 받아온 DTO를 Service에 보내주게 되면 거기서 Service가 DTO에서 데이터들을 get해와서 그걸 엔티티에 설정해놓은 Builder로 데이터를 주입해주는 것이다.

  • DTO에서도 값을 DB에서 꺼내와서 Controller에 보내줘야 할 때(응답)만 Builder를 사용하는 것이고,
    컨트롤러를 통해 요청이 들어와서 엔티티에 보내줄 때는 DTO에 Builder가 필요없는 것이였다.
    ➡︎ 때에 따라서 DTO에 Builder를 붙여주는 것이고, 엔티티객체를 만들기 위해선 엔티티 클래스Builder는 무조건 존재해야 했던 것이다.....!
profile
백엔드를 공부하고 있습니다.

0개의 댓글