JH's Develog

[SpringCore] IoC와 DI 본문

Spring

[SpringCore] IoC와 DI

jhkimmm 2021. 12. 22. 23:26

Bean이란?

자바에서의 Bean은 데이터를 저장하기 위해 '자바 빈 규약'을 따르는 구조체입니다.

private 속성만 있으며 속성은 getter와 setter로만 접근가능하고 파라미터가 없는 기본 생성자가 있습니다.

스프링에서의 Bean과 IoC 컨테이너

IoC컨테이너란

SpringApplicationContext 인터페이스를 통해 제공되는 스프링 컨테이너이며 Bean 객체의 생성 및 Bean들의 조립/의존성 관리를 담당합니다.

 

일반적인 class를 Bean으로 등록하겠다는 설정을 추가해줌으로써 Spring의 IoC 컨테이너에 담기게 되면 Spring에서의 Bean이 됩니다. 각각의 Bean들 끼리는 서로를 편리하게 의존(사용)할 수 있습니다.

 

Bean의 등록은 @Bean, @Controller, @Service 등의 어노테이션을 주로 이용하며 어노테이션을 달아주면 Component Scan을 통해서 빈의 이름이나 경로 등을 자동으로 설정해서 빈을 등록해줍니다.

IoC

자바에서처럼 객체를 new Object();로 생성하여 개발자가 관리하는 것이 아니라 Spring Container에 모두 맡기기 때문에

개발자 -> 프레임워크로 객체관리의 권한이 넘어갔다고 볼 수 있습니다. 그래서 "제어의 역전(Inversion Of Control)"인 것 입니다.

DI

개발자가 IoC Container에 등록된 Bean을 사용하기 위해 객체간의 관계(의존성)을 맺어주는 것을 DI(의존성 주입)이라고 하는데 이를 통해 컴파일 타임이 아닌 런타임에 의존성을 동적으로 주입함으로써 유연성도 확보하고 결합도도 낮출 수 있습니다.

 

DI의 장점

 i) 의존성으로 부터 격리시켜 테스팅에 용이합니다.

  DI를 활용하여 Mock과 같은 기술을 통해서 불가능한 상황을 안정적으로 테스트 가능합니다.

  ex) REST client를 mocking해서 예상되는 응답을 Bean에 주입해서 서버의 작동이 정상적인지 확인합니다.

 ii) 코드를 확장하거나 변경할 때 영향을 최소화 합니다.(추상화)

 iii) 순환참조를 막을 수 있습니다.

context.getBean() 통해서 Bean객체를 가져온다 -> IoC

Encoder 생성자에 base64Encoder.class에 대한 의존성을 주입해준다 -> DI

 

Comments