Hyokyun Yim bio photo

Hyokyun Yim

Koreatech Computer Science Engineering undergraduate 4 grade.

Facebook Github

DI의 Life Cycle 에 대해 알아보자.

Overview

DI의 Life Cycle

Bean 객체의 생성과 소멸

생성 시점에 작업 처리하기

  • 생성자가 호출되는 시점에 필요한 작업을 처리할 수 있다.
  • InitializingBean 을 implements 하고 추상 메서드 afterPropertiesSet() 를 이용해 필요한 작업을 처리할 수 있다.
  • 또 다른 방법으로 @PostConstruct 어노테이션을 이용하는 방법, xml파일에 -nit-method 를 사용하는 방법이 있다.
  • 생성자까지 포함해서 생성시 작업을 할 수 있는 방법은 총 4가지가 존재.
  • 생성자 -> PostConstruct -> afterPropertiesSet -> xml의 init-method 순서로 호출됨
  • @PostConstruct 어노테이션을 이용하려면 xml namespace에 context를 체크해주고 , context:annotation-config 을 xml에 작성 해주어야함.

소멸 시점에 작업 처리하기

  • 자바는 C언어와 달리 소멸자가 없으므로 ctx.close()시점 즉 Spring Container가 종료되는 시점에 남은 처리를 잡아서 수행한다.
  • DisposableBean 을 implements 하고 추상 메서드 destroy() 를 이용해 구현한다.
  • 또 다른 방법으로 @PreDestroy 어노테이션을 이용하는 방법, xml파일에 destroy-method 를 사용하는 방법이 있다.
  • 소멸 작업을 할 수 있는 방법은 총 3가지가 존재.

생성, 소멸 예제 코드


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:util="http://www.springframework.org/schema/util"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">

	
	
	<context:annotation-config />
	
	
	<!-- Spring 컨테이너에 의해 3개의 책 DTO가 생성. -->
	<!-- scope는 디폴트로 singleton, 싱글톤이란 객체가 딱 하나만 존재하는것 -->
	<bean id = "book1"
	 class = "exam_02_04_BookShelf.dto.BookDTO"
	 scope="singleton"
	 init-method="myInit"
	 destroy-method="myDestroy">
	 <!--  init-method는 초기화메서드를 추가로 지정 -->
	
		<property name ="btitle"> 
			<value> 젊은 베르테르의 슬픔</value>
		</property>
		
		<property name="bauthor">
			<value>괴테</value>
		</property>
	</bean>
</beans>
package exam_02_04_BookShelf;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

import exam_02_04_BookShelf.dto.BookDTO;

public class Main {

	public static void main(String[] args) {

		String config = "classpath:applicationCtx.xml";
		
		//Spring Container 생성
		GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
		
		//xml문서 불러들이는 부분
		ctx.load(config);
		
		//load 메서드로 xml을 불러올 경우 반드시 refresh() 메서드를 수행해야함.
		//xml 적용
		ctx.refresh();
		
		//Bookshelf 클래스 타입인 shelf 객체를 끄집어냄
		BookShelf shelf = ctx.getBean("shelf",BookShelf.class);
		
		System.out.println("책장 title : " + shelf.getTitle());
		System.out.println("책장 price : " + shelf.getPrice());
		
		//shelf에서 getList를 통해 ArrayList를 뽑아내고 그 ArrayList 안에서 인덱스 1인  BookDTO를 뽑아내서
		//title값을 알아낸다.
		System.out.println(shelf.getList().get(1).getBtitle());
		//shelf에서 getMap을 통해 HashMap을 뽑아내고 그 HashMap 안에서
		//key 값이 2인 BookDTO를 찿아서 책의 제목을 출력
		
		System.out.println(shelf.getMap().get(2).getBtitle());
	
		ctx.close();
	}

}


package exam_02_04_BookShelf.dto;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class BookDTO implements InitializingBean , DisposableBean{

		//필드는 특별한 이유가 있지 않는한 information hiding때문에
		//private으로 설정한다.
		private String btitle;
		private String bauthor;
		
		
		//생성자 -> PostConstruct -> afterPropertiesSet -> xml의 init-method 순서로 호출됨
		//기본 constructor는 사용하던 사용하지 않던간에 반드시 명시를 해 주세요!!
		public BookDTO()
		{
			//instance가 생성되면 호출
			//bean 객체를 초기화 할때 여기에서 작업해 주면 된다.
			System.out.println("BookDTO 생성자 호출");
		}
		
		@Override
		public void afterPropertiesSet() throws Exception {
			//bean 객체를 초기화 할때 여기에서 작업해 주면 된다.
			System.out.println("afterPropertiesSet 메서드 호출");
			
		}
		
		
		//PostConstruct 는 <context:annotation-config/> 를 xml파일에 추가해줘야 사용가능 , namespace에 context 추가
		@PostConstruct
		public void initBean()
		{
			System.out.println("initBean 메서드 호출");
		}
		
		public void myInit()
		{
			System.out.println("myInit 메서드 호출");
		}
		
		
		
		@Override
		public void destroy() throws Exception {
			System.out.println("destroy 메서드 호출");
			
		}

		@PreDestroy
		public void destroyBean()
		{
			System.out.println("destroyBean 메서드 호출");
		}
		
		public void myDestroy()
		{
			System.out.println("myDestroy 메서드 호출");
		}
		
		
		//private 필드에 대한 getter/setter
		public String getBtitle() {
			return btitle;
		}

		public void setBtitle(String btitle) {
			this.btitle = btitle;
		}

		public String getBauthor() {
			return bauthor;
		}

		public void setBauthor(String bauthor) {
			this.bauthor = bauthor;
		}

	

		
	
		
}



package exam_02_04_BookShelf;

import java.util.ArrayList;
import java.util.HashMap;

import exam_02_04_BookShelf.dto.BookDTO;

public class BookShelf {

	private String title; //책장명
	private int price; //책장가격
	
	private ArrayList<BookDTO> list;
	private HashMap<Integer,BookDTO> map;
	
	//기본 생성자는 쓰든 쓰지 않든 무조건 명시해주자.
	public BookShelf()
	{
	
	}
	
	//생성자 injtection 방식으로 2개의 필드 설정
	public BookShelf(String title, ArrayList<BookDTO> list)
	{
		this.title = title;
		this.list = list;
	}
	
	public void setPrice(int price) {
		this.price = price;
	}
	
	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public ArrayList<BookDTO> getList() {
		return list;
	}

	public void setList(ArrayList<BookDTO> list) {
		this.list = list;
	}

	public int getPrice() {
		return price;
	}

	public HashMap<Integer, BookDTO> getMap() {
		return map;
	}

	public void setMap(HashMap<Integer, BookDTO> map) {
		this.map = map;
	}
}