DI, IoC, 스프링 컨테이너, Bean

정훈희·2022년 10월 10일
0

Spring

목록 보기
2/24
post-thumbnail
post-custom-banner

DI, IoC, 스프링 컨테이너, Bean

참조 링크


DI(Dependency Injection)

  • 의존관계 주입 기능
  • 객체를 직접 생성하는 것이 아닌 외부에서 생성 후 주입시키는 방식
  • DI를 통해 모듈간의 결합도가 낮아지고, 유연성 상승

IoC(Inversion of control, 제어반전)

  • 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라 외부에서 결정되는 것을 의미
  • 컴포넌트 의존관계 설정, 설정 및 생명주기를 해결하기 위한 디자인 패턴
  • 기존의 객체 생성 과정
    1. 객체 생성
    2. 의존성 객체 생성(클래스 내부에서 생성)
    3. 의존성 객체 메소드 호출
  • 스프링에서의 객체 생성 과정
    1. 객체 생성
    2. 의존성 객체 주입(제어권을 스프링에게 위임하여 스프링이 만들어놓은 객체를 주입)
    3. 의존성 객체 메소드 호출

예시

  • 방법 1: A객체가 B와 C객체를 New 생성자를 통해서 직접 생성
    class A{
        private B b = new B();
        private C c = new C();
    }
  • 방법2: 외부(IoC 컨테이너)에서 생성된 객체를 주입시켜 setter() or 생성자를 통해 사용
    class A{
        private B b;
        private C c;
        
        public A(B b, C c){
        	this.b = b;
        	this.c = c;
        }
    }
    
    class ATest{
        B b = new B();
        C c = new C();
        A a = new A(b, c);
    }

방법 1에서는 B, C 객체의 제어권이 A객체에 있었다면, 방법 2에서는 B, C 객체의 제어권이 ATest객체에 있다.

→ 이처럼 의존성을 역전시켜 제어권을 직접 갖지 않는 것을 IoC라 하며, 의존성을 외부에서 주입시켜 주는 것을 DI라고 한다.


컨테이너

  • 개발자가 작성한 코드의 처리과정을 위임받은 독립적인 존재 → 적절한 설정이 되어있다면 개발자가 작성한 코드를 스스로 참조한 뒤 알아서 객체의 생성과 소멸을 컨트롤해줌
  • 객체관리 주체가 개발자가 아닌 프레임워크(Container)가 됨 → 개발자는 로직에 집중
  • 객체 생성 코드가 없으므로 테스트 주도 개발(TDD)이 용이

IoC컨테이너(= 스프링 컨테이너)

  • IoC컨테이너(= 스프링 컨테이너): 스프링에서 객체를 생성, 관리, 책임, 의존성관리 등을 해주는 컨테이너
  • 스프링 컨테이너는 스프링 프레임워크의 핵심부에 위치하며, 종속객체 주입을 이용하여 컴포넌트들을 관리한다. 이때 스프링 컨테이너에서 생성되는 객체를 Bean이라고 한다.

Bean

  • Bean은 Spring Bean Container에 존재하는 객채를 말한다.
  • Bean Container는 의존성 주입을 통해 Bean객체를 사용할 수 있도록 해준다. Bean은 보통 싱글턴으로 존재한다.
  • Beans는 우리가 컨테이너에 공급하는 설정 메타 데이터(XML파일)에 의해 생성된다.

Bean 생성 방법

  1. @ComponentScan 방식
    @ComponentScan은 @Component 어노테이션이 부여된 class를 찾아 자동으로 Bean에 등록해주는 역할을 한다.(@Repository, @Service, @Repository 어노테이션 안에 @Component 어노테이션이 부여되어있어서 위의 어노테이션이 있는 class도 Bean으로 등록된다.)

    스프링부트로 어플리케이션을 만들게되면 가장 상위 클래스에 @SpringBootApplication이 있는데, @SpringBootApplication를 구현한 코드에 보면 @ComponentScan 어노테이션이 붙어있다.

  2. @Configuration에서 @Bean으로 등록

    @Configuration
    public class HttpConfig {
    
        @Bean
        public RestTemplate createRestTemplate(){
            return new RestTemplate();
        }
    }
profile
DB를 사랑하는 백엔드 개발자입니다. 열심히 공부하고 열심히 기록합니다.
post-custom-banner

0개의 댓글