본문 바로가기

스프링

IOC_DI를위한 빈설정메타정보작성_XML_빈스캐너_2

1. 첫번째 방법 XML 단독사용(메타정보작성)

* <bean>

> 스프링 빈 메타정보의 거의 모든 항목을 지정할 수 있으므로 세밀한 제어가 가능하다.

> 기본적으로 idclass라는 두 개의 애트리뷰트가 필요하다.

> id는 생략가능하다 <property> 태그안에 정의하는 내부빈(innserbean)이라고 함. 내부빈은 특정 빈에서만 참조하는 경우에 사용되므로 아이디가 없어 다른 빈에서는 참조할 수 없다.

> id는 문서 전체에서 고유해야 하며, 공백이 들어갈 수 없다.

> 첫글자는 알파벳과 밑줄(_) 그리고 일부 허용된 일부 언어문자만 사용되며, 나머지 글자는 알파벳과 밑줄, 그리고 숫자와 점(.)을 허용한다. 그 외의 특수문자는 사용할 수 없다.

> 관례적으로 id에 사용되는 값은 빈을 대표하는 타입 이름을 첫 글자만 소문자로 바꿔서 사용한다. 이렇게 타입 이름을 사용하면 이름에 의한 자동와이어링에 적용하기도 좋다.

> id를 생략하더라도 빈의 타입을 이용해 DI하는 건 가능하다. 또한 AOP 자동 프록시 생성기처럼 컨테이너가 사용하는 설정정보용 빈의 경우에도 id를 생략할 수 있다.

 

* 스프링 빈의 분류

1) 애플리케이션의 핵심 코드를 담은 컴포넌트와 서비스빈(위 사진의 hello)

 - 핵심 로직을 가진 구체적인 오브젝트

2) 컨테이너 설정을 위한 빈(위 사진의 mypointcut)

 - 핵심로직이 아닌 컨텍스트가  빈생성시 활용하는 기술적인 설정정보를 담고 있다.

 - 스프링은 DI의 원리를 애플리케이션 컨텍스트 자신에게도 적용하기 때문에 필요로 하는

   정보도 오브젝트 형태로 만들어 컨테이너 자신에게 DI 해서 사용되게 만든다.

 - 이를 통해 컨테이너의 유연한 확장이 가능해진다.

* 하지만 둘다 똑같이 <bean>이라는 태그를 사용해 만들어져 구분이 잘 되지 않는다. 때문에 어떤 의도와 의미를 갖고 있는지를 파악하기 어렵다.

 

두 가지로 구분되는 빈의 종류를 구분하기 위해 스프링은 네임스페이스와 태그를 가진 설정 방법을 제공한다. <aop:pointcut> 태그는 <bean>으로 선언한 것과 동일한 빈 설정 메타정보로 변환된다. 하지만 전용 태그, 애트리뷰트를 이용해 선언됐기 때문에 내용이 매우 분명하게 드러나고 선언 자체도 깔끔해져 애플리케이션 로직을 담은 다른 빈과 혼동되지 않는다.

 

내장형 DB를 선언할 때 <bean>으로 선언해도 되지만 EmbeddedD~~Bean 클래스를 사용해야 하고, 프로퍼티 중에서 type은 필수항목이며, 그 안에 들어가는 문자는 어떤 것이 있고 등등을 기억하는 것보다 <jdbc:embedded>를 사용하면 된다고 기억하는게 훨씬 편하다.

 

또한 전용태그를 통해 여러 개의 빈을 만들 수도 있다.

Context:anootation 스프링 지원, 및 개발자가 직접 커스텀 태그를 만들어 적용도 가능하다.

* 커스텀 태그가 가능한 이유

- 설정 메타정보가 특정 XML 문서나 태그, 포맷에 종속되지 않는 독립적인 오브젝트이기 때문이다.

- 커스텀 태그를 해석하는 코드에서 태그 내용을 참조해서 BeanDefinition 오브젝트를 여러 개 만들어서 컨테이너에게 전달해주면 그 개수와 종류에 상관없이 자유롭게 빈을 등록 가능하다.

 

* XML메타정보 작성의 단점

- 모든 빈을 XML에 일일이 선언하는 것이 귀찮게 느껴지고, 빈의 개수가 많아지면 관리하기 번거로울 수 있다. 따라서 애노테이션 정보 작성이 좋은 경우가 있다.

 

* XML메타정보 작성의 장점

- 빈이 많아질 경우 간단히 파악하긴 어렵지만, 애노테이션 보다는 설정 등을 통제하고 관리하는데 분명 유리하다.

- 모든 설정정보를 자바 코드에서 분리하고 순수한 POJO 코드를 유지하고 싶다면 단독 XML이 가장 좋은 선택이다.

- 개발 중에는 다른 방법을 쓰고 운영자의 편의를 위해 운영시에는 XML로 바꾸는 방법을 선택해 볼 수도 있다.

- XML 커스텀 태그를 만들어 사용하는 경우도 좋다.

- BeanDefinition을 코드에서 직접 만드는 방법을 제외하면 스프링이 제공하는 모든 종류의 빈 설정 메타정보 항복을 지정하는 유일한 방법이기도 하다.

 

2번째 방법. XML과 빈스캐닝 혼용

> 이 태그에 의해 해당 패키지에 등록된 빈 오브젝트가 빈으로 등록된다.

> 위 스샷처럼 XML@Configuration이 붙은 자바 코드에 의한 설정 방식을 함께 적용할 수도 있다.

* 장점

> 애플리케이션 3계층의 핵심 로직을 담고 있는 빈 클래스는 그다지 복잡한 빈 메타정보를 필요로 하지 않는다. 대부분 싱글톤이며 클래스당 하나만 만들어지므로 빈스캐닝에 의한 자동인식 대상으로 적절하다.

> 반면 자동인식 방식으로 등록하기 어려운 서비스(DataSource, 트래잭션 매니저), 컨테이너 설정(AOP) 등의 빈은 XML을 사용하면 된다.

> XML의 장점인 전용태그로 손쉽게 빈 등록 가능

 

* 주의사항

> , 스캔 대상이 되는 클래스를 위치시킬 패키지를 미리 결정해둬야 한다는 점을 주의하자.

> 스프링 애플리케이션은 보통 두 개의 애플리케이션 컨텍스트가 등록된다. 양쪽 컨텍스트에 의해 같은 클래스를 중복해서 빈으로 등록될 수 있다.(위 사진)

 - 원래 UserService는 루트 컨텍스트에스 트랜잭션이 적용된 채로 사용되어야 한다. 그런데

서블릿 컨텍스트의 빈을 실수로 서블릿 컨텍스트로 등록하면 트랜잭션 AOP 설정이 없어

찾기 힘든 미묘한 버그가 만들어지는 상황이 발생한다.

 

 

* Name 애트리뷰트

* 빈의 이름을 여러 개 주는 이유가 무엇일까???

> DAO를 전문으로 만드는 팀이 DataSource의 빈의 이름을 dataSource로 지었다. 그런데 배치시스템 팀이 여러 개의 DB를 접속해서 사용하기 때문에 system1DS로 접근해서 요청하고 싶다고 요청이 왔다해보자. 이럴 때 DAO팀에서 DataSourceidsystem1DS로 전부 변경해야할 까? 이럴 때 사용한다.

> 일종의 namealias의 개념이라고 보면 된다.

> 빈선언에 손을 대고 싶지 않다면 <alias> 태그를 사용해 별칭을 부여할 수 도 있다.