본문 바로가기

스프링

스프링의 특징 1 [DI, IoC]

반응형

DI (Dependency Injection)

스프링이 다른 프레임워크와 차별화되어 제공하는 의존 관계 주입

객체를 직접 생성하는 것이 아닌 외부에서 생성한 후 주입시켜주는 방식

 

의존성 주입을 통해 모듈 간 결합도가 낮아지고 유연성이 높아짐

 

의존성 주입

클래스가 가지고 있는 연관관계를 주입해주는 것

 

표현방식은 다음과 같다

public class store{      
private Pencil pencil;
}
// store 객체가 Pencil 객체에 의존성이 있다 라고 표현

DI 장점

클래스 간의 의존 관계 최소화

프로젝트 유지보수 용이

기존에는 개발자가 직접 객체의 생성과 소멸을 제어하였지만,

DI로 인해 객체의 생성과 소멸 등 클래스 간의 의존관계를 스프링 컨테이너 (IoC 컨테이너)가 제어해줌

 

DI는 객체의 생성, 소멸, 의존 관계를 개발자가 직접 설정하는 것이 아니라

XML이나 어노테이션으로 통해 스프링 프레임워크가 제어

 

기존에는 개발자가 직접 객체를 생성해줬던 반면에 스프링 프레임워크에서는 객체의 제어를 스프링이 직접 담당해주는 IoC 특징을 가짐

 

                                                                     IoC 와 DI의 관계도를 설명하는 이미지                                                             

의존관계 검색(Dependency Lookup)은 의존관계가 있는 객체를 외부에서 주입받는 것이 아닌, 의존관계가 필요한 객체에서 직접 검색하는 방식


DI 유형

의존성 주입의 유형으로는 

 

1. 세터 주입 (Setter Injection)

객체의 set Method 호출되는 시점에 의존성이 주입되는 것

@Component
public class Example {

    private HelloService helloService;

    @Autowired
    public void setHelloService(HelloService helloService) {
        this.helloService = helloService;
    }
}

 

2. 생성자 주입 (Constructor Injection)

객체가 생성되는 시점에 의존성이 주입되는 것

@Component
public class Example {

    
    private final HelloService helloService;

    // 단일 생성자인 경우는 추가적인 어노테이션이 필요 없다.
    public Example(HelloService helloService) {
        this.helloService = helloService;
    }
}

 

3. 필드 주입 (Field Injection)

객체의 인스턴스 필드에 의존성이 주입되는 것

@Component
public class Example {

    @Autowired
    private HelloService helloService;
}

의존성을 주입 한 이후

 

Spring IoC Container

 

ApplicationContext는 Bean Factory를 의존하며 Bean Factory가 객체에 대한 생성을 담당

 

IoC Container가 객체(Bean)에 대한 설정 파일(XML or Configuration)들을 읽고

해당 객체의 의존성 주입이 이루어짐

 

결과적으로 Dependency Injection 은 IoC 개념이 적용된 결과물 중 하나이다.


IoC ( Inversion of Control)

의존성 역전, 제어의 역전 (제어권, 객체의 생성부터 생명주기의 관리까지 객체에 대한 제어권이 바뀐 것)

어떤 객체가 사용하는 의존 객체를 '직접' 만들어서 사용하는 것이 아닌 '주입받아' 사용하는 방법

 

IoC는 Inversion of Control의 줄임 말로, 제어의 역전이라는 뜻이다. 프로그램의 흐름을 개발자가 제어하지 않고, 프로그램이나 프레임워크가 직접 제어를 한다는 말이다. 컴포넌트의 의존 관계 결정(Component dependency resolution), 객체의 생명 주기(life cycle)와 같은 일을 대신 수행해준다.
흔히 스프링 프레임워크를 이용해서 개발할 때 여러 가지 Bean을 사용할 것이다. 사용자의 요청이 들어오면, 요청에 알맞은 Bean을 생성해서 필요한 일을 하도록 시킨다. 해당 Bean이 할 일을 마치면 Bean을 삭제해준다. 하지만 이런 객체의 생성과 소멸이 어떻게 이루어지는지 알 필요가 없다. 프로그래머가 직접 제어할 필요가 없이 프레임워크가 직접 제어해주기 때문이다. 이것이 IoC 제어의 역전이다.

 

IoC 컨테이너 (IoC Container)

 

애플리케이션 컴포넌트의 중앙 저장소

Bean 설정 소스로부터 빈 정의를 읽어 들이고, 빈을 구성하고 제공

 


요약

 

우선적으로 스프링 특징들 중에는 DI 와 IoC 가 있습니다.

의존성 주입(DI)을 통해 IoC 컨테이너가 객체(Bean)의 생성부터 생명주기 관리까지 제어를 하여

제어권이 역전되었음을 IoC 라고 합니다.

 

DI는 IoC 개념이 적용된 결과물 중 하나입니다.

 

Bean에 대한 내용은 다음 글에서 작성하겠습니다.

 

 

 

 

 

 

 

 

 

 

반응형

'스프링' 카테고리의 다른 글

스프링의 특징 5 [Annotation] Java Configuration  (0) 2021.09.09
스프링의 특징 4 [PSA]  (0) 2021.09.09
스프링의 특징 3 [AOP]  (0) 2021.09.08
스프링의 특징 2 [DI, IoC] Spring Bean  (0) 2021.09.08
Spring Framework [개념]  (0) 2021.09.08