DI - XML 설정 방법 코드

이지윤·2022년 4월 4일
0

XML을 이용한 DI

di-xml 예제 프로젝트 구성

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

자바 버전 설정

di-xml 프로젝트 환경 : POM.xml

  • spring-context -> Spring 프레임워크 버전

  • 로깅 프레임워크 → slf4j-api, logback-classic

  • src/main/resources/applicationContext.xml 생성

  • src/main/resources/applicationContext.xml 네임스페이스 추가

beans 네임 스페이스 : 빈(컴포넌트) 설정
C 네임 스페이스 : 생성자 인자를 <bean> 요소 어트리뷰트로 선언
context 네임 스페이스 : 빈 검색과 어노테이션 설정 (ex. context:component-scan)

di-xml 예제 프로젝트의 DI 애플리케이션 구성

  • DI를 이용한 인터페이스 기반의 컴포넌트화 완성
  • 인터페이스와 컨테이너 이용하여 클래스 구현 -> 변경 or 확장되더라도 해당 클래스를 이용하는 다른 클래스에 영향 범위를 최소화

예제 코드

StudentVO.java

package org.tukorea.di.domain; 
  public class StudentVO {
	private String id;
	private String passwd;
	private String username;
	private String snum;
	private String depart;
	private String mobile;
	private String email;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPasswd() {
		return passwd;
	}
	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getSnum() {
		return snum;
	}
	public void setSnum(String snum) {
		this.snum = snum;
	}
	public String getDepart() {
		return depart;
	}
	public void setDepart(String depart) {
		this.depart = depart;
	}
	public String getMobile() {
		return mobile;
	}
	public void setMobile(String mobile) {
		this.mobile = mobile;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
    @Override
	public String toString() {
		return "StudentVO [id=" + id + ", passwd=" + passwd + ", username=" + username + ", snum=" + snum + ", depart="
				+ depart + ", mobile=" + mobile + ", email=" + email + "]";
	}
}

MemberrDAO.java

package org.tukorea.di.persistance;

import org.tukorea.di.domain.StudentVO;

public interface MemberDAO {
	public StudentVO read (String id) throws Exception;
	public void add(StudentVO student) throws Exception;
}

MemberDAOImpl.java

package org.tukorea.di.persistance;

import java.util.HashMap;
import java.util.Map;

import org.tukorea.di.domain.StudentVO;

public class MemberDAOImpl implements MemberDAO {
	public Map<String, StudentVO> storage = new HashMap<String, StudentVO>();
	@Override
	public StudentVO read(String id) throws Exception {
		// TODO Auto-generated method stub
		return storage.get(id);
	}

	@Override
	public void add(StudentVO student) throws Exception {
		// TODO Auto-generated method stub
		storage.put(student.getId(), student);
	}

}

MemberService.java

package org.tukorea.di.service;
import org.tukorea.di.domain.StudentVO;

public interface MemberService {
	public StudentVO readMember(String userid) throws Exception;
	public void addMember(StudentVO student) throws Exception;
}

MemberServiceImpl.java

package org.tukorea.di.service;
import org.tukorea.di.domain.StudentVO;
import org.tukorea.di.persistance.MemberDAO;
public class MemberServiceImpl implements MemberService {
	private MemberDAO memberDAO;
	
	public MemberServiceImpl(MemberDAO memberDAO) {
		this.memberDAO = memberDAO;
		}
	
		public StudentVO readMember(String userid) throws Exception {
		return memberDAO.read(userid);
		}
		
		public void addMember(StudentVO student) throws Exception {
		memberDAO.add(student);
		}

}

MemberSampleMain.java

package org.tukorea.di.main;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import org.tukorea.di.domain.StudentVO;
import org.tukorea.di.service.MemberService;

public class MemberSampleMain {
	private static ApplicationContext ctx = null;
	public static void main(String[] args) throws Exception {
		System.out.println("안녕하세요 DI-XML");
		ctx = new GenericXmlApplicationContext("classpath:applicationContext.xml"); // 스프링 컨테이너 생성
		MemberService memberService = (MemberService)ctx.getBean("memberService"); // 스프링 컨테이너에서 컴포넌트를 가져온다
		StudentVO vo = new StudentVO(); 
		vo.setId("kanadara");
		memberService.addMember(vo);
		StudentVO member = memberService.readMember("kanadara");
		System.out.println(member);
	}
}

Dependency Injection 의존성 주입 방식

생성자 기반 의존성 주입 (Constructor based dependency Injection)

  • 생성자의 인수를 사용해 의존성 주입
  • XML에 <constructor-arg>태그를 사용하여 주입할 컴포넌트 설정

설정자 기반 의존성 주입(Setter based dependency Injection)

  • 메서드의 인수를 통해 의존성 주입
  • XML에 <property>요소의 name 속성에 주입할 컴포넌트의 이름을 설정

bean 태그 속성

  • id : 오브젝트를 유일하게 하는 ID
  • name : 오브젝트명을 정의
  • class : id의 실체, 패키지명과 클래스 명으로 구성
  • scope : 오브젝트의 스코프를 지정 (singleton, prototype,..)
  • parent : 설정을 물려받을 오브젝트 명
  • abstract
    • true : 인스턴스를 만들지 않고 공통 설정을 정의해두고 싶을 때 지정
    • false : 속성 생략 시 기본값. 인스턴스를 만들고 싶을 때 지정
  • singleton
    • true : 속성 생략 시 기본값. getBean 메서드로 얻는 인스턴스는 싱글턴
    • false : getBean 메서드로 얻는 인스턴스는 매번 인스턴스화된 것
  • laze-init
    • true : 인스턴스 생성을 지연시킴
    • false : 속성 생략 시 기본값. BeanFactory 시작 시 인스턴스를 생성
  • depend-on : 의존 관계의 대상이 되는 오브젝트가 있는지 검사
  • init-method : 메서드 명을 기술함으로써 인스턴스 변수의 설정 후에 호출함
  • destroy-method : 메서드 명을 기술함으로써 시스템 종료시 호출됨
  • parent : 설정을 물려받을 오브젝트명을 지정
  • autowire
    • no :속성 생략 시 기본값
    • byName : 프로퍼티 명과 일치하는 오브젝트 명의 Bean이 자동으로 인젝션됨
    • byType : 프로퍼티 형과 일치하는 Bean이 인젝션됨
    • constructor : 생성자를 이용해 인젝션
profile
초보자

0개의 댓글