notepad

[레시피2] 스프링코어 - POJO와 IOC컨테이너를 다루는 기술 본문

JAVA/JAVA

[레시피2] 스프링코어 - POJO와 IOC컨테이너를 다루는 기술

likewise_ 2021. 3. 10. 07:27

(작성중)

스프링 5 레시피 책을 읽고 공부한 내용을 간단하게 정리.

 

1. Configuration
> 레시피 2-1 ~ 2-12

IOC 컨테이너? (ApplicationContext, BeanFactory)
- 객체의 생성, 생명주기 관리 등 객체에 대한 제어권을 컨테이너가 관리, 기능을 제공
- 객체의 생성을 책임지고 의존성을 관리
- POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가진다(생명주기) 

 

  • IOC 컨테이너에 스프링 빈의 등록 
    • POJO 객체를 빈으로 등록 시 컴포넌트 스캔의 대상이 되며 IOC에서 생성, 관리된다.
    • @Configuration, @Bean 
      • 두 애노테이션을 함께 사용
      • 초기 세팅 및 외부의 라이브러리를 빈으로 등록할 때 주로 사용한다
      • 대상 빈을 return해준다.
    • @Component (범용 애너테이션) , @Controller, @Repository, @Service
    • ApplicationContext / context.getBean() 으로 IOC 컨테이너에서 인스턴스/빈을 가져온다.
    • @ComponentScan 안에서 스캔 대상을 필터링 할 수 있다.
      • includeFilters, excludeFilters
      • FilterType.REGEX, ANNOTATION, ASSIGNABLE, ASPECTJ
  • @Autowired, @Resource, @Inject를 붙여 POJO 레퍼런스 자동 연결
    • @Autowired - 필드, 세터, 생성자에 주로 사용한다. 붙이면 bean간 참조 가능한 상태로 자동 연결된다.
      • 생성자 주입을 쓰면 @Autowired 생략 가능 (권장)
      • IOC 컨테이너에 빈 호환 타입이 여럿 존재하거나 프로퍼티가 그룹형이 아닌경우 빈 우선 순위 지정 가능
        • @Primary 를 붙이면 우선권 부여되어 해당 빈이 연결
        • @Qualifier("beanName") 를 붙이면 명시된 이름으로 프로퍼티 연결
    • @Resource (이름으로 레퍼런스 연결)
      • @Autowired + @Qualifier와 같은 역할. 대상이 명확하다.
      • 자바 표준 애너테이션으로 스프링프레임워크가 아닌 곳에서 사용 가능
    • @Inject (타입으로 레퍼런스 연결)
      • 타입이 같은 POJO가 여러개인 경우 커스텀 애너테이션을 만들어서 함께 사용해야한다.
  • 빈 스코프 @Scope
    • getBean() 메서드로 빈을 요청하거나 다른 빈에서 참조할 때 스프링은 빈 스코프에 따라 어느 빈 인스턴스를 반환할지 결정
    • 스프링은 IOC컨테이너에 선언한 빈마다 인스턴스 하나를 생성하고 전체 컨테이너 스코프에 공유
    • 기본 스코프는 싱글톤이다. IOC 컨테이너당 빈 인스턴스 하나 생성
    • 스프링의 빈 스코프 - singleton, prototype (요청할 때마다 빈 인스턴스 생성) , request(HTTP 요청당  빈 인스턴스 하나), session(HTTP 세션당 빈 인스턴스 하나), globalSession(전역 HTTP 세션당 빈 인스턴스 하나)
  • 외부 리소스를 어떻게 읽고 사용하는지 
    • @PropertySource, @Value
  • Spring Bean 의 생명주기 관리
    • initMethod, destroyMethod 속성, @PostConstruct @PreDestroy 초기화 지연, @DependsOn 초기화 의존 관계 정의
  •  스프링 빈 검증 및 후처리기 활용
    • 스프링 환경 및 프로파일 세트 
    • @Required @Profile 사용법

 

2. AOP

> 레시피 2-13 ~ 2-22

  • spring aop
  • AspectJ

3. TaskExecutor & Event

> 레시피 2-23 ~ 2-24 

  • 2-23. TaskExecutor - 동시성 적용하기 - chapter5 에서 더 자세히 다룬다.
    • 스레드 기반의 동시성을 제공하는 추상체
  • 2-24. 스프링에서 이벤트를 생성, 발행, 리스닝 하는 방법 - 이벤트 기반 통신
    • 이벤트 생성 - 이벤트 자체 정의
      • ApplicationEvent를 상속하여 이벤트 정의 (ApplicationListner 인터페이스의 타입 시그니처)
    • 이벤트 발행 - 이벤트를 인스턴스화 한 후 이벤트발행기에서 publishEvnet() 메서드를 호출하면 이벤트가 발행된다.
      • ApplicationEventPublisherAware 인터페이스 구현 & applicationEventPublish.publishEvent(event);
      • 또는 필드 주입 @Autowired private ApplicationEventPublisher publisher 후 publishEvent(event)를 통해 발행
    • 이벤트 리스닝
      • ApplicationListener<XxxEvent> 구현 - 타입 매개변수에 매치되는 이벤트를 모두 알림 받음
      • 또는 @EventListener 애노테이션 사용(spring 4.2) -> 이벤트 생성 시 ApplicationEvent를 상속할 필요가 없다. 

 

'JAVA > JAVA' 카테고리의 다른 글

리플렉션  (0) 2020.09.04
JVM 이해하기  (0) 2020.09.01
Generics - 제네릭 사용 이유  (0) 2020.05.27
Comments