Developing Myself Everyday

의존성 주입이란?


 객체는 다른 객체와 상호작용하면서 필요한 다른 객체에 의존한다. 이러한 의존 관계는 코드를 작성할 때 자연스럽게 발생하는데, 이러한 의존성이 많아지면 코드의 유지보수성이 떨어지고, 객체를 재사용하기 어려워진다. 

 

 이 때, 의존성 주입은 객체 간의 결합도를 낮추기 위해, 객체를 생성하는 시점에 필요한 의존성 객체를 외부에서 전달받는 방식이다. 즉, 객체 내부에서 직접 의존 객체를 생성하지 않고, 외부에서 전달받아 사용한다.

 

 의존성 주입은 크게 3가지 방법이 존재한다.

  1. 생성자 주입(Constructor Injection): 생성자를 통해 의존 객체를 전달받는다.
  2. 세터 주입(Setter Injection): 세터 메서드를 통해 의존 객체를 전달받는다.
  3. 필드 주입(Field Injection): 필드를 통해 의존 객체를 전달받는다.

 의존성 주입은 코드의 가독성과 유지보수성을 높이고, 객체 간의 결합도를 낮추어 유연성과 확장성을 높이는 데 도움이 된다. 또한, 의존 객체를 모듈화하여 단위 테스트를 수행하기도 용이하다. 따라서, 의존성 주입은 현대적인 소프트웨어 개발 방법론에서 필수적인 개념 중 하나이다.

 

 

 

생성자 주입


class UserServiceImpl(private val userRepository: UserRepository) : UserService {
    override fun getUser(userId: String): User {
        return userRepository.getUser(userId)
    }
}

 위의 코드에서 UserServiceImpl 클래스는 UserRepository 인터페이스에 의존한다. 하지만 이 클래스에서는 직접 UserRepository 객체를 생성하지 않고, 생성자 파라미터로 의존 객체를 전달받는다. 이렇게 의존 객체를 생성자로 전달받으면, UserServiceImpl 클래스가 UserRepository 클래스에 의존하게 된다.]. 이를 생성자 주입(Constructor Injection)이라고 한다.

 

세터 주입


class UserServiceImpl : UserService {

    private lateinit var userRepository: UserRepository

    fun setUserRepository(userRepository: UserRepository) {
        this.userRepository = userRepository
    }

    override fun getUser(userId: String): User {
        return userRepository.getUser(userId)
    }
}

 

 위 코드에서 UserServiceImpl 클래스의 setUserRepository 메서드를 통해 UserRepository 객체를 주입받는다. 

 

 

필드 주입


class UserServiceImpl : UserService {

    @Inject
    lateinit var userRepository: UserRepository

    override fun getUser(userId: String): User {
        return userRepository.getUser(userId)
    }
}

 

 위 코드에서 @Inject 어노테이션을 사용하여 UserRepository 객체를 주입받는다. 이렇게 필드 주입을 사용하면 코드가 간결해지지만, 생성자나 세터 메서드를 통한 주입 방식에 비해 가독성이 떨어진다.

 

결론


 의존성 주입의 3가지 방법중 가독성이 가장 좋은 방식은 생성자 주입 방식이다. 가독성이 좋다는 말은 개발자들이 이 방식을 사용하는 것이 가장 좋다는 의미도 된다. 그러므로 가능하면 생성자 주입 방식을 사용하도록 하자.

'기타' 카테고리의 다른 글

객체 지향 프로그래밍이란?? by Kotlin  (1) 2023.09.26
CI / CD  (0) 2023.05.29
DAO, DTO, VO란?  (0) 2023.05.15
가독성이 좋은 코드를 작성해야 하는 이유  (0) 2023.03.25
profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!