스프링 IoC/DI 컨테이너 활용
XML을 이용한 방식
- src/main/resources 경로 아래 xml 파일로 스프링 컨테이너에 전달할 정보를 작성한다.
- 스프링이 버전 업 되면서 더 편한 방식이 등장하고 있다. → 어노테이션과 Config를 이용한다.
applicationContext.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">
<!-- 스프링 컨테이너에게 전달할 정보를 입력한다.
bean은 자바의 일반적인 클래스를 말한다.
id 속성에 객체를 생성할 때 지정할 레퍼런스 변수명을 입력한다.
class 속성에 만들고 싶은 클래스 정보를 전달한다.
스프링 컨테이너는 이렇게 생성한 객체를 하나만 가지고 있다, 즉 싱글톤 패턴을 이용한다. (스코프를 지정해 변경 가능)
-> kr.or.connect.diexam01.UserBean userBean = new kr.or.connect.diexam01.UserBean(); -->
<bean id="userBean" class="kr.or.connect.diexam01.UserBean"></bean>
<bean id="e" class="kr.or.connect.diexam01.Engine" />
<bean id="c" class="kr.or.connect.diexam01.Car" >
<!-- DI, 의존성 주입
어떤 객체에 다른 객체를 주입한다.
프로퍼티는 getter, setter 메소드를 말한다.
ref는 전달할 매개변수를 지정한다.
즉, 아래 엘리먼트는 e를 매개변수로 갖는 setEngine() 메소드를 의미한다 -->
<property name="engine" ref="e"></property>
</bean>
</beans>
IoC 예시
// UserBean 클래스 코드는 생략
// 다만, 빈 클래스 특징에 적합하도록 작성한다.
package kr.or.connect.diexam01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ApplicationContextExam01 {
// 프로그램 시작점
public static void main(String[] args) {
// 스프링 설정 파일(applicationContext.xml)을 읽어오는 factory 객체
// 아래와 같이 인스턴스가 생성될 때, 파라미터로 전달된 xml 파일에 선언된 모든 bean들을 생성해 메모리에 올린다
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
System.out.println("초기화 완료!");
//getBean()메서드에 매개변수로 전달한 값을 id로 가진 빈을 찾아서 해당 객체의 레퍼런스를 반환한다
UserBean userBean = (UserBean)ac.getBean("userBean");
userBean.setName("Hwang");
System.out.println(userBean.getName());
UserBean userBean2 = (UserBean)ac.getBean("userBean");
if(userBean == userBean2) System.out.println("같은 인스턴스입니다.");
// 스프링 ApplicationContext는 싱글톤 패턴을 이용해 하나의 객체만 생성한다.
}
}
// 출력 결과
// Engine 생성자
// Car 생성자 // 위 두 클래스 파일은 아래에 코드를 함께 첨부해두었습니다.
// 초기화 완료!
// Hwang
// 같은 인스턴스입니다.
IoC와 DI 예시
// Engine 클래스(Engine.java)
package kr.or.connect.diexam01;
public class Engine {
public Engine() {
System.out.println("Engine 생성자");
}
public void exec() {
System.out.println("엔진이 동작합니다.");
}
}
//Car 클래스(Car.java)
package kr.or.connect.diexam01;
public class Car {
private Engine v8;
public Car() {
System.out.println("Car 생성자");
}
public void setEngine(Engine e) {
this.v8 = e;
}
public void run() {
System.out.println("엔진을 이용하여 달립니다.");
v8.exec();
}
/* 스프링 IoC 컨테이너에 의해 제어가 될 과정, 제어의 역전이 실행될 부분
public static void main(String[] args) {
Engine e = new Engine();
Car c = new Car();
c.setEngine(e);
c.run();
}
*/
// 스프링 컨테이너를 이용할 메인 java 파일
package kr.or.connect.diexam01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ApplicationContextExam02 {
public static void main(String[] args) {
// 스프링 컨테이너를 이용한 제어의 역전과 DI 구현
// xml 파일 이용
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
Car car = (Car)ac.getBean("c");
car.run();
}
}
}
// 출력 결과
// Engine 생성자
// Car 생성자
// 엔진을 이용하여 달립니다.
// 엔진이 동작합니다.
- DI를 활용한다면, 실제 자바 코드의 변경없이 xml 설정만을 수정해 코드에 지정된 상위 객체를 상속 받는 하위객체를 활용하는 로직 등을 수행하도록 할 수 있다.
Bean class란?
예전에는 Visual 한 컴포넌트를 Bean이라고 불렀지만, 근래 들어서는 일반적인 Java클래스를 Bean클래스라고 보편적으로 일컫는다.
Bean클래스의 3가지 특징
- 기본생성자를 가지고 있다.
- 필드는 private하게 선언한다.
- getter, setter 메소드를 가진다.
- getName() setName() 메소드를 name 프로퍼티(property)라고 한다. (용어 중요)
Spring 컨테이너가 관리하는 객체를 빈(Bean)이라고 말한다.
- 직접 new 연산자로 생성해서 사용하는 객체는 빈(Bean)이라고 말하지 않는다.
- Spring은 빈을 생성할 때 기본적으로 싱글톤(Singleton)객체로 생성한다.
- 싱글톤이란 메모리에 해당 객체를 하나만 생성한다는 것이다.
출처) 부스트코스 풀스택 강의 https://www.boostcourse.org/web316/lecture/254336?isDesc=false
'Spring' 카테고리의 다른 글
[스프링부트] Oauth2.0 클라이언트 구현 (0) | 2023.09.02 |
---|---|
Java config를 이용하여 스프링 컨테이너(ApplicationContext) 설정하기 (0) | 2021.07.10 |
forward & redirect (0) | 2021.07.01 |
Servlet과 JSP연동 (0) | 2021.07.01 |
JSP 란? (0) | 2021.07.01 |