Server/Spring (Boot & Framework)

[Spring] DI? IoC Container? Bean? 숲을 보는 게시물

ooeunz 2020. 1. 29. 19:30
반응형

스프링은 꽤나 진입장벽이 높은 프레임워크이다. 그 자체의 개념은 그리 어렵지 않으나 엔터프라이즈용으로 흔히 사용되는 프레임워크이다 모니, 굉장히 다양한 용어들이 있고, 숲이 아닌 나무를 보는 공부 방식은 자칫 모두를 이해하지 못하는 오류를 범할 수 있다. DI와 IoC Container도 그러하다. DI를 알기 위해선 Design Pattern이 무엇인지 알아야 하고, 왜 spring은 Singleton Pattern을 채택하고 있는지에 관한 연결된 부분들을 이해해야 한다. 이 포스티에서는 이러한 개념들을 자세히 다루지는 않을 것이다.

 

다만 숲을 보는 느낌으로 가볍게 읽어봐주었으면 한다.

 


 

DI(Dependency Injection)와 IoC(Inversion of Control)는 스프링 공부를 하게 되면 가장 처음 만나게 되는 핵심 개념 중 하나이다. 이 둘은 하나의 개념을 설명하는 용어들인데, 먼저 이 둘에 대해 이해하기 위해서는 Design Pattern 중 하나인 singleton에 대해서 알 필요가 있다.

 

Singleton

싱글톤이란 애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하여 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴이다. 이로 인해 얻을 수 있는 장점은, 고정된 하나의 메모리를

사용하기 때문에 쓸데없이 같은 일을 하는 여러개의 객체가 메모리를 사용하여 낭비가 일어나는 것을 방지할 수 있다.

 

Bean

spring은 이러한 싱글톤 개념이 적극적으로 투영된 프레임워크인데, 흔히 말하는 Bean이라고 불리는 객체가 이와같이 애플리케이션 안에 하나만 존재하는 객체를 이야기한다. 예전 Spring Framework를 사용할 때는 xml파일에 빈을 하나씩 등록시켜주어야 했지만, 현재 버전에서는 애노테이션을 사용해서 간단하게 Bean을 등록할 수 있다.

 

흔히 빈을 생성하기 위해 사용하는 애노테이션에는 아래와 같다.

@Controller

@Service

@Repository

@Component

@Bean

 

그럼 이제 Spring Boot에서는 Singleton 디자인 패턴을 사용하고 있고, 인스턴스를 Bean으로 등록하여 사용한다는 것을 알았다. 그렇다면 이러한 Bean은 어디에서 개발자의 명령을 기다리는 것일까?

 

 

IoC

그때 나오는 개념이 바로 IoC Container이다. 한국말로 제어의 역전이라는 의미인데, 말 그대로 개발자가 작성한 프로그램이 재사용 라이브러리의 흐름 제어를 받게 된다는 디자인 패턴이다. 뒤에 붙은 contariner의 의미는 말 그대로 Spring 애플리케이션이 실행됨과 동시에 생성된 Bean들을 담고 있기 때문에 Container라는 이름이 붙은 것이다.

 

DI

사실 위에서도 언급했듯이 IoC와 DI는 같은 개념이다. IoC는 매우 포괄적인 의미를 담고 있기 때문에, 용어에서 혼동을 줄 수 있다고 생각한 Martin Fowler는 2004년 Dependency Injection이라는 용어를 만들어낸다. 그래서 현재는 상위 모듈에 의존하는 하위 모듈의 생성자, 프로퍼티, 메서드를 통해 주입하는 것을 DI라고 부르고 있다.

 

※ 해당 게시물

 

Inversion of Control Containers and the Dependency Injection pattern

Explaining the Dependency Injection pattern, by contrasting it with Service Locator. The choice between them is less important than the principle of separating configuration from use.

martinfowler.com

 

 

반응형