의존성 주입(Dependency Injection)은 객체 간의 의존성을 외부에서 주입하는 방식으로, 코드의 유지 보수성과 테스트 용이성을 향상시키는데 도움을 줍니다. 코틀린에서는 빌더 패턴을 사용하여 의존성 주입을 구현할 수 있습니다. 이번 포스트에서는 코틀린에서의 빌더 패턴을 활용한 의존성 주입 방법을 살펴보겠습니다.
빌더 패턴 소개
빌더 패턴은 객체의 생성과정을 단계별로 분리하여 조립하는 패턴입니다. 이를 통해 복잡한 객체를 생성하고 조작할 수 있습니다. 코틀린에서는 apply
람다를 이용하여 빌더 패턴을 구현할 수 있습니다.
의존성 주입 방법
코틀린에서 의존성 주입을 구현하기 위해 다음과 같은 단계를 거칠 수 있습니다.
1. 의존성 주입을 받을 클래스 작성
의존성 주입을 받을 클래스를 작성합니다. 이 클래스는 의존성을 받을 멤버 변수를 가지고 있어야 합니다. 예를 들어, 다음과 같이 UserService
클래스를 작성해보겠습니다.
class UserService(private val userRepository: UserRepository) {
// 클래스 내부에서 userRepository를 사용하는 로직 작성
}
2. 의존성을 주입할 빌더 클래스 작성
의존성을 주입할 빌더 클래스를 작성합니다. 이 클래스는 빌더 패턴을 사용하여 의존성을 주입할 객체를 생성하고 조립합니다. 예를 들어, 다음과 같이 UserServiceBuilder
클래스를 작성해보겠습니다.
class UserServiceBuilder {
private var userRepository: UserRepository? = null
fun userRepository(userRepository: UserRepository) = apply {
this.userRepository = userRepository
}
fun build(): UserService {
return UserService(userRepository ?: throw IllegalStateException("UserRepository must be set"))
}
}
userRepository
메서드는 UserRepository
객체를 받아 현재 빌더 클래스에 저장합니다. build
메서드는 저장된 의존성 주입 객체(UserRepository
)를 이용하여 UserService
객체를 생성하여 반환합니다. 단, userRepository
가 null인 경우 예외를 발생시킵니다.
3. 의존성 주입 객체 생성
빌더 클래스를 이용하여 의존성 주입 객체를 생성합니다. 예를 들어, 다음과 같이 main
함수에서 UserService
객체를 생성해보겠습니다.
fun main() {
val userRepository = UserRepository()
val userService = UserServiceBuilder().userRepository(userRepository).build()
// userService를 이용한 로직 작성
}
UserRepository
객체를 생성하여 userRepository
메서드를 통해 UserServiceBuilder
에 주입하고, build
메서드를 호출하여 UserService
객체를 생성합니다.
결론
코틀린에서 빌더 패턴을 사용한 의존성 주입은 객체 생성과 의존성 주입 과정을 분리하여 코드의 유지 보수성과 테스트 용이성을 향상시킬 수 있습니다. 위에서 소개한 방법을 참고하여 의존성 주입을 구현해보세요.