티스토리 뷰

Inversion of Control / Dependency Injection

  • Dependency Injection은 Inversion of Control 원칙을 구현하기 위한 방법. (IoC=DI)
  • 컨테이너가 코드 대신 오브젝트의 제어권을 갖고 있어 IoC(제어의 역전)이라 한다.
  • 개발자가 만든 어떤 클래스나 메소드를 다른 프로그램이 대신 실행해주는 개념.
  • 누군가가 Bean을 넣어주면 사용자는 활용만 할 뿐 그것이 무엇인지 모른다.
  • POJO와 설정(Configuration Metadata)을 등록하고 IoC/DI Container에 주입시키면 Bean을 생성(인스턴스화)한다. 이 과정을 Dependency Injection 혹은 Inversion of Control이라 할 수 있다.
  • Spring에서 제공하는 IoC/DI Container의 종류
    • BeanFactory : IoC/DI에 대한 기본 기능을 가지고 있다. 요청이 왔을 때 객체를 만든다.(lazy-loading)
    • ApplicationContext : BeanFactory의 모든 기능을 상속받고 추가로 트랜잭션처리, AOP 등의 처리를 할 수 있다. 즉시 객체를 만든다.(pre-loading)

장점

  • 모듈 간의 의존성이 낮아진다.
  • 프로그램의 수행과 구현을 분리할 수 있다.
  • 프로그램 수정이 편하다.

소스코드

public class UserBean {
    private String name;
    private int age;
    private boolean male;

    public UserBean() {}
    public UserBean(String name, int age, boolean male) {
        this.name = name;
        this.age = age;
        this.male = male;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public boolean isMale() {
        return male;
    }
    public void setMale(boolean male) {
        this.male = male;
    }
}

 

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="userBean" class="kr.or.connect.diexam01.UserBean"/>
</beans>

 

public class ApplicationContextExam01 {
    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        System.out.println("초기화 완료!!");

        UserBean userBean = (UserBean)ac.getBean("userBean");
        userBean.setName("seogineer");

        System.out.println(userBean.getName());

        UserBean userBean2 = (UserBean)ac.getBean("userBean");

        if(userBean == userBean2) {
            System.out.println("같은 인스턴스입니다.");
        }
    }
}

결과

  • 기본적으로 Singleton 패턴으로 bean을 생성하기 때문에 userBean과 userBean2가 같다.
    즉, 메모리에 UserBean의 객체를 하나만 생성한다.
  • 이 같이 Singleton으로 객체를 대신 생성하고 관리해주는 기능을 IoC라 한다.

참조

https://www.boostcourse.org/web316/lecture/20656/
https://www.boostcourse.org/web316/lecture/254335/

https://starkying.tistory.com/entry/IoC-DI

sabarada.tistory.com/67

gmlwjd9405.github.io/2018/11/09/dependency-injection.html

jojoldu.tistory.com/28

'Framework > Spring' 카테고리의 다른 글

Spring JDBC 실습  (0) 2021.01.04
Spring JDBC  (0) 2021.01.04
Spring Container metadata 설정 방법  (0) 2021.01.01
이클립스 maven 프로젝트에서 spring 라이브러리 추가  (0) 2021.01.01
프레임워크와 라이브러리  (0) 2021.01.01
댓글
Total
Today
Yesterday
링크
Apple 2023 맥북 프로 14 M3, 스페이스 그레이, M3 8코어, 10코어 GPU, 512GB, 8GB, 한글