본문 바로가기
BE/Spring

[Spring] 빈, 컨테이너 그게 뭔데?

by gamxong 2023. 7. 18.

1. 컨테이너 & 빈

일반적인 자바의 경우에는 필요한 객체를 필요할 때마다 직접 생성하고, 필요한 메서드를 호출한다.

자바의 경우 new 키워드를 통해 인스턴스를 생성할 것이다.

 

하지만 스프링에서는 클래스들의 인스턴스(객체)를 일일이 프로그래머가 다루는 것이 아닌, 스프링에게 관리를 맡긴다.

이것이 스프링의 가장 큰 특징 인 IoC(Inversion of Control)이다.

 

loC는 '제어의 역전'이라는 의미이며, 쉽게 '제어의 흐름을 바꾸는 것'이다. 따라서 필요한 객체는 스프링이 생성해 놓은 객체를 가져와서 쓰게 된다는 것이다. 

 

이때 스프링이 객체들을 미리 생성해 관리하는 공간을 스프링 컨테이너,

이렇게 스프링에 의해 생성되고 관리되는 자바 객체를 빈(Bean)이라고 한다.

 

스프링 컨테이너 : 스프링에서 자바 객체(빈)들을 관리하는 공간
스프링 빈 : 스프링에 의하여 생성되고 관리되는 자바 객체

 

스프링 컨테이너에서는 빈의 생성부터 소멸까지를 프로그래머 대신 관리해주는 곳이다.

또한, 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다.

따라서 같은 스프링 빈이면 모두 같은 인스턴스이다.

 

간단한 이유로는 여러 번 빈을 요청하더라도 매번 동일한 객체를 돌려줌으로써, 대규모 트래픽을 처리할 수 있도록 한다.

 

 

2. 의존 관계와 DI(Dependancy Injection)

위와 같이 외부에서 객체를 생성하고 관리함으로써 얻을 수 있는 장점을 이해하려면 의존 관계에 대해 알아야 한다.

 

의존 관계는 의존 대상 B가 변하면, 그것이 A에 영향을 미칠 때 A는 B와 의존 관계라고 한다. 쉽게 말해 B가 변경되었을 때 그 영향이 A에 미치는 관계를 말하며, 보통 한 클래스 내에 다른 클래스의 인스턴스를 생성할 때 의존 관계가 만들어 진다.

 

두 클래스 간의 의존성이 높아지면 서로의 변화가 서로에게 큰 영향을 미치는 문제가 발생한다.

 

이러한 문제를 해결하는 방법 중 하나가 클래스 내부에 객체를 생성하는 것이 아니라, 외부에서 미리 생성된 객체를 활용하는 것이다. 마치 자동차를 만들 때, 자동차 엔진을 만드는 공정과 타이어를 만드는 공정을 분리시켜 나중에 완성된 부품을 조립하는 것처럼 말이다. 이것이

 

위에서 얘기했던, 컨테이너가 미리 생성해 놓은 객체(빈)를 개발자가 가져다가 사용한다는 말을 바꿔 말하면, 

스프링 컨테이너가 외부에서 미리 생성해 놓은 객체를 주입시킨다고 할 수 있으며, 이것을 DI(Dependancy Injection)이라고 한다.

 

DI : 의존 관계를 외부에서 결정(주입)해주는 것

 

댓글