Spring Core 란? - Spring Container
Spring 프레임워크의 근간이 되는 요소로 DI, IoC 기능을 지원하는 영역을 담당한다
빈 저장소를 기반으로 빈 클래스들을 제어할 수 있는 기능을 지원하기도 한다
빈 저장소의 경우, IoC 패턴이 적용되어 객체 구성부터 의존성 처리까지 모든 일을 처리하는 핵심적인 역할을 한다
Container 는 개발자를 대신하여 Bean 을 생성/관리/제거 한다
추가로 독립적인 코드를 어노테이션 (@Bean) 으로 넘겨주면 Container 가 알아서 호출해준다
Container 가 개발자를 대신하여 메서드(코드)를 호출 및 필요한 자원을 전달하는 설계 구조를 IoC(Inversion Of Container / 제어 반전)이라고 한다.
IoC 는 메서드가 필요로 하는 자원들을 코드가 실행되는 타임에 전달을 하는데, 이를 DI(Dependency Injection / 의존성 주입) 이라고 한다
Dependency Injection 은 Reflection 이라는 기술을 기초로 구현되어 있다. Reflection 기술은 런타임에 코드의 메타 데이터를 읽는 기술이다. 특히 메서드의 Singnature 를 읽을 수 있고, Signiture 에 메서드가 필요로 하는 매개변수 정보가 있다. Dependency Injection 은 Reflection 으로 얻은 코드 데이터로 메서드가 필요로 하는 자원을 런타임에 제공한다 |
자원을 직접 조작하고 싶을 경우 Container의 설정 정보가 담긴 xml 문서를 변경하면 된다
런타임을 조작하고 싶다면 ApplicationContext 객체를 사용하면 된다
1. Bean 추가 하는 법 (xml 방식)
root-context.xml 파일에 아래의 bean 태그를 작성한다
root-context.xml 의 <Beans Graph> 에 Bean이 등록된 것을 확인할 수 있다
Bean 을 하나 더 추가하면 위 사진처럼 Bean 이 추가된다
2. 추가한 Bean 사용하는 방법 (xml 방식 추가)
테스트 파일 만들기
해당 실습을 하기 위해서 테스트 파일에서 root-context.xml 파일을 읽어오는 작업이 필요하다
(Spring-Test 외부 라이브러리 필요)
- scope 를 지운다
- version 을 현재 springframework-version 에 맞추기 위해 위 el 표현식을 작성한다
테스트 코드에서 Bean을 불러와 사용
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml") |
root-context.xml 파일을 읽어 bean 정보를 읽어온다
- @Autowired 어노테이션을 사용하여 변수에 Bean 을 등록해준다
- 이 때, 등록되는 객체는 컨테이너에서 생성된 객체를 사용한다 (최초 한번 생성)
3. Bean 객체의 멤버 변수값 지정 (xml 방식)
- constructor-arg 태그를 사용하여 멤버 값을 지정해준다
- name 은 멤버변수 명, value 는 기입할 값이다
위 설정을 root-context.xml 파일에 작성한 후
아까 작성한 테스트 코드를 실행하면 아래와 같이 결과가 나온다
Person 객체의 멤버 변수 값이 잘 지정되었다
Java 파일에서 Bean 생성 하는 법 (Config)
root-context 에 component-scan 태그 작성하기
component-scan에서 자바 config 파일이 작성될 패키지를 base-package로 등록해준다
빨간줄은 root-context의 Namespaces에서 context를 등록해줘야한다
beans에 등록된 context namespace
Config 파일을 만든다
Config 파일의 클래스는 @Configuration 어노테이션을 달아줘야한다
@Bean 어노테이션을 통해 Bean을 등록한다
root-context 의 beans graph에서 자바 파일에서 등록한 Bean 을 확인할 수 있다
@Bean 어노테이션에서 name 속성을 통해 빈의 이름을 직접 지정해 줄 수도있다
xml 으로 설정할 때와 마찬가지로 빈을 등록할 때 설정한 이름과 동일하게 변수명을 설정해야 autowired 된다
applicationContext에서 빈을 꺼내올 수 있다
getBean()의 반환형은 Obejct