[Spring] 05. Bean이란?
이전 글에서는 DI에 대해 살펴봤습니다. DI는 필요한 객체를 클래스 내부에서 직접 생성하지 않고, 외부에서 전달받아 사용하는 방식입니다. Spring에서는 Spring Container가 필요한 객체를 만들고, 필요한 곳에 주입해줍니다.
이번 글에서는 Spring이 관리하는 객체인 Bean에 대해 정리하겠습니다. Spring을 공부하다 보면 Bean이라는 단어가 계속 등장합니다. 처음에는 낯설지만, 핵심은 어렵지 않습니다.
Bean은 Spring Container가 생성하고 관리하는 객체입니다.
1. Bean이란?
Bean은 Spring이 직접 생성하고 관리하는 객체를 말합니다. Java에서 객체는 new 키워드로 직접 만들 수 있습니다.
BoardService boardService = new BoardService();
위 코드는 개발자가 직접 BoardService 객체를 생성한 예시입니다. 이 객체는 Spring이 관리하는 객체가 아닙니다.
반면 Spring Container에 등록되어 Spring이 생성하고 관리하는 객체는 Bean이라고 부릅니다.
Spring Container
├─ BoardController Bean
├─ BoardService Bean
└─ BoardMapper Bean
즉, 모든 Java 객체가 Bean은 아닙니다. Spring Container 안에서 관리되는 객체만 Bean입니다.
2. 일반 객체와 Bean의 차이
일반 객체와 Bean의 가장 큰 차이는 누가 관리하느냐입니다.
| 일반 객체 | 개발자가 직접 생성하고 관리하는 객체 |
| Bean | Spring Container가 생성하고 관리하는 객체 |
일반 객체는 개발자가 직접 new로 만듭니다. 필요한 곳에서 직접 생성하고 직접 연결해야 합니다.
public class BoardController {
private BoardService boardService = new BoardService();
}
이 방식은 코드가 단순할 때는 문제가 없어 보입니다. 하지만 기능이 많아지면 객체 생성 코드가 여러 곳에 흩어질 수 있습니다.
Bean은 Spring Container가 관리합니다. 개발자는 필요한 객체를 직접 만들지 않고, Spring에게 맡길 수 있습니다.
@Controller
public class BoardController {
private final BoardService boardService;
public BoardController(BoardService boardService) {
this.boardService = boardService;
}
}
위 코드에서 BoardController는 BoardService를 직접 생성하지 않습니다. BoardService가 Bean으로 등록되어 있다면 Spring이 찾아서 생성자에 넣어줍니다.
3. Bean이 필요한 이유
Bean이 필요한 이유는 객체를 일정한 방식으로 관리하기 위해서입니다. 프로젝트가 커질수록 Controller, Service, Mapper 같은 객체가 많아집니다.
이 객체들을 개발자가 전부 직접 만들고 연결하면 코드가 복잡해집니다. 어떤 객체가 어디서 만들어졌는지 찾기 어려워지고, 같은 객체를 여러 번 생성하는 문제도 생길 수 있습니다.
Spring은 이런 객체들을 Container 안에서 관리합니다. 그리고 필요한 곳에 Bean을 연결해줍니다.
객체 생성
→ Spring Container에 등록
→ 필요한 곳에 주입
→ 사용
이렇게 하면 객체 생성과 연결 흐름이 정리됩니다. 각 클래스는 자기 역할에 집중할 수 있고, 필요한 객체는 Spring을 통해 전달받을 수 있습니다.
4. Bean을 등록하는 방법
Spring에서 Bean을 등록하는 대표적인 방법은 두 가지입니다.
| 어노테이션 사용 | @Controller, @Service, @Repository, @Component 등을 사용합니다. |
| @Bean 사용 | 설정 클래스에서 메서드로 객체를 직접 등록합니다. |
처음 Spring을 공부할 때는 어노테이션으로 Bean을 등록하는 방식을 먼저 이해하는 것이 좋습니다. Controller, Service, Repository 계층을 만들 때 자주 사용하기 때문입니다.
5. 어노테이션으로 Bean 등록하기
Spring에서는 클래스 위에 특정 어노테이션을 붙이면 Bean으로 등록할 수 있습니다.
@Controller
public class BoardController {
}
@Service
public class BoardService {
}
@Repository
public class BoardRepository {
}
위 클래스들은 Spring이 스캔해서 Bean으로 등록할 수 있습니다. 이때 Spring은 해당 객체를 만들고 Container 안에서 관리합니다.
각 어노테이션은 역할을 구분하기 위해 사용합니다.
| @Controller | 사용자의 요청을 처리하는 클래스에 사용합니다. |
| @Service | 기능의 흐름과 규칙을 처리하는 클래스에 사용합니다. |
| @Repository | DB 접근을 담당하는 클래스에 사용합니다. |
| @Component | 특정 계층에 속하지 않는 일반 컴포넌트 클래스에 사용합니다. |
이 어노테이션들은 단순히 이름만 다르게 붙이는 것이 아닙니다. 클래스의 역할을 코드에서 드러내기 위해 사용합니다.
6. Component Scan이란?
어노테이션을 붙였다고 해서 아무 클래스나 자동으로 Bean이 되는 것은 아닙니다. Spring이 해당 클래스를 찾아야 Bean으로 등록할 수 있습니다.
Spring이 특정 범위의 패키지를 살펴보면서 @Controller, @Service, @Repository, @Component가 붙은 클래스를 찾는 과정을 Component Scan이라고 합니다.
Component Scan
→ @Controller 찾기
→ @Service 찾기
→ @Repository 찾기
→ @Component 찾기
→ Bean으로 등록
즉, Component Scan은 Bean으로 등록할 대상을 찾는 과정입니다. Spring은 이 과정을 통해 필요한 객체들을 Container에 등록합니다.
7. @Bean으로 등록하기
Bean을 등록하는 또 다른 방법은 @Bean을 사용하는 것입니다. 이 방식은 설정 클래스에서 메서드를 통해 객체를 직접 만들어 등록합니다.
@Configuration
public class AppConfig {
@Bean
public BoardService boardService() {
return new BoardService();
}
}
위 코드에서 boardService 메서드가 반환하는 객체는 Spring Bean으로 등록됩니다.
@Component, @Service 같은 방식은 클래스에 어노테이션을 붙여 자동으로 등록하는 방식입니다. 반면 @Bean은 개발자가 설정 클래스 안에서 직접 객체 생성 방식을 작성하는 방식입니다.
| @Component 계열 | 클래스 위에 붙여서 자동으로 Bean 등록 |
| @Bean | 설정 클래스의 메서드에서 직접 객체를 반환해 Bean 등록 |
직접 만든 Controller나 Service는 보통 @Controller, @Service로 등록합니다. 외부 라이브러리 객체처럼 클래스에 직접 어노테이션을 붙이기 어려운 경우에는 @Bean 방식을 사용할 수 있습니다.
8. Bean 이름
Bean은 Container 안에서 이름을 가질 수 있습니다. 기본적으로 클래스 이름의 첫 글자를 소문자로 바꾼 이름이 Bean 이름으로 사용됩니다.
@Service
public class BoardService {
}
위 클래스는 보통 boardService라는 이름의 Bean으로 등록됩니다.
BoardService → boardService
@Bean을 사용할 때는 메서드 이름이 Bean 이름으로 사용됩니다.
@Bean
public BoardService boardService() {
return new BoardService();
}
이 경우에도 Bean 이름은 boardService가 됩니다.
9. Bean과 DI의 관계
DI는 필요한 객체를 외부에서 넣어주는 방식입니다. Spring에서 DI가 가능하려면 주입할 객체가 Spring Container 안에 Bean으로 등록되어 있어야 합니다.
예를 들어 BoardController가 BoardService를 주입받으려면 BoardService가 Bean으로 등록되어 있어야 합니다.
@Controller
public class BoardController {
private final BoardService boardService;
public BoardController(BoardService boardService) {
this.boardService = boardService;
}
}
@Service
public class BoardService {
}
BoardService에 @Service가 붙어 있으므로 Spring은 BoardService를 Bean으로 등록할 수 있습니다. 그리고 BoardController가 BoardService를 필요로 할 때, 해당 Bean을 찾아서 주입합니다.
BoardService Bean 등록
→ BoardController 생성
→ BoardService Bean 주입
→ BoardController에서 사용
따라서 Bean과 DI는 따로 떨어진 개념이 아닙니다. Spring은 Bean을 관리하고, DI를 통해 필요한 Bean을 연결합니다.
10. 자주 하는 실수
Bean을 공부할 때 자주 하는 실수는 어노테이션을 붙이지 않고 주입받으려고 하는 것입니다.
public class BoardService {
}
위 클래스는 단순한 Java 클래스입니다. Spring이 이 클래스를 Bean으로 등록할 수 있는 정보가 없습니다. 이 상태에서 다른 클래스에서 BoardService를 주입받으려고 하면 문제가 생길 수 있습니다.
Spring이 관리해야 하는 클래스라면 역할에 맞는 어노테이션을 붙여야 합니다.
@Service
public class BoardService {
}
또 다른 실수는 DTO나 VO까지 무조건 Bean으로 등록하려는 것입니다. DTO나 VO는 보통 요청 데이터나 조회 결과를 담는 객체로 사용합니다. 대부분의 경우 Controller, Service, Repository처럼 Spring이 계속 관리해야 하는 객체가 아닙니다.
Bean으로 자주 등록하는 대상
→ Controller
→ Service
→ Repository
→ Mapper
→ 설정 객체
Bean으로 보통 등록하지 않는 대상
→ DTO
→ VO
→ 단순 요청/응답 객체
모든 클래스를 Bean으로 만들 필요는 없습니다. Spring이 관리해야 하는 객체인지 먼저 생각하는 것이 중요합니다.
정리
Bean은 Spring Container가 생성하고 관리하는 객체입니다. 모든 Java 객체가 Bean은 아니며, Spring Container 안에서 관리되는 객체만 Bean이라고 부릅니다.
Bean은 @Controller, @Service, @Repository, @Component 같은 어노테이션을 사용해 등록할 수 있습니다. 또는 @Configuration 클래스 안에서 @Bean 메서드를 사용해 직접 등록할 수도 있습니다.
Spring은 등록된 Bean을 관리하고, 필요한 곳에 DI 방식으로 주입합니다. 그래서 Bean을 이해하면 IoC, DI, Spring Container의 흐름이 함께 정리됩니다.
연습해보기
아래 클래스들이 Spring Bean으로 등록되어야 하는지 생각해보세요.
| MemberController | 사용자 요청을 처리하므로 Bean으로 등록하는 것이 좋습니다. |
| MemberService | 회원 기능의 흐름을 처리하므로 Bean으로 등록하는 것이 좋습니다. |
| MemberMapper | DB 접근을 담당하므로 Bean으로 등록해 사용할 수 있습니다. |
| MemberDto | 데이터를 담는 객체이므로 보통 Bean으로 등록하지 않습니다. |
다음 글에서는 Spring Container와 ApplicationContext에 대해 정리하겠습니다. Bean을 누가 보관하고 관리하는지 살펴보면 Spring의 전체 구조가 더 분명해집니다.

'Tech Stack > Spring Boot' 카테고리의 다른 글
| [Spring] 07. @Component와 Component Scan (0) | 2026.07.01 |
|---|---|
| [Spring] 06. Spring Container와 ApplicationContext (0) | 2026.06.30 |
| [Spring] 04. DI란? (0) | 2026.06.28 |
| [Spring] 03. IoC란? (0) | 2026.06.27 |
| [Spring] 02. Spring Framework란? (0) | 2026.06.26 |