[spring] 다양한 의존성 주입 방법

 Spring Framework의 핵심기술 중 하나 DI(Dependency Injection, 의존성 주입).

의존성 주입은 여러방식으로 존재한다.

  • 생성자 주입
  • 수정자 주입
  • 필드 주입

생성자 주입

클래스의 생성자를 통해 의존성을 주입하는 방식.

1
2
3
4
5
6
7
8
9
10
11
12
@Service
public class UserService {
 
    private UserRepository userRepository;
 
    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
}
 
cs

 - DI 객체가 변하지 않는다는것을 보장, 반드시 객체의 주입이 필요할 시 사용.
 - 생성자가 1개라면 @Autowired 는 생략될 수 있다.(스프링 4.3 ~)

수정자 주입

해당 필드의 setter메서드를 정의하여 의존성 주입하는 방식.

1
2
3
4
5
6
7
8
9
10
11
12
@Service
public class UserService {
 
    private UserRepository userRepository;
 
    @Autowired
    public UserRepository setUserRepository(UserRepository userRepository){
        this.userRepository = userRepository;
    }
    
}
 
cs



 - 주입받는 객체가 변경 가능성이 있는 경우.(테스트 시)

필드주입

필드에 직접 @Autowired 어노테이션을 명시하여 의존성 주입.

1
2
3
4
5
6
7
8
@Service
public class UserService {
 
    @Autowired
    private UserRepository userRepository;
    
}
 
cs

 


일반적으로 여러 의존성 주입 방식중에서 생성자 주입 사용을 권장한다.

1. 스프링컨테이너와의 결합도가 낮아져서 테스트에 용이하다.
2. 순환참조(객체가 서로를 참조)를 방지할 수 있다.
3. final 필드로 초기화하여 불변성을 가진다.


lombok의 @RequiredArgsConstructor 어노테이션과 final 키워드를 사용하여 생성자 주입을 코드 최소화하여 작성할 수 있다.








댓글

가장 많이 본 글