[Spring] 06. Spring Container와 ApplicationContext
이전 글에서는 Bean에 대해 살펴봤습니다. Bean은 Spring Container가 생성하고 관리하는 객체입니다. Controller, Service, Repository처럼 Spring이 관리해야 하는 객체는 Bean으로 등록해서 사용할 수 있습니다.
이번 글에서는 그 Bean을 실제로 만들고 보관하고 연결하는 Spring Container에 대해 정리하겠습니다. 또한 Spring에서 자주 등장하는 ApplicationContext가 무엇인지도 함께 살펴보겠습니다.
Spring Container는 Bean을 생성하고, 보관하고, 필요한 곳에 주입해주는 공간입니다.
1. Spring Container란?
Spring Container는 Spring이 객체를 관리하는 공간입니다. 여기서 관리되는 객체를 Bean이라고 부릅니다.
Spring Container
├─ BoardController Bean
├─ BoardService Bean
├─ BoardRepository Bean
└─ MemberService Bean
일반 Java 코드에서는 개발자가 필요한 객체를 직접 생성합니다.
BoardService boardService = new BoardService();
하지만 Spring에서는 필요한 객체를 Spring Container가 생성하고 관리할 수 있습니다. 그리고 어떤 클래스가 어떤 객체를 필요로 하는지 확인해서 연결해줍니다.
객체 생성
→ Bean 등록
→ Bean 보관
→ 필요한 곳에 주입
→ 사용
이 흐름이 Spring의 핵심입니다. 개발자는 객체를 직접 만들고 연결하는 일보다, 각 클래스가 어떤 역할을 해야 하는지에 집중할 수 있습니다.
2. Spring Container가 하는 일
Spring Container는 단순히 객체를 담아두는 상자만은 아닙니다. 애플리케이션이 실행될 때 필요한 객체를 만들고, 관계를 연결하고, 관리하는 역할을 합니다.
| Bean 생성 | Spring이 관리할 객체를 생성합니다. |
| Bean 등록 | 생성한 객체를 Container에 등록합니다. |
| Bean 보관 | 등록된 Bean을 Container 안에서 관리합니다. |
| 의존성 주입 | 필요한 Bean을 필요한 클래스에 연결합니다. |
| 생명주기 관리 | Bean의 생성부터 종료까지의 흐름을 관리합니다. |
예를 들어 BoardController가 BoardService를 필요로 한다면, Spring Container는 BoardService Bean을 찾아 BoardController에 넣어줍니다.
@Controller
public class BoardController {
private final BoardService boardService;
public BoardController(BoardService boardService) {
this.boardService = boardService;
}
}
이 코드에서 BoardController는 BoardService를 직접 생성하지 않습니다. Spring Container가 BoardService Bean을 찾아 생성자에 주입합니다.
3. ApplicationContext란?
ApplicationContext는 Spring Container의 대표적인 형태입니다. Spring을 사용할 때 Bean을 생성하고 관리하는 중심 역할을 합니다.
정확히 말하면 Spring Container라는 개념을 실제로 사용할 수 있게 만든 대표적인 인터페이스가 ApplicationContext입니다. 실무나 학습에서는 ApplicationContext를 Spring Container라고 부르는 경우도 많습니다.
| Spring Container | Bean을 생성하고 관리하는 공간이라는 개념 |
| ApplicationContext | Spring Container 역할을 수행하는 대표적인 인터페이스 |
ApplicationContext는 Bean 관리뿐만 아니라 메시지 처리, 환경 설정, 이벤트 처리, 리소스 로딩 같은 기능도 제공합니다. 처음 공부할 때는 너무 깊게 들어가기보다, Bean을 관리하는 중심 객체라고 이해하면 됩니다.
4. ApplicationContext가 만들어지는 시점
Spring 애플리케이션이 실행되면 ApplicationContext가 생성됩니다. 그리고 설정 정보를 읽고, Bean으로 등록할 대상을 찾고, 필요한 객체를 생성합니다.
애플리케이션 실행
→ ApplicationContext 생성
→ 설정 정보 확인
→ Component Scan 실행
→ Bean 생성 및 등록
→ 의존성 주입
→ 애플리케이션 동작
Spring Boot에서는 애플리케이션을 실행할 때 이 과정이 자동으로 진행됩니다.
@SpringBootApplication
public class BoardApplication {
public static void main(String[] args) {
SpringApplication.run(BoardApplication.class, args);
}
}
위 코드에서 SpringApplication.run이 실행되면 Spring Boot가 ApplicationContext를 만들고, Bean 등록과 의존성 주입 과정을 진행합니다.
5. Component Scan과 Container
Spring Container가 Bean을 관리하려면 먼저 어떤 클래스를 Bean으로 등록할지 알아야 합니다. 이때 사용되는 과정이 Component Scan입니다.
Component Scan은 특정 패키지 아래에서 @Controller, @Service, @Repository, @Component 같은 어노테이션이 붙은 클래스를 찾습니다. 그리고 찾은 클래스를 Bean으로 등록합니다.
Component Scan
→ @Controller 찾기
→ @Service 찾기
→ @Repository 찾기
→ @Component 찾기
→ Spring Container에 Bean 등록
예를 들어 다음과 같은 클래스들이 있다고 해보겠습니다.
@Controller
public class BoardController {
}
@Service
public class BoardService {
}
@Repository
public class BoardRepository {
}
Spring은 이 클래스들을 찾아 Bean으로 등록할 수 있습니다. 그리고 Container 안에서 관리합니다.
Spring Container
├─ boardController
├─ boardService
└─ boardRepository
Bean 이름은 보통 클래스 이름의 첫 글자를 소문자로 바꾼 형태로 등록됩니다. BoardService 클래스라면 boardService라는 이름으로 등록될 수 있습니다.
6. Container가 DI를 처리하는 흐름
Spring Container는 Bean을 등록한 뒤, 각 Bean이 어떤 의존성을 필요로 하는지 확인합니다. 그리고 필요한 Bean을 찾아 연결합니다.
아래 예시는 BoardController가 BoardService를 필요로 하는 코드입니다.
@Controller
public class BoardController {
private final BoardService boardService;
public BoardController(BoardService boardService) {
this.boardService = boardService;
}
}
@Service
public class BoardService {
}
Spring Container는 BoardController를 만들 때 생성자에 BoardService가 필요하다는 것을 확인합니다. 그리고 Container 안에 등록된 BoardService Bean을 찾아 넣어줍니다.
1. BoardService Bean 생성
2. BoardController Bean 생성 준비
3. BoardController 생성자에 BoardService 필요 확인
4. BoardService Bean 주입
5. BoardController Bean 등록 완료
이 흐름 덕분에 개발자는 직접 new BoardService()를 작성하지 않아도 됩니다. Spring Container가 Bean 사이의 관계를 연결해줍니다.
7. getBean으로 Bean 꺼내보기
ApplicationContext에서는 등록된 Bean을 직접 꺼내볼 수도 있습니다. 학습용으로는 getBean을 사용해 Container 안에 Bean이 들어있다는 것을 확인할 수 있습니다.
ApplicationContext context =
new AnnotationConfigApplicationContext(AppConfig.class);
BoardService boardService = context.getBean(BoardService.class);
위 코드는 ApplicationContext에서 BoardService Bean을 꺼내는 예시입니다.
다만 실제 웹 프로젝트에서는 getBean을 자주 직접 사용하지 않습니다. 보통은 생성자 주입을 통해 필요한 Bean을 전달받습니다.
@Controller
public class BoardController {
private final BoardService boardService;
public BoardController(BoardService boardService) {
this.boardService = boardService;
}
}
즉, getBean은 Container를 이해하기 위한 학습용으로 보면 좋습니다. 실제 개발에서는 DI를 통해 Bean을 사용하는 방식이 더 일반적입니다.
8. BeanFactory와 ApplicationContext
Spring Container를 공부하다 보면 BeanFactory라는 단어도 볼 수 있습니다. BeanFactory는 Bean을 관리하는 가장 기본적인 Container입니다.
ApplicationContext는 BeanFactory 기능을 포함하면서 더 많은 기능을 제공합니다. 그래서 일반적인 Spring 애플리케이션에서는 ApplicationContext를 주로 사용합니다.
| BeanFactory | Bean 생성과 관리에 집중한 기본 Container |
| ApplicationContext | Bean 관리 기능에 메시지, 이벤트, 환경 설정 등의 기능을 더한 Container |
처음 공부할 때는 BeanFactory보다 ApplicationContext를 중심으로 이해하면 충분합니다. Spring Boot 프로젝트에서도 ApplicationContext가 애플리케이션의 중심 Container 역할을 합니다.
9. 자주 하는 실수
Spring Container를 공부할 때 자주 하는 실수는 어노테이션을 붙였는데도 Bean이 등록되지 않았다고 착각하는 것입니다.
어노테이션을 붙였더라도 Component Scan 범위 밖에 있으면 Spring이 해당 클래스를 찾지 못할 수 있습니다.
Spring이 스캔하는 패키지 안에 있음
→ Bean 등록 가능
Spring이 스캔하지 않는 패키지에 있음
→ Bean 등록되지 않을 수 있음
또 다른 실수는 DTO나 VO 같은 단순 데이터 객체까지 무조건 Container에 등록하려고 하는 것입니다. DTO와 VO는 보통 요청 데이터나 조회 결과를 담는 객체입니다. 대부분의 경우 Spring Container가 계속 관리해야 하는 Bean이 아닙니다.
Bean으로 자주 등록하는 대상
→ Controller
→ Service
→ Repository
→ Mapper
→ 설정 객체
Bean으로 보통 등록하지 않는 대상
→ DTO
→ VO
→ 단순 요청 객체
→ 단순 응답 객체
Spring Container는 모든 객체를 다 관리하는 곳이 아닙니다. 애플리케이션 전반에서 역할을 가지고 재사용되거나 연결되어야 하는 객체를 관리하는 곳이라고 이해하면 좋습니다.
10. IoC, DI, Bean, Container 흐름 정리
지금까지 배운 IoC, DI, Bean, Container는 따로 떨어진 개념이 아닙니다. 하나의 흐름으로 연결됩니다.
| IoC | 객체 관리의 주도권을 Spring이 가져가는 개념 |
| DI | 필요한 객체를 외부에서 넣어주는 방식 |
| Bean | Spring Container가 관리하는 객체 |
| Spring Container | Bean을 생성하고 관리하고 주입하는 공간 |
| ApplicationContext | Spring Container 역할을 하는 대표적인 인터페이스 |
이 흐름을 한 줄로 정리하면 다음과 같습니다.
Spring Container가 Bean을 만들고,
DI를 통해 필요한 곳에 Bean을 넣어주며,
이 전체 흐름을 IoC라고 볼 수 있습니다.
이 문장을 이해하면 Spring의 핵심 객체 관리 구조를 어느 정도 잡은 것입니다.
정리
Spring Container는 Bean을 생성하고 관리하는 공간입니다. ApplicationContext는 Spring Container 역할을 수행하는 대표적인 인터페이스입니다.
Spring 애플리케이션이 실행되면 ApplicationContext가 생성되고, 설정 정보를 읽고, Component Scan을 통해 Bean을 찾고, 필요한 의존성을 주입합니다. 이 과정을 통해 개발자는 객체를 직접 생성하고 연결하는 부담을 줄일 수 있습니다.
Spring Container를 이해하면 IoC, DI, Bean이 하나의 흐름으로 연결됩니다. 다음 글에서는 @Component와 Component Scan에 대해 더 자세히 정리하겠습니다.
연습해보기
아래 클래스들이 있다고 생각해보세요.
MemberController
MemberService
MemberRepository
MemberDto
이 중에서 Spring Container가 Bean으로 관리해야 할 가능성이 높은 것은 MemberController, MemberService, MemberRepository입니다. MemberDto는 데이터를 담는 객체이므로 보통 Bean으로 등록하지 않습니다.
이 구분을 할 수 있으면 Bean과 Container의 역할을 더 정확히 이해할 수 있습니다.

'Tech Stack > Spring Boot' 카테고리의 다른 글
| [Spring] 08. @Controller, @Service, @Repository (0) | 2026.07.02 |
|---|---|
| [Spring] 07. @Component와 Component Scan (0) | 2026.07.01 |
| [Spring] 05. Bean이란? (0) | 2026.06.29 |
| [Spring] 04. DI란? (0) | 2026.06.28 |
| [Spring] 03. IoC란? (0) | 2026.06.27 |