본문 바로가기

스프링

IOC_DI를 위한 빈설정메타정보작성_애노테이션_빈스캐너_3

 

1.     Spring-bean : 스프링 코어와 함께 의존성 주입 제공 (Core Container)

2.     Spring-context : 스프링 코어, BeanFactory를 확장한 어플리케이션 컨텍스트 구현, 리소스 로드 및 국제화 지원(Core Container)

3.     Spring-core : 다른 스프링 모듈이 사용하는 유틸리티(Core Container)

4.     Spring-expression : EL 확장 Bean속성(배열, 컬렉션 포함).(Core Container)

5.     Spring-aop : 스프링 기능 자체의 aop, Spring ProxyFactoryBean

6.     Spring-jcl : 뭔지 모르지만 다운받아짐

7.     Com.springsource.junit : junit > Java10 문제인지 Maven문제인지 잘 인식이 안되서 시스템 라이브러리르 등록함. 호환되는 junit5버전이 있지만 설명이 많이 없어서 걍 4

 

> 모든 빈을 XML에 일일이 선언하는 것이 귀찮게 느껴지고, 빈의 개수가 많아지면 관리하기 번거로울 수 있다.

> 빈으로 사용될 클래스에 특별한 애노테이션을 부여하면 이런 클래스를 자동으로 찾아서 빈으로 등록하게 할 수 있다. 이런 방식을 빈 스캐닝을 통한 자동인식 빈 등록 기능이라고 하고, 이런 스캐닝 작업을 담당하는 오브젝트를 빈 스캐너라고 한다.

5. @Component

> 빈 스캐너에 내장된 대폴트 필터는 애노테이션을 지정하는 것만으로 빈 스캐너에 의해 빈 등록이 가능.

> @Component를 포함해 디폴트 필터에 적용되는 애노테이션을 스테레오타입(stereotype) 애노테이션이라고 부른다.

> @Componet 라고만 코딩하면 디폴트 id값으로 클래스명에 첫글자만 소문자로 바꿔서 아이디로 사용된다. Ex) annotatedHello. 하지만 좀 더 의미 있는 이름을 지정하고 싶을 경우 위처럼 선언한다.

 

@Named : id값의 alias개념

 

115. 빈 스캐너는 클래스패스의 모든 클래스를 다 검색할 수 있다. 하지만 모든 클래스패스를 다 검색하는 것은 비효율적이다. 생성자에 특정 패키지를 지정해서 검색하도록 만드는게 바람직하다.

115. AnnotationConfigApplicationContext는 빈 스캐너를 내장하고 있는 애플리케이션 컨텍스트 구현 클래스다.

 > 이 때 스캐너의 필터를 변경하거나 추가하려면 스테레오 타입 애노테이션 외에도 AspectJ 포인트컷이나 정규식 같은 이름 패턴을 이용해서 빈으로 등록할 클래스를 선정하여 애노테이션이 필요없게도 만들 수 있지만, 일반적으로 스테레오타입 애노테이션을 확인하는 디폴트 필터를 그대로 이용하도록 권장된다. 그 이유는 소스코드 애노테이션을 이용하면 추가로 메타정보를 부여할 수 있고, 소스코드를 보고 자동인식을 통한 빈 등록 대상인지 쉽게 파악할 수 있기 때문이다.

* 애노테이션 메타정보 작성의 단점

- 애플리케이션에 등록될 빈이 어떤 것들이 있고, 그 정의는 어떻게 되는지 한눈에 파악하기 어렵다. 물론 빈의 개수가 많아지는 XML도 마찬가지 이지만, 그래도 빈과 의존관계, 설정 등을 통제하고 관리하는데는 XML이 분명 유리하다.

- 클래스당 한 개 이상의 빈을 등록할 수 없다는 제한이 있다.

 > 그러나 기술 서비스 빈이 아니라면 대부분 클래스당 하나 이상의 빈을 등록하는 경우는 없다.

* 애노테이션 메타정보 작성의 장점

- XML에서의 많은 빈 설정이 귀찮게 느껴질 때 좋다.

 

 

 

각 계층의 핵심 클래스에는 이 세 가지 스테레오 애노테이션을 사용하고, 특정 계층으로 분류하기 힘든 경우에는 @Componet를 사용하는 것이 바람직하다.

 

*XML 없이 빈 스캐닝 단독사용

> 모두 자바 코드에 의한 빈 설정방식을 사용해야 한다.

> 기존 XML로 등록했던 기술 서비스 빈과 컨테이너 설정용 빈은 @Configuration 클래스들을 모두 빈 스캔 대상에 포함시킨다. 성격이 다르면 패키지를 구분해서 만들어 주면 좋다.

> 루트, 서블릿 컨텍스트 모두 AnnotaionConfigWebpplicationContext를 컨텍스트로 변경해줘야 한다.

> 단점

- XML 전용태그처럼 전용 애노테이션이 아직까지 없다.

 

 

원한다면 스테레오타입 애노테이션을 직접 정의도 가능하다.

 

@BeanComponent의 차이

 

자세한 사항은 066.IOC_DI를위한_빈설정메타정보작성_Java,Configuration,Bean.docx 참고