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 |