결론
Kotlin 에서는 Builder 패턴 필요 없다!
이전에 코드로 배우는 SpringBoot
책을 통해 실습을 진행하는데, 아래와 같은 형태의 코드가 있었다.
SomeClass inst = SomeClass.builder()
.param1(val1)
.param2(val2)
.build()
그리고 현재, Kotlin + Spring boot 프로젝트를 진행하면서 Exception 처리
를 위해 블로그를 찾아보고 있었다. https://bcp0109.tistory.com/303 블로그를 인용했는데, 블로그에 이런 부분이 있었다.
근데 나는 ErrorResponse.builder()
에서 오류가 발생했다. builder()
메소드를 찾을 수 없다는 이유였다.
https://readystory.tistory.com/121 << 블로그가 설명을 너무 잘 해놨기 때문에, Builder패턴의 정의에 대해서는 위 블로그를 참조하는 것이 이해가 빠를 것이다.
생성자가 복잡한 경우, 인스턴스를 편리하게 생성할 수 있다.
Class의 생성자의 개수가 많다면? 어떤 변수에 어떤 값을 넣고 있는지 헷갈리는 상황이 발생할 수 있다.
Builder 패턴을 사용하면 어떤 변수에 어떤 값을 쓰고있는지 명확하게 할 수 있다.
상황에 따라 사용하지 않는 생성자가 있을 수 있다. null을 전달하자니 지저분하기도 하다.
Builder 패턴을 사용하면, 필요한 Parameter만 설정 후, build() 를 통해 객체를 생성할 수 있다.
결론부터 말하자면, Kotlin에서 Builder 패턴은 필요 없다.
kotlin은 생성자를 만들 때, 생성자 변수 명을 명시
할 수 있다.
실제로, 위 0. 배경
에 있던 코드를 이렇게 작성했다.
클래스에 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