Program.java
package spring.di;
import spring.di.entity.Exam;
import spring.di.entity.NewlecExam;
import spring.di.ui.ExamConsole;
import spring.di.ui.GridExamConsole;
import spring.di.ui.InlineExamConsole;
public class Program {
public static void main(String[] args) {
Exam exam = new NewlecExam();
//ExamConsole console = new InlineExamConsole(exam); // DI
ExamConsole console = new GridExamConsole();
console.setExam(exam);
console.print();
}
}
위와 같은 코드가 있을 때, console 변수에 각기 다른 인스턴스를 생성하여 대입하기 위해선 코드를 직접 수정하는 방법 밖에 없다. 하지만 객체 생성 부분을 스프링의 도움을 받는다면 코드를 직접 수정하지 않고도 인스턴스를 바꿀 수 있다.
우선 다음과 같이 xml 파일을 통해 스프링에게 명령을 할 수 있다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Exam exam = new NewlecExam(); -->
<bean id="exam" class="spring.di.entity.NewlecExam"/>
<!-- ExamConsole console = new GridExamConsole(); -->
<bean id="console" class="spring.di.ui.GridExamConsole">
<!-- console.setExam(exam); -->
<property name="exam" ref="exam"/>
</bean>
</beans>
스프링에서는 <bean> 태그를 통해 생성할 객체를 알려줄 수 있다. id 속성은 객체의 이름이며, class 속성은 객체화 할 클래스를 의미한다. 여기서 class 속성을 지정할 때에는, 중복되는 객체가 있을 수 있으므로 패키지 이름까지 모두 적어주어야 한다.
다음으로 console.setExam(exam); 구문을 스프링을 통해 수행하기 위해서는 <property> 태그를 사용한다.
여기서 name 속성은 함수의 이름인데, 묵시적인 규칙으로 set은 생략되며 대문자는 소문자로 변경된다. 다음 속성으로는 value와 ref 속성이 올 수 있는데 객체의 타입에 따라 value 또는 ref 속성으로 지정해주면 된다.
이제 실제로 위에서 만든 '지시서'를 읽은 뒤, 해당 지시대로 객체를 생성하고 해당 객체를 활용해 보자.
스프링에서 DI 또는 지시서를 읽은 뒤, 생성하고 조립하는 역할을 하는 녀석의 이름은 ApplicationContext이다.
ApplicationContext는 인터페이스이며, 실제로 이 녀석을 구현하고 있는 클래스에는 여러개가 있는데 대표적인 클래스로 는 ClassPathXmlApplicationContext가 있다.
ApplicationContext의 종류
- ClassPathXmlApplicationContext
- FileSystemXmlApplicationContext
- XmlWebApplicationContext
- AnnotationConfigApplicationContext
이후 프로젝트를 메이븐 프로젝트로 변경한 뒤, pom.xml 파일에 다음의 코드를 추가해주었다.
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.18</version>
</dependency>
</dependencies>
다음으로 Program.java 파일을 열고 다음의 코드를 작성해준다.
...
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Program {
public static void main(String[] args) {
...
ApplicationContext context = new ClassPathXmlApplicationContext("spring/di/setting.xml");
}
}
위의 코드가 잘 작동된다면 이전에 작성하였던 지시문의 수행 결과가 IoC 컨테이너에 저장될 것이다. 여기서 IoC 컨테이너의 이름은 context가 된다.
이제 아래의 코드를 통해 IoC 컨테이너에 저장되어 있는 결과를 가져올 수 있다. 두 방법 모두 동일한 기능을 수행한다.
// 1. ExamConsole console = (ExamConsole)context.getBean("console");
// 2. ExamConsole console = context.getBean(ExamConsole.class);
console.print();
이후 코드를 실행해보면 잘 동작하는 것을 확인할 수 있다.
'🍃 Spring, Spring Boot > 스프링 프레임워크 기초' 카테고리의 다른 글
[Java / Spring] 6. XML Configuration을 Java Configuration으로 변경하기 (0) | 2022.04.11 |
---|---|
[Java / Spring] 5. 어노테이션을 이용한 객체 생성 (0) | 2022.04.11 |
[Java / Spring] 4. 어노테이션을 이용할 때의 장점과 @Autowired를 이용한 DI 해보기 (0) | 2022.04.11 |
[Java / Spring] 3. 콜렉션 생성과 목록 DI (0) | 2022.04.11 |
[Java / Spring] 2. DI 값 설정 (0) | 2022.04.11 |