어노테이션 기반 의존 자동 연결을 위한 설정

dongeranguk·2021년 11월 25일
0

1. XML 설정

@Autowired, @Resource 어노테이션을 사용하려면, XML 설정에 다음과 같은 코드를 추가한다.

2. <conetext:annotation-config>

<context:annotation-config> 태그는 다수의 전처리기 빈을 설정해준다.

전처리기를 개별적으로 등록할 수 있지만,
일반적으로 <conetext:annotation-config> 태그를 사용한다.


3. @Autowired, @Resource

어노테이션을 이용한 객체 간 의존 자동 연결

  • @Autowired

  • @Service

  • @Controller

@Autowired 와 @Resource 의 차이점은,

@Autowired는 등록된 타입으로 객체를 찾고,

@Resource는 등록된 이름으로 객체를 찾는다.

@Resource 어노테이션에 name속성에 지정된 이름의 빈 객체 설정하면
자동으로 관계가 설정된다.

@Resource(name="user")
private User user;

따라서, @Autowired는 등록된 타입으로 빈 객체를 찾기 때문에,
bean 태그의 id속성과는 상관이 없다.

@Autowired 의 단점으로는,

  • 상속 관계의 빈 객체를 설정하고자 할 때
  • 같은 타입의 객체를 두개 이상 등록했을 때

@Autowired를 사용해서 타입을 찾으면
'NoUniqueDefinitionException' 예외가 발생한다.
직역해서 보자면 '유일하지 않은 정의' 이다.

이러한 단점을 보완하기 위해서, @Qualifier 어노테이션을 이용해서 범위를 좀 더 좁혀서 찾을 수 있도록 값을 지정한다.

@Inject 도 등록된 타입을 찾기 때문에, @Autowired 와 동일하게 동작한다.

@Resource 어노테이션 name속성을 지정하지 않을 경우,
필드 이름이나 프로퍼티 이름을 사용한다.
만약, 존재하지 않는다면 @Autowired 처럼 같은 타입의 객체를 찾고, 없다면 Exception이 발생한다.
@Resource는 지정한 이름으로 찾기 때문에 타입으로 찾을 때보다 겹치는 일이 현저히 줄어드므로, 사용하기에 더 편하다.


컴포넌트 스캔을 이용한 빈 자동 등록

<context:component-scan> 태그

base-package속성에 지정한 패키지 및 그 하위 패키지에 위치한 클래스 중에서 @Component 어노테이션이 적용된 클래스를 검색해서 스프링 빈으로 등록한다.

스프링에서 ComponentScan으로 자동 등록되는 클래스는,

  • @Component
  • @Service
  • @Controller
  • @Repository (DAO)

만약 빈 객체를 찾지 못한다면, BinCreationException 이 발생한다.
앞으로 많이 보게 될 예외이므로 잘 파악하자.

스캔 대상으로는,
include-filter 태그는 포함, exclude-filter 태그는 스캔 대상에서 제외된다.
@Autowired의 require 속성을 false로 지정하면 빈 객체를 찾지 못하더라도, BinCreationException이 발생하지 않는다.

0개의 댓글