본문 바로가기
Web/spring study

[Spring] 스프링 빈과 스프링 컨테이너

by 장인이 2023. 1. 9.

0. 스프링 부트로 처음 접하면..

 스프링 부트로 스프링 개발을 처음 접하게 되면, 스프링 빈이라는 개념을 인지하지 못한체 개발을 시작하게 될 것이다. 책, 혹은 구글링한 코드를 보며 @SpringBootApplication, @RequiredArgsConstructor, @Controller, @Service와 같은 어노테이션을 쓰기만 해도 프로젝트가 정상적으로 작동하기 때문이다!

 

 하지만 개발을 해보다 보면 "그래서 이게 어떤 원리로 작동하는 거지?", "이 어노테이션은 왜 붙이는거지?" 와 같은 궁금증이 생기게 된다. "@RequiredArgsConstructor가 final 혹은 @NotNull이 붙은 생성자를 생성해주는 건 알겠는데, 생성자가 왜 필요하지?" 같은 고민들을 해결하기 위해서는 우선 스프링 빈, 그리고 스프링 컨테이너가 무엇인지를 파악해야 한다.

 

모든 설명에 나오는 예시 프로젝트의 설계 방식은 아래 링크를 참고
https://imgzon.tistory.com/114

1. 스프링 빈

 스프링 빈이란, 스프링 컨테이너에 의해 관리되는 자바 객체를 뜻한다.

 

 따라서, 스프링 빈에 대해서 알기 위해서는 우선 스프링 컨테이너의 개념을 파악해야 한다.

 

2. 스프링 컨테이너

 스프링 컨테이너스프링 빈을 생성하고 생명주기를 관리하며, 생성된 스프링 빈들에게 추가적인 기능을 제공하는 역할을 한다. IOC과 DI의 원리가 스프링 컨테이너에 적용된다.

(IOC, DI 관련 게시글)

 

 스프링 컨테이너를 사용하면 객체 생성, 인터페이스 호출 등의 역할을 대신해준다. 즉, 제어의 흐름을 외부에서 관리하게 된다(IOC). 또한, 객체 간의 의존관계 또한 스프링 컨테이너가 알아서 주입해 준다(DI).

 

3. 스프링 컨테이너 생성 과정

1) 스프링 컨테이너 생성

 추후에 설명하겠지만, 스프링 컨테이너는 자동, 혹은 수동으로 등록할 수 있다. 어떤 방식이든 스프링 컨테이너가 생성되면 다음과 같이 스프링 빈을 저장할 수 있는 공간을 만든다.

<스프링 컨테이너>

2) 스프링 빈 등록

그 후, 넘겨받은 설정 정보를 사용해 스프링 빈을 등록한다.

<스프링 빈 등록>

  참고로 AnnotationConfigApplicationContext를 통한 수동 빈 등록시, 메서드 이름이 빈 이름이 된다. 컴포넌트 스캔을 통한 빈 등록 시, @Component 어노테이션이 달린 클래스의 이름이 빈 이름이 된다.

 

 주의: 빈 이름은 항상 다른 이름을 부여해야 한다. 같은 이름을 부여하면 다른 빈이 무시되거나, 기존 빈을 덮어버리거나 혹은 설정에 따라 오류가 발생할 수 있다.

 

3) 스프링 빈 의존관계 설정

 주어진 설정 정보를 참고하여 의존관계를 주입(DI)한다.

<스프링 빈 의존관계 설정>

 스프링 컨테이너는 빈을 생성하고, 의존관계를 주입하는 단계가 나뉘어 있다. 하지만, 스프링도 결국 자바 기반 프레임워크이다. 따라서 빈을 등록하며 생성자를 호출하면서 몇몇 의존관계 주입도 한번에 처리된다.

 

4. 어떻게? 그리고 왜?

위의 내용들을 읽어보면 몇가지 의문점이 들것이다.

 

Q. 그래서 스프링 컨테이너에 빈을 어떻게 저장하지?

Q. 결국 스프링 컨테이너도 우리가 직접 만든 DI 컨테이너의 역할을 하는건데, 이 복잡한 개념을 도입할 필요가 있을까?

Q. 스프링 빈이 잘 등록된건지 어떻게 확인할 수 있지?

Q. 스프링 컨테이너가 스프링 빈의 생명주기를 어떻게 관리하지?

 

이런 의문들을 다음 게시물들을 통해 해결해보자.

 

1) 자바 코드로 스프링 빈을 수동 등록

 

2) 컴포넌트 스캔, 의존관계 자동 주입을 통한 빈 등록

 

3) 스프링 컨테이너를 도입하는 이유, 싱글톤

 

4) 등록된 스프링 빈을 조회하는 법

 

5) 스프링 빈의 생명주기

 


참고한 게시글

https://steady-coding.tistory.com/594


위 내용은 김영한 님의 인프런 강의 "스프링 핵심 원리 - 기본편"의 내용과 강의자료를 토대로 작성된 게시글입니다.

강의 링크:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

댓글