• Home
  • About
    • Jiwon Jeong photo

      Jiwon Jeong

      끊임없이 배우며 성장하는 엔지니어

    • Learn More
    • Email
    • Github
  • Posts
    • All Posts
    • All Tags
    • All Categories
  • Projects

IoC & DI

07 May 2021

Reading time ~2 minutes

컨테이너란? (복습)

  • 컨테이너는 인스턴스의 생명주기를 관리하며, 생성된 인스턴스에게 추가적인 기능을 제공
  • Servlet을 실행해주는 WAS는 Servlet 컨테이너를 가지고 있음
  • WAS는 웹 브라우저로부터 서블릿 URL에 해당하는 요청을 받으면, 서블릿을 메모리에 올린 후 실행
  • 개발자가 서블릿 클래스를 작성했지만, 실제로 메모리에 올리고 실행하는 것은 WAS가 가지고 있는 Servlet 컨테이너임
  • Servlet컨테이너는 동일한 서블릿에 해당하는 요청을 받으면, 또 메모리에 올리지 않고 기존에 메모리에 올라간 서블릿을 실행하여 그 결과를 웹 브라우저에게 전달
  • 컨테이너는 보통 인스턴스의 생명주기를 관리하며, 생성된 인스턴스들에게 추가적인 기능을 제공하는 것

IoC(Inversion of Control) - 제어의 역전이란?

  • 컨테이너가 코드 대신 오브젝트의 제어권을 갖고 있어 IoC(제어의 역전)이라 불림
  • 서블릿 클래스는 개발자가 만들지만, 그 서블릿의 메소드를 알맞게 호출하는 것은 WAS
  • 개발자가 만든 어떤 클래스나 메소드를 다른 프로그램이 대신 실행해주는 것을 제어의 역전
  • 공장을 만들어 내는 역할을 함
  • e.g1) TV tv = TVFactory 클래스 내 getTV(param) 함수 => param값에 따라 삼성TV, 엘지TV 생성가능
  • e.g2) 서블릿 Anotation을 이용하면 WAS가 그 어노테이션에 해당되는 서블릿 클래스를 만들어서 줌

DI(Dependency Injection)란?

  • 공장이 Instance를 만들었다면 만들어진 Instance를 사용해야 함
  • 그럴려면 공장이 만든 Instance를 내가 사용하는 프로그램에서 가져올 수 있어야 함
  • 가져올 수 있는 방법 중 하나가 DI
  • 클래스 사이의 의존 관계를 빈(Bean) 설정 정보를 바탕으로 컨테이너가 자동으로 연결
    • 자바빈이란, Spring IoC 컨테이너가 관리하는 자바 객체
  • DI가 적용 안된 예
    • 개발자가 직접 인스턴스 생성
class 엔진 {

}

class 자동차 {
     엔진 v5 = new 엔진();
}

  • Spring에서 DI가 적용된 예

    • 엔진 type의 v5변수에 아직 인스턴스가 할당되지 않음
    • 컨테이너가 v5변수에 인스턴스를 할당해주게됨
@Component
class 엔진 {

}

@Component
class 자동차 {
     @Autowired
     엔진 v5;
}

Spring에서 제공하는 IoC/DI 컨테이너

  • BeanFactory : IoC/DI에 대한 기본 기능을 가지고 있음
  • ApplicationContext : BeanFactory의 모든 기능을 포함하며, 일반적으로 BeanFactory보다 추천됨. 트랜잭션처리, AOP등에 대한 처리를 할 수 있습니다. BeanPostProcessor, BeanFactoryPostProcessor등을 자동으로 등록하고, 국제화 처리, 어플리케이션 이벤트 등을 처리할 수 있음
  • BeanPostProcessor : 컨테이너의 기본로직을 오버라이딩하여 인스턴스화 와 의존성 처리 로직 등을 개발자가 원하는 대로 구현 할 수 있도록 함
  • BeanFactoryPostProcessor : 설정된 메타 데이터를 커스터마이징 할 수 있음


WebProgramming Share Tweet +1