본문 바로가기

Programming/Java & JSP & Spring

[Spring] DI - 빈 주입하기 With Kotlin

Spring에서는 빈을 주입하는 방법은 세가지가 있다.

  1. Field
  2. Setter
  3. Constructor

Field

우선 첫번째 방법으로는@Autowired 어노테이션을 이용하여 주입하는 방법이다.

@Service 
class UserService { 
	@Autowired 
    private lateinit var userRepository: UserRepository 
    
    ... // Business Logic 
}

Constructor

다른 방법으로는 생성자에 주입할 객체를 파라미터로 작성하는 방법이다.

@Service 
class UserService(private val userRepository: UserRepository) { 
   ... // Business Logic 
}

위의 UserService 클래스처럼 생성자가 하나일 경우 @Autowired 어노테이션을 생략할 수 있다.

Setter

@Service class UserService { 
   private var userRepository: UserRepository 
   
   @Autowired 
   fun setRepository(userRepository: UserRepository) { 
      this.userRepository = userRepository 
   } 
}

Field vs Constructor vs Setter

가독성

Field > Constructor > Setter

불변성

불변성을 가지게 하는 방법으로는 Constructor 방법으로만 가능하다.

그 예시로 위 예제를 보면, Constructor 방법을 제외하곤 모두 mutable한 var 를 사용한 것을 볼 수 있다.

안전성

스프링 프레임워크에서는 @Autowired 에 의해 안전성있게 주입되지만, 스프링 프레임워크를 넘어서는 인스턴스화되는 안전성을 보자면 Constructor방법이 제일 안전하다.

 

Field @Autowired 주입하는 방법은 스프링 프레임워크에 종속되는 단점(Bean을 컨테이너에서 가져와야하므로)이 있다.

또한, Constructor 통해 주입하므로 많은 클래스가 주입되면 코드가 지저분해진다.

이렇게 되면 단일책임원칙을 못지키고 있구나라는걸 알게되고 리팩토링에 도움을 준다.

 

여기서 Constructor를 사용할 때 Circular Dependencies 가 발생할 수 있다.

회피 방법으로 Setter와 Field 주입방법을 이용하기도 하지만, 말그대로 회피하기 위해 Setter와 Field를 사용하는 것이지 이것이 Constructor 주입 방법의 단점은 아니라고 생각한다.

 

애초에 Circular Dependencies가 발생하지 않도록 코드를 작업하는 것이 중요하기 때문이다.

 

Field 방법도 많이들 쓰고 있는 방법이고 딱히 큰 단점이 보이지 않으므로 새롭게 추가하는 코드라면 추천되는 Constructor 방법을 사용하도록 하자