Spring framework 설정 (XML)

 

스프링에 일종의 DI를 위한 부품 조립서를 제공해야 합니다.

이 주문서를 anonotation과 XML를 통해 작성을 할 수 있습니다.

 

조립서에 해당하는 부품을 담는 그릇을 소프트웨어에서는 보통 컨테이너라고 부릅니다.

스프링에서는 해당 객체(부품)들을 담는 컨테이너를 IOC컨테이너 라고 부릅니다.

 

 

이 IOC 컨테이너는 빈의 생명주기나 가공을 관리함으로써 개발자 직접 객체의 관리와 생명주기 관리에 대한 부담을 줄일 수 있습니다.

그림과 같이 컨테이너에 담긴 객체들을 Bean이라고 부릅니다.

스프링은 위에서 언급한 조립서같은 설정파일 (xml)을 읽어 빈을 생성합니다.

 

Dependency 직접 Injection

public interface Exam {
	int total();
        int avg();
    	void setExam();
}

public class NewlecExam implements Exam{
	private int kor;
	private int math;
	private int science;

	@Override
    public int total(){
    	retrun kor+math+science;
    }
    @Override
    public float avg(){
    	retrun 0;
    }
} 

public interface ExamConsole {
	void print();
}
public class InlineExamConsole implements ExamConsole{
	private Exam exam;
    
    //기본 생성자
    public InlineExamConsole(){
    
    }
    
	//의존성 주입
	public InlineExamConsole(Exam exam){
    	this.exam = exam;
    }
    
    @Override
    public void setExam(Exam exam){
    	this.exam  = exam;
    }
    
	@Override
    public void print(){
    	System.out.println("total is %d", avg is %f\n", exam.total(), exam.avg());
    }
    
    
}

 

public static void main(String[] args){
	Exam exam = new NewlecExam();
	ExamConsole console = new InlineExamConsole(exam);
    console.setExam(exam);
    console.print();
}

 

만약 여기서 ExamConsole이 아닌 다른 구현클래스로 변경하려면 소스코드의 수정이 필요하다. 하지만 객체생성부분의 설정을 XML 지시서에 설정을 한다면 코드의 수정없이 교체가 가능하다.

 

* 스프링 설정파일 (지시서) 작성

setting.xml 이름으로 파일을 작성한다. (config파일)

 

<?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:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"></beans>

 

해당 내용을 상단에 기입해주셔야 합니다. 그리고 의존성을 주입하는 부분을 스프링 설정파일로 옮겨야 합니다.

 

<beans>태그 안에 기입해주셔야 합니다.

 

<bean id="exam" class="패키지경로.NewlecExam"/> // 해당 빈의 이름 지정,  어떠한 클래스를 객체화 할 것인지 패키지명까지 같이 기입 

 

setExam은 console이 해당 메서드를 가지므로 

<bean id="console" class="패키지경로.InlineExamConsole" >

     <property name="exam" ref="exam"></ property >

</bean> 

  //set은 생략하는게 규칙이고 소문자로 시작한다. setExam을 호출하기 위한 함수명이다.  

setExam() 안에 들어가는 값 타입이 value타입이면 value=""를 사용하고 ref타입이면 ref=""를 사용한다.

<bean id="exam" class="패키지경로.NewlecExam"/> 를 property안에 주입하는 것임.

 

이제  이 지시서를 읽고 생성해서 조립해주는 명령어가 필요하다. ApplicationContext객체가 이 역할을 하는 인터페이스이다.

ApplicationContext context = new ClassPathXmlApplicationContext("setting.xml"); 

뒤에 오는 구현체에는 4가지 종류가 있다.

 

- ClassPathXmlApplicationContext : ClassPath에 위치한 xml 파일을 읽어 설정 정보를 로딩, root로부터 경로를 지정함

- FileSystemXmlApplicationContext : 파일 경로로 지정된 곳의 xml을 읽어 설정 정보를 로딩

- XmlWebApplicationContext : 웹 어플리케이션에 위치한 곳에서 xml파일을 읽어 설정 정보를 로딩

- AnnotationConfigApplicationContext : @Configuration 어노테이션이 붙은 클래스를 이용하여 설정 정보로 로딩

 

아래는 최종적으로 변환된 코드이다.

public static void main(String[] args){
	/*
    Exam exam = new NewlecExam();
	ExamConsole console = new InlineExamConsole(exam);
    console.setExam(exam);
    */
    
    //해당 객체를 생성할때 스프링 라이브러리가 필요하다.
    ApplicationContext context = new ClassPathxmlApplicationContext("패키지경로.setting.xml");
    
    ExamConsole console = (ExamConsole)context.getBean("console") 
    //지시서에서 console이라는 id를 가진 객체를 불러온다.
 	//형변환을 해주어야 한다.
 	console.print();
}

 

이제 <bean id="console" class="패키지경로.InlineExamConsole" > 여기서 해당 구현클래스를 바꾸더라도 소스코드의 수정없이 원할하게 동작을 할 수 있게된다. 

 

 

<출처: Youtube 뉴렉처 : https://www.youtube.com/@newlec1>

 

'Spring' 카테고리의 다른 글

[Spring] IOC , DI  (0) 2025.04.02
Spring Security  (0) 2025.02.24
Component  (0) 2024.10.15
스프링 MVC란?  (0) 2024.10.14
스프링 어노테이션을 활용한 DI  (3) 2024.10.12

+ Recent posts