목차
- Spring IoC컨테이너란?
- Bean이란?
- Bean 생성 방법
스프링 IoC 컨테이너란?

Spring IoC 컨테이너는 객체에 대한 생성 및 생명 주기를 관리해 주는 컨테이너를 말합니다.
IoC컨테이너는 객체들을 만들고 객체들 사이의 의존성을 엮어주고, 또 그렇게 가지고 있는 객체들을 제공해주는 것이 IoC컨테이너의 역할입니다.
이러한 IoC컨테이너에 의해 관리되는 객체들은 Bean이라고 불리며, Bean들을 저장한다고하여, BeanFactory라고도 불립니다.
+ 실제로 Spring IoC는 BeanFactory라는 인터페이스로 구성되어 있습니다.
직접 개발할 때에는 ApplicationContext or BeanFactory 둘 중 하나를 선택해서 사용하게 될 것 입니다.
IoC란?
IoC 란?
IoC란 객체가 내부적으로 조작할 객체를 직접 생성하지 않고 외부로부터 주입 받는 기법을 말합니다.
이때 객체를 외부로부터 주입해주는 작업을 DI(의존성 주입)이라고 합니다
Bean이란?
앞서 짧게 언급했듯이, Bean이란 스프링 IoC 컨테이너가 관리하는 객체입니다.
이것이 어떤 형태를 갖추고 있는지 간단한 예시를 통해 보겠습니다.
Q. 이것은 Bean인가요?
package com.example.springpractice.book;
public class Book {
private String name;
private String title;
private String content;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
위 코드와 같이 Book라는 클래스가 있다고 가정합시다.
그리고 Book book = new Book();으로 book 객체를 생성했다면, 이것은 Bean일까요?정답은 Bean이 아닙니다. Bean은 객체면서 스프링 IoC컨테이너가 관리하는 객체입니다.
하지만 book은 객체이지만 스프링 IoC컨테이너가 관리하는 객체가 아닙니다.
그렇다면 Bean은 무엇일까요?
package com.example.springpractice.book;
import org.springframework.stereotype.Repository;
@Repository
public class BookRepository {
public Book save(Book book){
return null;
}
}
위 코드의 BookRepository는 Bean이라고 할 수 있습니다.
정확히 말하면, @ComponentScan이 SpringApplication이 시작할 때
@Repository에 의해 Bean이 생성되는 것 입니다!
지금은 그냥 아 Bean이라는 것은 Spring IoC 컨테이너가 객체를 생성하고 관리해주는 것인데 저런 행태가 Bean으로 등록이 될 수 있구나 하고 넘기면 될 것 같습니다!
더 자세한 예시는 밑에서 더 설명하겠습니다.
Spring IoC 컨테이너, Bean의 장점.
Spring IoC 컨테이너, Bean의 장점.
앞서 Spring IoC 컨테이너와 Bean의 개념에 대해 살짝 보았습니다.
이러한 것들을 사용하는 이유는 장점이 있어서겠죠?
Spring IoC 컨테이너, Bean의 장점.
1. 의존성 주입 (모듈 간의 의존성이 낮아진다.)
2. 빈 스코프
- IoC 컨테이너는 Bean을 만들 때, 기본적(Default)으로 싱글톤으로 만들기 때문에 싱글톤이 가지는 장점이 있습니다.
3. 라이프 사이클 인터페이스 지원. ( keyword: @PostConstruct )
- Bean이 생성되었을 때 or 제거되었을 때 등 원하는 코드를 실행시킬 수 있습니다.
Bean의 생성 방법
1. ComponentScan @어노테이션을 사용한 방법
@ComponentScan은 해당 지점부터 그 아래 있는 모든 곳에서 Component를 찾아 Bean으로 등록하게 하는 것 입니다.
그럼 @ComponentScan은 언제, 어떻게 실행되나요?

위 그림과 같이 @SpringBootApplication는 @CompoentScan을 상속받고 있습니다.main 메소드를 실행하며 해당 프로젝트가 돌아가게 되는데, 이때 @ComponentScan으로 인해 @Component애노테이션이 붙어있는 모든 클래스들을 찾고 그 클래스를 인스턴스로 만들어서 Bean으로 등록하게 됩니다.
이렇게 @ComponentScan이 붙어있는 @SpringApplication의 위치에서부터 모든 하위 패키지에 있는 모든 클래스를 찾아보며 @Component를 사용하는 클래스들을 찾아서 Bean에 등록해 줍니다.

@Controller, @Service, @Repository 등등,, Spring boot를 사용해서 프로젝트를 해보신 분들은 보셨을 수도 있겠습니다.
스프링의 Bean은 @Controller, @Service, @Repository 등등을 사용해 Bean을 생성하고 등록한 다음,
@Autowired로 의존성 주입을 받을 수 있습니다.
간단한 예시부터 먼저 보아서 와닿지 않을 수도 있는데요. 조금 더 구체적으로 보겠습니다.

IoC 컨테이너는 프로그램이 시작될 때 @ComponecntScan에 의해 클래스를 찾아보며 @Component를 사용하는 클래스들을 찾아서 Bean에 등록해 줍니다.
위 사진의 @Repository인터페이스를 들어가서 보면, 아래 사진과 같이 @Component를 상속하고 있는 것을 볼 수 있습니다.
@Repository, @Controller, @Service 등등.. Bean에 등록하는 어노테이션들은 모두 @Component를 상속하고 있습니다.
2. 직접 자바로 Bean을 등록하는 방법
위에서 @Controller와 같은 어노테이션으로 Bean을 등록하는 것을 보았습니다.
이러한 방법 말고, 직접 설정 파일을 작성하여 Bean으로 직접 등록하는 방법이 2가지 정도가 있습니다.
1. xml 빈 설정 파일
2. java 빈 설정 파일
@Configuration이란?
@Configuration은 Spring IoC컨테이너가 해당 클래스를 Bean 설정 파일로 알게 해주는 것 입니다.

@Configuration을 통해 해당 클래스를 Bean 설정 파일로 지정한 후, Bean으로 생성하고 싶은 Contruct위에 @Bean을 붙여주면 Bean으로 정의하게 됩니다.
빈 설정 파일이 ComponentScan이 될 때, 해당 클래스에 정의된 Bean들이 IoC컨테이너에 생성되게 됩니다.

실제 Main메소드를 보면, run()메소드 첫 번째 인자로 config 클래스(빈 설정파일)를 넘겨줍니다.
만약 위 예시와 같이 Bean 설정 파일을 직접 작성하였다면, 첫 번째 인자로 해당 클래스를 넘겨주면 됩니다.
참고: www.inflearn.com/course/spring_revised_edition/dashboard, https://m.blog.naver.com/PostView.nhn?blogId=pjok1122&logNo=221744895053&proxyReferer=https:%2F%2Fwww.google.com%2F
'개발 > Spring' 카테고리의 다른 글
[Spring] IoC 컨테이너 Environment 프로파일, 프로퍼티 (0) | 2021.05.03 |
---|---|
[Spring] 빈의 스코프 (0) | 2021.05.03 |
의존성 + ( IoC / DI 란 ) (0) | 2021.04.28 |
[Spring] Spring 구조와 특징 (0) | 2021.04.28 |
Servlet이란 (0) | 2021.04.27 |