매일 까먹는 스프링 개념 정리 1

2018-09-09

1. DI (Dependency Injection)

  • 객체간의 의존성을 자신이 아닌 외부에서 주입하는 개념
  • 소스 코드의 변경 없이 환경 설정만으로도 프로그램을 제어할 수 있다 (모듈 간의 결합도를 낮춰서 유연한 변경을 가능하게 함)
  • Java 파일의 수정 없이 스플이 설정 파일만을 수정하여 부품들을 생성/조립 할 수 있음
  • 각 class 사이의 의존 관계를 Bean 설정 정보를 바탕으로 container가 자동으로 연결해주는 것을 의미함

1-1. DI 종류

  • setter Injection
  • Construnctor Injection


2. IoC container

  • 스프링 프레임워크에서 생성된 Bean을 관리하는 공간.
  • Spring Container, DI Container, IoC Container, Bean Container
  • Bean(객체) 보관, Bean 생명주기(생성, 사용, 소멸) 관리
  • DI

2-1. 스프링 컨테이너 생명 주기

  • 스프링 컨테이너 생성 -> 스프링 컨테이너 설정 -> 스프링 컨테이너 사용 -> 스프링 컨테이너 종료
// 생성
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext()
// 설정
ctx.load("classpath:applicationCtx.xml");
  // 빈 객체 생성(읽어온 메타정보로 빈객체 초기화)
ctx.refresh();
// 사용
Board board = ctx.getBean("board", Board.class);
// 종료
ctx.close();


3. 스프링 빈 생명주기

3-1. 인터페이스 구현

  • implements InitializingBean, DisposableBean
  • InitializingBean을 구현하면 반드시 afterPropertiesSet()을 @Override 해야함
  • afterPropertiesSet()은 빈 초기화 과정(ctx.refresh())에서 호출됨
@Override
public void afterPropertiesSet() throws Exception {

}
  • DisposableBean을 구현하면 반드시 destory()을 @Override 해야함
  • destory()는 빈 소멸(ctx.close()) 과정에서 생성
  • ctx.close()는 컨테이너가 소멸하는 단계이지만 컨테이너가 소멸하게 되면 빈은 자동 소멸됨.
@Override
public void destroy() throws Exception {

}

3-2. 어노테이션 이용 방법

  • @PostContructor, @PreDestroy
  • @PostContructor: 빈이 생성되는 초기화 과정에서 호출
  • @PreDestroy: 빈이 소멸되는 과정에서 호출
@PostContructor
public void initMethod(){

}

@PreDestroy
public void destroyMethod(){

}


4. 스프링 빈 범위(scope)

  • 스프링 컨테이너가 생성되고, 스프링 빈이 생성될 때 생성된 스프링 빈은 scope를 가지고 있다
  • scope란 쉽게 생각해서 해당 객체가 어느까지 영향을 미치는지 결정하는 것
// 디폴트가 singleton
// @Scope("singleton") 어노테이션 방법도 있음
<bean id="board" class="com.test.Board" scope="singleton">
  <constuctor-arg value="1"></constuctor>
  <constuctor-arg value="제목"></contructor>
</bean>

Board board1 = ctx.getBean("board", Board.class);
board.setId(1);
board.setTitle("게시물1");

Board board2 = ctx.getBean("board", Board.class);
board2.setId(2);
board.setTitle("게시물2");

// board1 == board2


  • 빈 스코프(Bean scope)
scope 설명
singleton 기본 싱글톤 스코프
prototype 어플리케이션에서 요청시(getBean()) 마다 스프링이 새 인스턴스를 생성
request HTTP 요청별로 인스턴스화 되며 요청이 끝나면 소멸
session HTTP 세션별로 인스턴스화 되며 세션이 끝나면 소멸
thread 새 쓰레드에서 요청하면 새로운 bean 인스턴스 생성, 같은 쓰레드에 대해서는 항상 같은 인스턴스 반환
custom Scope를 구현하고 커스텀 스코프를 스프링 설정에 등록하여 사용