JAVA를 이용한 DI 설정

이지윤·2022년 4월 6일
0

Java를 이용한 DI 설정 방법

Java로 DI 설정

  • xml 문법 대신 자바 코드로 빈 설정
  • 개발 환경에 따라 설정 방식 선택
  • Java로 DI 설정 코드의 장점
    • TypeSafe하고 Refactoring에 매우 적합
    • 프로퍼티 명 or 클래스 명이 틀렸을 경우 컴파일 에러* 컨테이너 생성 클래스
    • AnnotationConfigApplicationContext

주요 Annotation

  • XML 설정 없이 자바 코드를 이용해 빈 객체 생성과 빈 객체 간의 의존 관계 설정

    @Configuration : 빈 설정 메타 정보를 담고 있는 클래스 선언
    @Bean : 클래스 내의 메서드를 정의하여 새로운 빈 객체를 정의할 때 사용

자바 설정과 XML 관계

  • @Bean과 메서드 이름을 이용해 컨테이너가 사용할 빈 객체를 생성
  • 자바 설정은 빈 객체를 직접 생성
  • @Bean 매서드를 불러들여서 객체를 취득
    • 매서드 이름이 memberDAO를 빈의 식별자로 사용

  • XML에서는 <property> or <constructor-arg> 태그를 이용해 설정 But 자바 설정에서는 직접 의존 객체를 주입

di-java 예제 프로젝트 만들기

  • di-java 경로 구성

  • Java 코드 설정 - @Bean 매서드를 불러서 취득

  • JavaConfig.java

package org.tukorea.di.config;
import org.tukorea.di.persistence.MemberDAO;
import org.tukorea.di.persistence.MemberDAOImpl;
import org.tukorea.di.service.MemberService;
import org.tukorea.di.service.MemberServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration

@Configuration
public class JavaConfig {
	@Bean
	public MemberDAO memberDAO() {
		return new MemberDAOImpl();
    }
    
	@Bean(name="service")
	public MemberService memberService() {
		return new MemberServiceImpl(memberDAO()); 
    }
}
  • MemberSampleMain.java
package org.tukorea.di.main;
import org.tukorea.di.config.JavaConfig;
import org.tukorea.di.domain.StudentVO;
import org.tukorea.di.service.MemberService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MemberSampleMain {
	private static ApplicationContext ctx = null; 	
    public static void main(String[] args) throws Exception {
    System.out.println("안녕하세요 DI-JavaConfig");

	ctx = new AnnotationConfigApplicationContext(JavaConfig.class); //자바설정코드 클래스 	
	MemberService memberService = ctx.getBean("service", MemberService.class); 
    
    StudentVO vo = new StudentVO(); 
    vo.setId("kanadara");
    
	StudentVO member = memberService.readMember("kanadara"); 		
    System.out.println(member);
}
  • di-java 빈 객체의 라이프사이클 테스트
  • MemberServiceImpl.java
package org.tukorea.di.service;
import org.tukorea.di.domain.StudentVO;
import org.tukorea.di.persistence.MemberDAO;
import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean;

public class MemberServiceImpl implements MemberService, InitializingBean, DisposableBean {

	private MemberDAO memberDAO;
	.................................................................................................................................
	@Override
	public void afterPropertiesSet() throws Exception {
		System.out.println("Init MemberServiceImple");
	}
    
	@Override
	public void destroy() throws Exception {
    	System.out.println("Destroy MemberServiceImple");
	}
}

빈 객체의 스코프와 라이프 사이클

빈 객체 스코프(Scope)

  • 빈이 생성될 수 있는 범위를 설정하기 위해 scope 속성 사용
  • singleton : 기본 설정, 컨테이너당 한 개의 빈 객체 생성
  • prototype : 빈을 요청할 때마다 빈 객체 생성
  • request : 각 요청용 한개의 빈 객체 생성
  • session : 각 세션용 한개의 빈 객체 생성
  • application : 서블릿 context 생성될 때 빈 객체 생성

빈 객체의 라이프사이클

  • 빈 초기화 -> 빈 이용 -> 빈 종료
    순으로 진행
  • 빈 생성 후 초기화 작업과 빈 종료 전 전처리 과정을 수행할 수 있는 방법 제공
  • 빈의 전 처리와 후 처리가 InitializingBean, DisposableBean 인터페이스의 메서드를 통해 실행되는 형태
profile
초보자

0개의 댓글