본문 바로가기

Programming/Framework

DAY 148. Spring DI - Annotation

 

Spring DI - Annotation

 

@Annotation 방식

xml 파일에는 구동시킬 필수 요소만 작성하고 소스코드에 Annotation으로 표시하여 구동하는 방식

(필수 요소 = <context:component-scan>)

 

▶ @Annotation 종류 - Bean 등록 시 사용

@Component

객체(컴포넌트)를 나타내는 일반적인 타입으로 <bean> 태그와 동일한 역할

내가 <bean>으로 만들고 싶은 클래스 위에 어노테이션을 붙인다.

 

xml <bean>
java @Bean
@Annotation → @Component

 

 @Annotation 종류 - 의존성 주입 시 사용

@Autowired

- 정밀한 의존 관계 주입(DI)이 필요한 경우에 유용하다.

- 필드 변수, setter 메소드, 생성자, 일반 메소드에 적용이 가능하다.

- 의존하는 객체를 주입할 때 Type을 이용한다.

- <property>, <constructor-arg> 태그와 동일한 역할이다.

          ▷ Qualifier

                    -  @Autowired와 함께 쓰인다.

                    -  한 프로젝트 내에 @Autowired로 의존성을 주입하고자 하는 객체가 여러 개일 경우, @Qualifier("name")으로 원하는                                          객체를 지정하여  주입한다.

 

@Resource

- 애플리케이션이 필요로 하는 자원을 자동 연결할 때 사용한다.

- 프로퍼티, setter 메소드에 적용 가능하다.

- 의존하는 객체 주입 시 Name을 이용한다.

 

@Value

- 단순한 값(기본 리터럴 값) 주입 시 사용된다.

 

 

더보기

@Autowired와 @Resource의 차이점?

- 공통점 : @Component로 의존관계를 설정한 객체로부터 의존 관계를 자동으로 주입한다.

- 차이점 : @Autowired는 타입으로, @Resource는 이름으로 연결한다.

 

 

Spring Annotation 빈 스캐닝(Bean Scanning)

<context:component-scan> 태그

<context:component-scan base-package="경로" />

 

@Component를 통해 자동으로 Bean을 등록한다.

 

- @Autowired로 의존 관계를 주입받는 어노테이션을 클래스에서 선언했을 경우, 해당 클래스가 위치한 특정 패미지를 Scan하기 위한 설정을 XML에 해줄 때 사용한다.

 

- 어느 위치에서부터 @Component 어노테이션이 붙은 bean을 찾을 것인지 지정

 

- base-package와 하위 package를 스캐닝하면서 @Component가 붙은 클래스를 Bean 객체을 만들어서 ApplicationContext에서 가지고 있겠다.

 

 

더보기

▶ xml 버전

 - Bean으로 등록하고 싶은 클래스에 @Component를 붙인다.

 - root-config.xml 에 <context:component-scan base-package="경로" /> 등록한다.

 

▶ JAVA 버전

 - XXConfig.java 설정 파일에 @ComponentScan("base-package 지정")을 붙인다.

 

 

Bean Scanning

빈으로 사용할 클래스에 어노테이션을 부여하고, Spring 컨테이너가 자동으로 Bean을 등록하는 방식을

빈 스캐닝을 통한 자동 인식 Bean 등록 기능 이라고 한다.

 

장점 - 어노테이션을 부여하고 자동 스캔으로 Bean을 등록하면, XML 문서 생성, 관리가 불필요하고,
개발 속도를 향상시킬 수 있다.
- 개발 자 간 XML 설정 파일 충돌을 최소화한다.
단점 - 해당하는 클래스 파일을 찾아서 들어가야 한다.
- 애플리케이션에 등록될 Bean이 어떤 것들인지, Bean 들 간의 의존 관계가 어떻게 되는지 한 눈에 파악하기 어렵다.