본문 바로가기

스프링

[spring] ApplicationContext_종류_사용법_POJO란

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

 

POJO : 객체지향적인 원리에 충실하면서, 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트

 

Printer 인터페이스를 구현한 클래스는 얼마든지 만들 수 있다(여러가지 기술로).

 

 

Printer구현한 각자 기능에 충실하게 독립적으로 설계된 POJO 클래스(구현체)를 만들고, 결합도가 낮은 유연한 관계를 가질 수 있도록 인터페이스를 이용해 연결해주는 것이 IOC컨테이너가 사용할 POJO를 준비하는 첫 단계 이다.

 

Hello 클래스는 Printer라는 인터페이스에만 의존한다. 실제로 런타임 시에 어떤 구체적인 오브젝트를 사용하게 될지 알지도 못하고, 관심도 없다.

 

18. StaticApplicationContext는 코드에 의해 설정 메타정보를 등록하는 기능을 제공하는 애플리케이션 컨텍스트다. 테스트용으로 적합함.

20. StaticApplicationContext의 디폴트 메타정보를 사용해서 싱글톤 빈을 등록해주는 registerSingleton() 메소드 사용.

22, 35. 2개의 bean 등록. IOC컨테이너가 관리하는 빈은 클래스 단위가 아닌 오브젝트 단위. 보통 클래스당 하나의 오브젝트를 만들지만, 경우에 따라서 하나의 클래스를 여러 개의 빈으로 등록한다. 예를 들어 사용할 DB가 여러 개라면 SimpleDriverDataSource 클래스로 된 빈을 여러 개 등록하고 각각 다른 DB 설정을 지정해서 사용할 수 있다.

27. RootBeanDefinition은 가장 기본적인 BeanDefinition 인터페이스의 구현 클래스. 빈에 대한 메타정보를 넣어주고 컨테이너에 등록 가능. ApplicationContextBeanDefinition 메타정보를 담은 오브젝트를 사용해 IOCDI 작업을 수행한다

39. IOC 컨테이너에서 등록된 빈 설정 메타정보를 가져올 수 있다.

46. printer빈이 hello 빈에게 DI되도록 설정

 

POJO를 준비하는 두번째는 애플리케이션에서 사용할 구현체를 선정하고 이를 IOC 컨테이너가 제어할 수 있도록 적절한 메타정보를 만들어 제공하는 작업이다.

* 설정 메타정보

- 스프링 컨테이너가 관리하는 오브젝트는 빈bean 이라고 부른다.

- 스프링의 설정 메타정보는 XML 파일이 활용되는 것이지, XML로 설정된 메타정보를 가졌다는 말은 옳은 표현이 아니다.

- 스프링의 설정 메타정보는 BeanDefinition 인터페이스로 표현되는 순수한 추상 정보다.

- 애플리케이션 컨텍스트는 바로 이 BeanDefinition으로 만들어진 메타정보를 담은 오브젝트를 사용해 IOCDI 작업을 수행한다.

- 스프링의 메타정보는 특정한 파일 포맷이나 형식에 제한되거나 종속되지 않는다. XML이든 소스코드 애노테이션이든 자바 코드이든 프로퍼티 파일이든 상관없이 BeanDefinition으로 정의되는 스프링의 설정 메타정보의 내용을 표현한 것이 있다면 무엇이든 사용 가능하다.

- 원본의 포맷과 구조, 자료의 특성에 맞게 읽어와 BeanDefinition 오브젝트로 변환해주는 BeanDefinitionReader가 있으면 된다. 당연히 BeanDefinitionReader도 인터페이스다. 따라서 이를 구현한 리더를 만들기만 하면 스프링의 설정 메타정보는 어떤 형식으로든 작성할 수 있다.

 

StaticApplicationContext : 스프링의 웹 관련 기능을 공부하거나 학습 테스트로 검증해보고 싶을 때 사용.

 

GenericApplicationContext 사용할 메타정보

 

ApplicationContextTest.java 위에 내용은 이전것과 동일

GenericApplicationContext

- 가장 일반적인 애플리케이션 컨텍스트. 실전에서 사용될 수 있는 모든 기능을 갖추고 있는 애플리케이션 컨텍스트. 컨테이너의 주요 기능을 DI를 통해 확장할 수 있도록 설계되어 있다.

- StaticApplicationContext와 다르게 XML 파일과 같은 외부 리소스에 있는 빈 설정 메타정보를 리더를 통해 읽어들여서 메타정보로 전환해서 사용.

- 스프링은 메타정보를 애플리케이션 컨텍스트가 사용할 수 있는 BeanDefinition 정보로 변환하는 기능을 가진 BeanDefinitionReader 인터페이스를 구현해서 만들고, 빈 설정정보를 전달하는 대표적인 빈 설정정보 리더는 XmlBeanDefinitionReader.

66. 스프링의 Resource 타입으로 전달 해도 되지만, 리소스 대신 스트링을 넘기면 기본적으로 클래스패스로 인식. Classpath:file:, http: 같은 접두어를 이용해도됨.

67. 스프링은 XML 지옥이란 얘기가 있다. 근거없는 비방이다. XML은 최소한의 꼭 필요한 정보만 사용할 수 있도록 잘 설계된 문서다. 물론 XML을 사용하고 싶지 않다면 XML 파일 없이 스프링 어플리케이션을 만들 수도 있다. GenericApplicationContext는 빈 설정 리더를 여러 개 사용해서 여러 리소스로부터 설정 메타 정보를 읽어 refesh() 메소드를 한번 호출해서 애플리케이션 컨텍스트가 필요한 초기화 작업을 수행하면 된다.

* refresh() : 리더를 사용해서 읽은 경우에는 반드시 호출해야함. GenericXmlApplication Context은 리더를 구현하지 않으므로 생략 가능. 설정 메타정보를 읽고 refresh() 해주면 컨텍스트를 초기화하면서 DI를 진행한다. 이 때 child 컨텍스트에서 필요한 빈이 존재하지 않을 경우 부모 컨텍스트에게 빈 검색을 요청하게 된다.

> GenericApplicationContext 를 직접 사용하는 경우?

- 스프링 컨테이너 자체를 확장해서 새로운 프레임워크를 만들거나,

- 스프링을 사용하는 독립형 애플리케이션을 만들 경우

- Junit 역시 GenericApplicationContext를 자동으로 만들어준다.

 

 

프로퍼티 파일로 메타정보를 작성해도 그에 맞는 리더를 사용하면 됨.

 빈 설정 리더를 만들기만 하면 어떤 형태로도 빈 설정 메타정보를 작성할 수 있다.

- DB의 테이블에 빈 설정정보를 저장해두고 이를 읽어서 사용하거나, 원격 서버로부터 정보를 읽어올 수도 있다.

- 스프링에서는 대표적으로 XML 파일, 자바 소스코드 애노테이션, 자바 클래스 세 가지 방식으로 빈 설정 메타정보를 작성할 수 있다. 물론 이 세가지 방식으로 제한되진 않는다. 필요하다면 얼마든지 유연하게 확장할 수 있다.

 

ApplicationContextTest.java 위에 내용은 이전것과 동일

GenericXmlApplicationContext

- GenericApplicationContext를 사용하는 경우 번거롭게 XmlBeanDefinitionReader를 직접 만들지 말고, 이 두 개의 클래스가 결합된 GenericXmlApplicationContext를 사용하면 편리하다.

- GenericXmlApplicationContextXmlBeanDefinitionReader를 내장하고 있기 때문에, XML 파일을 읽어들이고 refesh()를 통해 초기화 하는 것까지 한 줄로 끝낼 수 있다.

 

WebApplicationContext

XmlWebApplicationContext

AnnotaionConfigWebApplicationContext

 

 

 

서블릿 = main() 의 역할