이번 포스팅은 코틀린의 by키워드입니다.
제가 자바에서 코틀린으로 언어를 변경하면서 가장 만족하면서 쓰고있는 기능중 하나입니다.
디자인 패턴중 위임패턴을 굉장히 쉽게 사용하게 하여주는 키워드입니다.
사용법은 간단합니다
interface Address {
val zipCode: String
val address1: String
val address2: String
fun fullAddress() = "$zipCode $address1 $address2"
}
data class AddressModel(
override val zipCode: String,
override val address1: String,
override val address2: String
) : Address
data class Restaurant(
val name: String,
private val address: Address
) : Address by address
주소기능을 사용하는 식당이 있다고 가정하겠습니다.
address를 프로퍼티로 들고 있는 방법도있지만 주소객체를 식당객체에 위임하겠습니다.
internal class RestaurantTest{
private val restaurant: Restaurant = Restaurant(
name = "테스트토랑",
address = AddressModel(
zipCode = "01234",
address1 = "지구",
address2 = "어딘가"
)
)
@Test
fun test(){
println(restaurant.fullAddress())
println(restaurant.zipCode)
println(restaurant.address1)
println(restaurant.address2)
println(restaurant.name)
}
}
보시면 식당객체에서 주소객체의 프로퍼티에 직접 접근이 가능해집니다.
보시면 마법은 없습니다.
결국 구현된것을 보면, 메소드에 인자로 전달받은 객체와 동일한 이름의 메소드를 호출하도록 구현되어 있는 것을 확인할 수 있습니다.
이러한 단순한 보일러플레이트 코드들을 줄여주는것이 By의 역할이라 보시면 됩니다.
저의 경우 실무에서 애용하는 방법은 jpaRepository같은 외부에서 구현객체를 조립하는 경우와 많이 씁니다
코드로 보면 다음과 같습니다
interface AuthorJpaDao : JpaRepository<AuthorEntity, Long>
class AuthorDao(
private val authorJpaDao: AuthorJpaDao
) : AuthorJpaDao by authorJpaDao
이렇게되면 AuthorDao만 주입을 받아도 JpaRepository의 기능들과 AuthorDao에서 구현한 기능들을 한 객체로 사용 할 수 있게됩니다.