토비의 스프링 3.1의 내용을 요약한 자료입니다. 개념적인 설명만 요약하였으며 개념의 이해를 돕는 구체적인 코드 및 예제를 살펴보시려면 책을 참조하시기 바랍니다.
포스팅한 내용이 저작권의 문제가 발생할 수 있는 경우 게시물은 삭제/비공개 처리 될 수 있습니다.
@Autowired를 이용한 자동와이어링
- @Autowired는 스프링 컨테이너가 생성한 빈을 클래스의 멤버 필드로 주입받기 위해 사용한다.
- 자바 코드를 통해 클래스로 정의한 빈 오브젝트는 @Autowired를 붙여줌으로 빈 오브젝트를 주입할 수 있다.
- @Autowired가 분은 수정자 메소드가 있으면 파라미터 타입을 보고 주입 가능한 타입의 빈을 모두 찾는다. 주입 가능한 빈이 하나라면 스프링이 수정자 메소드를 호출해서 넣어주고 두 개 이상이 나오면 프로퍼티와 동일한 이름의 빈이 있는지 찾는다.
- @Autowired와 같은 자동와이어링은 적절히 사용하면 DI 관련 코드를 대폭 줄일 수 있지만, 빈 설정정보를 보고 다른 빈과 의존관계가 어떻게 맺어져 있는지 한눈에 파악하기 힘들다는 단점도 있다.
@Component를 이용한 자동 빈 등록
- @Component 또는 @Component를 메타 애노테이션으로 갖고 있는 애노테이션이 붙은 클래스는 빈 스캐너를 통해 자동으로 빈으로 등록된다.
- @Component 애노테이션이 달린 클래스를 자동으로 찾아 빈을 등록해주게 하려면 빈 스캔 기능을 사용하겠다는 애노테이션 정의가 필요하다.
- @ComponentScan 애노테이션은 @Component 애노테이션이 달린 클래스를 자동으로 찾아서 빈으로 등록해주는 빈 스캔 기능을 사용하겠다는 애노테이션 정의이다.
- @ComponentScan의 basePackages 엘리먼트는 @Component가 붙은 클래스를 스캔할 기준 패키지를 지정할 때 사용한다. 기준 패키지는 여러 개 넣어도 된다.
- 빈의 클래스는 @Component가 붙은 클래스이고, 빈의 아이디는 따로 지정하지 ㅇ낳았으면 클래스 이름의 첫 글자를 소문자로 바꿔서 사용한다.
- 만약 @Component가 붙은 클래스의 이름 대신 다름 이름을 빈의 아이디로 사용하고 싶다면 다음과 같은 애노테이션을 붙여주면 도니다. @Component("userDao")
- 빈 자동등록은 @Component 애노테이션 뿐만 아니라 @Component 애노테이션을 메타 애노테이션으로 갖고 있는 애노테이션도 사용할 수 있다.
- 애노테이션이 빈 스캔을 통해 자동등록 대상으로 인식되게 하려면 애노테이션 정의에 @Component를 메타 애노테이션으로 붙여주면 된다.
- 여러 개의 애노테이션에 공통적인 속성을 부여하려면 메타 애노테이션을 이용해야 한다. 메타 애노테이션은 애노테이션의 정의에 부여된 애노테이션을 말한다.
- 애노테이션이 빈 스캔을 통해 자동등록 대상으로 인식되게 하려면 애노테이션 정의에 @Component를 메타 애노테이션으로 붙여주면 된다.
1
2
3
4
5
|
@Component
public @interface SnsConnector {
...
}
|
|
- @SnsConnector를 다음과 같이 클래스에 부여해주면 자동 빈 등록 대상이 된다.
1
2
|
@SnsComponent
public class FacebookConnector {
|
|
- 스프링은 DAO 기능을 제공하는 클래스에는 @Repository 애노테이션을 이용하도록 권장한다. @Repository는 @SnsConnector와 마찬가지로 @Component를 메타 애노테이션으로 갖고 있다.
- @Autowired는 같은 타입의 빈이 두 개 이상 발견되면 이름을 기준으로 다시 최종후보를 찾는 방식으로 동작한다.
- @Service 애노테이션은 스프링이 제공하는 빈 자동등록 애노테이션으로 비즈니스 로직을 담고 있는 서비스 계층의 빈을 구분하기 위해 사용된다.
- 수십, 수천개의 애플리케이션 빈을 다루는 엔터프라이즈 애플이케이션을 개발하는 경우 모든 빈을 XML이나 자바 코드에 일일이 설정해주려면 번거롭다. 대신 자동 와이어링과 자동 등록 방식을 적용하면 DI와 관련된 코드나 설정정보가 간결해질 것이다.