인프런 커뮤니티 질문&답변

백엔드 주니어 개발자님의 프로필 이미지

작성한 질문수

실전! 코틀린과 스프링 부트로 도서관리 애플리케이션 개발하기 (Java 프로젝트 리팩토링)

21강. 책의 분야 추가하기

코틀린에서 builder 패턴은 사용하지 않나요?

작성

·

1.9K

2

강사 님께서는 객체를 인스턴스화 하실 때, 생성자를 사용하거나, 정적 팩토리 메서드를 사용하는 방식 2가지를 이용하셨는데 혹시 코틀린에서 builder 패턴을 사용하는건 어떻게 생각하시나요??

defalut 파라미터를 이용하고 naming을 통해 builder패턴 처럼 사용할 수 는 있겠지만 java에서 builder패턴을 통해 객체를 만들었던 것에 비하면 불편하다는 생각이듭니다.

조언 해주시면 감사하겠습니다.

답변 2

2

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요, 백엔드 개발자 취준생님!! 좋은 질문 감사드립니다! 😊

 

결론부터 말씀드리면, builder 패턴을 사용할 수 있기는 합니다!

다만, 개인적으로는 builder 패턴에 비해 default 파라미터와 named argument를 사용해 빌더 패턴을 대체하는 것을 선호하는 편입니다.

 

그 이유는 제가 느끼기에 (사람마다 다를 수 있어요!!) builder 패턴을 사용하는 것보다 편리하기 때문인데요! 예를 들어 빌더패턴을 쓰려면 다음과 같은 작업을 해주어야 합니다.

@Builder
public class ADto {
  private String name;
  private String hobby;
  private int number;
}

먼저 롬복의 빌더를 붙여 줘야 하죠! 심지어 만약 name, body, number에 대한 빌더가 아니라 특정 2가지 필드에 대해서만 빌더를 만들고 싶다면, 아래와 같이 추가적인 생성자를 만들고 빌더 어노테이션을 붙여줘야 합니다.

public class ADto {
  private String name;
  private String hobby;
  private int number;

  @Builder
  public ADto(String name, String hobby) {
    this.name = name;
    this.hobby = hobby;
  }
}

또한 빌더를 사용할 때는

ADto.builder()
  .name("Stark")
  .hobby("Coding")
  .build()

와 같이 약간의 보일러 템플릿 코드가 들어가게 됩니다!

 

반면, 코틀린에서는 빌더를 쓰지 않고.

class ADto(
  val name: String,
  val hobby: String,
  val number: Int
)
ADto(
  name = "Stark",
  hobby = "Coding",
)

빌더와 굉장히 유사한 방법으로 객체를 편하게 만들 수 있다보니, 이 방법을 선호하는 것 같습니다.

물론 저도 코틀린을 처음 접할 때는 빌더 패턴이 조금 더 익숙하다 보니 이런 방법이 어색하게 느껴졌던 것 같아요!!

 

결론을 정리드려보면,

  • Kotlin에서도 builder 패턴을 쓸 수 있다고 생각합니다.

  • 다만 이 경우 직접 빌더를 만들어 주거나 적절한 라이브러리를 써야할 것 같아요!

  • 개인적으로는 builder 패턴 보다는 생성자를 쓰건~ 정적 팩토리 메소드를 쓰건~ named argument를 선호합니다.

 

답변이 도움이 되었으면 좋겠습니다.

감사합니다!!! 😊 🙇

0

답변 감사합니다!ㅎㅎ