매일 까먹는 스프링 개념 정리 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를 구현하고 커스텀 스코프를 스프링 설정에 등록하여 사용 |