Kotlin과 Builder 패턴

조갱·2022년 2월 20일
1

kotlin

목록 보기
1/12

결론
Kotlin 에서는 Builder 패턴 필요 없다!

0. 배경

이전에 코드로 배우는 SpringBoot 책을 통해 실습을 진행하는데, 아래와 같은 형태의 코드가 있었다.

SomeClass inst = SomeClass.builder()
                 .param1(val1)
                 .param2(val2)
                 .build()

그리고 현재, Kotlin + Spring boot 프로젝트를 진행하면서 Exception 처리를 위해 블로그를 찾아보고 있었다. https://bcp0109.tistory.com/303 블로그를 인용했는데, 블로그에 이런 부분이 있었다.

근데 나는 ErrorResponse.builder() 에서 오류가 발생했다. builder()메소드를 찾을 수 없다는 이유였다.

1. Builder 패턴이란?

https://readystory.tistory.com/121 << 블로그가 설명을 너무 잘 해놨기 때문에, Builder패턴의 정의에 대해서는 위 블로그를 참조하는 것이 이해가 빠를 것이다.

2. Builder 패턴을 사용하는 이유

생성자가 복잡한 경우, 인스턴스를 편리하게 생성할 수 있다.

2-1. 어떤 변수에 어떤 값을 쓰고있는지 명확

Class의 생성자의 개수가 많다면? 어떤 변수에 어떤 값을 넣고 있는지 헷갈리는 상황이 발생할 수 있다.

Builder 패턴을 사용하면 어떤 변수에 어떤 값을 쓰고있는지 명확하게 할 수 있다.

2-2. 필요한 Parameter만 전달 가능

상황에 따라 사용하지 않는 생성자가 있을 수 있다. null을 전달하자니 지저분하기도 하다.

Builder 패턴을 사용하면, 필요한 Parameter만 설정 후, build() 를 통해 객체를 생성할 수 있다.

3. Kotlin과 Builder 패턴

결론부터 말하자면, Kotlin에서 Builder 패턴은 필요 없다.

3-1. 어떤 변수에 어떤 값을 쓰고 있는지 명확

kotlin은 생성자를 만들 때, 생성자 변수 명을 명시할 수 있다.
실제로, 위 0. 배경에 있던 코드를 이렇게 작성했다.

3-2. 필요한 Parameter만 전달 가능

클래스에 Default Value를 정의함으로써 해결 가능하다.

data class ErrorResponse(
    val timestamp: LocalDateTime = LocalDateTime.now(),
    val status: Int = 500,
    val error: String = "서버 내부 오류",
    val code: String = "INTERNAL_SERVER_ERROR",
    val message: String = "서버에서 오류가 발생했습니다.",
)

와 같이 ErrorResponse를 작성한다면, 아무런 변수에 값을 할당하지 않는 경우 500에러를 뱉게 된다.
물론, 필수값에 대해서는 ErrorResponse 클래스에 Default Value를 정의하지 않고 반드시 생성자로 받게 할 수도 있다.

3-1의 예제 코드를 보면, timestamp 는 인자로 전달하지 않았음을 확인할 수 있다.

Reference :
Builder Pattern : https://readystory.tistory.com/121

profile
A fast learner.

0개의 댓글