3. IoC
● Inversion of Control (제어의 역전)
● 객체 생성, 사용과 같은 생명주기(Lifecycle)와 같은 제어는
프레임워크에게
● 우리는 하라는 것만 하자.
● Framework와 Library 차이는 누가 제어를 하느냐? (나냐? F/W냐?)
5. Container
● 여러가지 용어
○ Spring Container
○ IoC Container
○ Bean Container
○ 그냥 Spring을 Container라고도 표현 한다.
● Bean을 정의, 생성, 저장, 반환한다.
● Bean을 제어한다.
7. DI
● Dependency Injection (의존성 주입)
● 의존성을 최소화 하고 책임을 명확히 분리하자.
● 의존성을 줄이는게 답이다.
● 의존성을 아예 없앨 수는 없다. 절대
● 어디서 의존성이 발생할까?
● Spring은 의존성을 최소화 시켜준다.
● DI 종류
○ @annotation
○ setter method
○ constructor
8. DI는 누가 할것인가?
● Factory Pattern
● Client 코드에서 객체 생성이나 의존성 주입은 하지 말자.
○ 의존 코드가 변경된다면 내가 작성한 코드도 변경 될 가능성이 크다.
○ 바뀐지 모르게 하자.
● Spring에서 DI를 하는 주체는 BeanFactory와 ApplicationContext다.
○ 이게 핵심이다.
○ Spring에 모든 기반은 BeanFactory와 ApplicationContext
■ 대 부분의 객체를 Bean으로 등록해 사용한다고 생각하면 쉽다.
10. Bean Scope
● IoC Container에서 보관되는 Bean의 생명
● 어떻게 생성하고, 언제까지 살아 있을 것인가?
● singleton
○ default Scope
○ 하나의 IoC Container에서 항상 동일한 Bean을 반환
● prototype
○ 항상 다른 Bean을 반환
● request
○ Web 환경에서 동일한 Request에서만 동일한 Bean을 반환
● session
○ Web 환경에서 동일한 Session에서만 동일한 Bean을 반환
● 그외 thread, globalSession, application
15. Bean이 등록되는 과정
1. 메타데이터(설정 파일 xml, java)를 통해 bean을 정의
2. 정의된 bean을 BeanDefinition 객체로 생성
a. name, scope, etc…
3. Map<String, BeanDefinition>에 생성된 BeanDefinition 객체를 저장
(put)
16. Bean이 생성되는 과정(getBean method)
1. 이미 정의된 BeanDefinition을 Map에서 꺼냄
2. getBean 메소드가 처음 호출 된 경우
a. BeanDefinition을 기반으로 instance 생성
b. Map에 instance 저장 후 반환
3. getBean 메소드가 두번 이상 호출 된 경우
a. instance가 저장된 Map에서 꺼낸 후 반환
4. 물론 scope마다 다르게 생성, 저장한다.(위 내용은 singleton 기준)
18. 참고
● Spring Core (SLiPP)
● 마틴 파울러 아저씨가 이야기하는 IoC와 DI
● 토비의 스프링
● woniper가 이야기하는 IoC와 Framework
● Bean은 어떻게 등록될까?
● Bean은 어떻게 반환할까?
● BeanFactory 와 ApplicationContext