이런 유틸을 만들어놓고
fun <T> T?.throwIfNull(throwable: Throwable): T =
this ?: throw throwable
inline fun <T> T.throwIf(throwable: Throwable, predicate: (T) -> Boolean): T =
if (predicate(this)) throw throwable else this
fun <T> T?.defaultIfNull(default: T): T =
this ?: default
inline fun <T> T?.defaultIfNull(block: () -> T): T =
this ?: block()
이렇게 사용하면 코드를 위에서부터 아래로 차례로 읽을 수 있어 가독성이 올라간다.
fun getMember(id: MemberId): MemberDTO =
this.memberRepository
.findById(id)
.throwIfNull(MemberNotFoundException("멤버를 찾을 수 없습니다."))
.let(MemberDTO::from)