본문 바로가기
Spring

스프링 Ioc/DI 컨테이너 사용 (xml 파일 이용)

by seeker00 2021. 7. 8.

스프링 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