Spring Framework 핵심 기술 - DI, IoC

h.Im·2024년 8월 27일

Springboot 기초

목록 보기
2/17
post-thumbnail

IoC

Inversion of Control

한글로 번역하면 '제어의 역전'으로 변역이 가능한데, 정확히 어떤 제어의 역전을 의미하는 것일까요? 제어의 역전을 설명할 때 "Don't call us. We'll call you." - Hollywood Principle 라는 비유 표현을 자주 볼 수 있습니다. 필요하면 연락할테니 먼저 연락하지 말라는 뜻입니다.
일반적인 프로그램에서 객체의 생명주기는 개발자가 직접 관리합니다. 하지만, 스프링 프레임워크에서는 @Controller, @Service 같은 어노테이션을 붙여 객체를 선언하고, 이 객체가 언제 생성되고 소멸하는지는 신경쓰지 않습니다.
이것을 두고 제어권이 역전되었다고 표현합니다.

DI

Dependency Injection

IoC가 프로그램 제어권의 역전이라면, DI는 무엇일까요? 이 둘은 절대 동일한 개념이 아닙니다. DI는 IoC를 구현하기 위해 사용하는 디자인 패턴으로, 객체의 의존관계가 외부에서 주입되는 것입니다.

public class A {
	@Autowired
    B b;
}

위에서 사용한 Autowired라는 어노테이션은 빈을 주입하는 역할을 합니다. 개발자는 B b;라는 선언문만 작성했을 뿐 객체를 생성하지는 않았습니다. 하지만, b를 이용한 동작을 작성해도 코드는 잘 동작하는데, 이는 스프링 컨테이너라는 곳에서 b에 객체를 주입했기 때문입니다.

Spring에서의 DI, IoC

Bean이란?

위에서 "빈을 주입하는 역할" 이라는 표현을 했는데 Bean은 무엇일까요?

자바에서의 Bean

  • 데이터를 저장하기 위한 구조체로 자바 빈 규약이라는 것을 따르는 구조체
  • private 프로퍼티와 getter/setter로만 데이터를 접근

스프링에서의 Bean

  • 스프링 IoC 컨테이너에 의해 생성되고 관리되는 객체
  • 자바에서처럼 new Object();로 생성하지 않는다
  • 각각의 Bean들 끼리는 서로를 편리하게 의존(사용)할 수 있음

우리가 빈을 등록하면 Spring Application Context 안에 Bean이 싱글톤으로 등록되고, Spring Application Context의 여러 설정값이 클래스에 들어갑니다. 어떤 클래스는 Bean으로 등록해야하고/아니고 등록하는 것이 편하고/아니고에 대한 구분이 생겨나게 됩니다.

Spring Application Context 인터페이스를 통해 제공되는 스프링 컨테이너는 Bean 객체의 생성 및 Bean 들의 상호 의존성 관리를 담당합니다.

0개의 댓글