[Spring] 스프링 의존성 주입 어노테이션 (Spring Dependency Injection Annotation)
안녕하세요. 소다맛사탕 입니다.
이번 포스팅에서는 Java Spring Framework를 이용한 웹개발에 앞서서 스프링의 필수적인 의존성 주입 어노테이션에 대해서 알아보겠습니다.
※ 스프링 의존성 관계 ; 객체와 객체의 결합 관계. 하나의 객체에서 다른 객체의 변수나 메서드를 이용해야 한다면 이용하려는 객체에 대한 생성과 참고 정보가 필요합니다.
기본적으로 스프링에서 의존성을 주입하는 방법은 3가지 방법이 있습니다.
- 생성자
- 필드
- setter
1. 의존성 주입 어노테이션
어노테이션(표기; @) | 설명 |
@Autowired | 변수 위에 설정하여 해당 타입의 객체를 찾아서 자동으로 할당. org.springframework.beans.factory.annotation.Autowired |
@Qualifier | 특정 객체의 이름을 이용하여 의존성을 주입할 때 사용. org.springframework.beans.factory.annotation.Qualifier |
@Inject | @Autowired 똑같다(Java 제공 어노테이션) javax.annotation.Inject |
@Resource | 해당 타입의 객체를 찾아서 자동으로 할당하고, 객체를 이용해 의존성을 주입할 떄 사용. (@Autowired와 @Qualifier의 기능을 결합한것) javax.annotation.Resource |
1. @Autowired
; 생성자, 메서드, 멤버변수 위에 모두 사용 가능. 해당 변수의 타입을 체크하고, 객체가 메모리에 존재하는지 확인한 후 객체를 변수에 주입합니다.
public class TestAutowired {
@Autowired
private TestDao testDao;
public TestAutowired() {
// TestAutowired 객체생성
}
}
2. @Qualifier
; 사용할 의존 객체를 선택하게 해줍니다. 즉, 의존성 주입의 대상이 되는 특정 객체를 찾고, 조건에 만족하는 객체에 의존성을 주입합니다.
public class TestQualifier {
@Autowired
@Qualifier("testDao")
private SampleDao sampleDao;
public TestQualifier() {
// TestQualifier 객체 생성
}
}
@Autowired 대상이 되는 SampleDao가 가지는 메모리에서 어떤 객체를 의존성 주입할지 모르기에
@Qualifier의 testDao 객체를 지정하여 처리한다.
3. @Inject
; Java에서 제공하는 어노테이션으로 생성자, 메서드, 멤버변수 위에 모두 사용 가능합니다.
https://mvnrepository.com/artifact/javax.inject/javax.inject
@Inject 사용하기 위해 javax.Inject를 추가해야 합니다.
public class TestInject {
@Inject
//@Named("testDao")
private SampleDao sampleDao;
public TestInject() {
// TestInject 객체 생성
}
}
같은 타입의 객체가 여러개 있을때 이름으로 찾기 위한 @Named 어노테이션을 사용해 정확한 객체를 찾아 의존성 주입한다.
4. @Resource
; Java에서 제공하는 어노테이션으로 @Autowired는 변수의 타입을 기준으로 객체를 검색해 의존성 주입을 처리한다면, @Resource는 객체의 이름을 이용하여 의존성 주입을 처리합니다.
https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api
@Resource 사용하기 위해 javax.annotation-api를 추가해야 합니다.
public class TestResource {
@Resource(name="testDao")
private SampleDao sampleDao;
public TestResource() {
// TestResource 객체 생성
}
}
@Resource는 name 속성을 사용할 수 있어서 testDao로 생성된 객체를 검색하여 의존성 주입을 처리한다.
결론적으로 대부분 실무나 프로젝트를 진행할 때 필드에 @Autowired를 붙여쓴 코드가 많습니다.
특히 생성자에 주입하는 경우가 많은데..
Spring에서는 수시로 객체 생성이나 의존성 높은 설계를 피하기 위함도 있고,
의존성 주입 관계에서 대부분 변경이 일어나지 않기에 불변성을 보장합니다.
그리고 단위테스트를 위함도 있고, 순환 참조 문제의 원인을 파악하기도 쉽기 때문입니다.