[kotlin] 코틀린 빌더 패턴을 사용한 의존성 주입(Dependency Injection) 방법

의존성 주입(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 객체를 생성합니다.

결론

코틀린에서 빌더 패턴을 사용한 의존성 주입은 객체 생성과 의존성 주입 과정을 분리하여 코드의 유지 보수성과 테스트 용이성을 향상시킬 수 있습니다. 위에서 소개한 방법을 참고하여 의존성 주입을 구현해보세요.

참고 자료