ݺߣ

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

More Related Content

Spring으로 콩 심기

  • 2. 스프링 책에 자주 나오는 용어부터
  • 3. IoC ● Inversion of Control (제어의 역전) ● 객체 생성, 사용과 같은 생명주기(Lifecycle)와 같은 제어는 프레임워크에게 ● 우리는 하라는 것만 하자. ● Framework와 Library 차이는 누가 제어를 하느냐? (나냐? F/W냐?)
  • 4. Bean ● Spring(IoC Container)에서 관리되는 객체가 바로 Bean ● Bean은 Scope가 있고 Lifecycle이 있다. ● DI를 하기 위해서는 Bean이 필요하고 Bean이어야한다.
  • 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
  • 11. Bean Lifecycle ● Spring에서 제공되는 Bean 생명주기를 위해 제공되는 기능(뒷장 참고) ● *Aware interface가 생명주기에 관련된 기능을 제공
  • 12. ● BeanNameAware's ● BeanClassLoaderAware's {@code setBeanClassLoader} ● BeanFactoryAware's {@code setBeanFactory} ● ResourceLoaderAware's {@code setResourceLoader} ● ApplicationEventPublisherAware's {@code setApplicationEventPublisher} ● MessageSourceAware's {@code setMessageSource} ● ApplicationContextAware's {@code setApplicationContext} ● ServletContextAware's {@code setServletContext} ● {@code postProcessBeforeInitialization} methods of BeanPostProcessors ● InitializingBean's {@code afterPropertiesSet} ● a custom init-method definition ● {@code postProcessAfterInitialization} methods of BeanPostProcessors
  • 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