1. 빈(Bean)이라는 이름의 유래
- 자바의 유래가 커피의 공급원인 자바 섬에서 나온 것과 같이 재사용이 가능한 자바 객체를 커피콩에 비유해서 자바빈이라고 지었는데, “Bean”은 원래 자바빈(JavaBean) 개념에서 차용된 이름입니다.
- 스프링이 등장하면서 이 개념을 확장하여, “스프링 컨테이너가 관리하는 재사용 가능한 객체”를 스프링 빈(Spring Bean) 이라고 부르게 되었습니다.
2. 스프링 빈이란?
스프링 빈이란 스프링 컨테이너(IoC 컨테이너)가 생성하고 관리하는 객체를 말합니다.
- 일반 자바 객체는 개발자가 직접 new로 생성하고 관리합니다.
- 반면 스프링 빈은 스프링 컨테이너가 객체의 생성, 의존성 주입, 소멸 등 전체 생명주기를 관리해 줍니다.
- 객체 간의 의존도와 결합도를 낮추고 높은 캡슐화를 제공합니다.
- 즉, 개발자는 빈이 어떤 역할을 할지만 정의하면, 스프링이 나머지를 책임지는 구조입니다.
3. 스프링 빈의 역할
| 역할 | 설명 |
| 객체 생성 및 관리 | 사용자가 빈을 등록해 놓으면 스프링이 객체를 만들고 보관해 두었다가 필요할 때 꺼내 사용할 수 있게 함 |
| 의존성 관리 (DI) | 빈 간의 의존 관계를 자동으로 연결해 줌 |
| 생명주기 제어 | 빈이 생성될 때, 소멸될 때 실행할 로직을 제어할 수 있음 |
예를 들어, UserService 클래스가 있고, UserRepository가 필요하다면, 스프링은 두 객체를 자동으로 연결해 줍니다.
즉 UserService가 UserRepository에 의존하는 경우 스프링이 알아서 그 의존성을 해결해 줍니다.
4. 스프링 빈 등록 방법
① 어노테이션 기반 등록
클래스 위에 어노테이션을 붙여 빈으로 등록하는 방식입니다.
- @Component — 일반적인 빈 등록
- @Service, @Repository, @Controller — 역할이 분명한 빈을 위한 어노테이션 (내부적으로 @Component 포함)
@Service
public class UserService {
// ...
}
② 자바 설정 클래스 (Java Config)
@Configuration과 @Bean 어노테이션으로 빈을 등록합니다.
이는 명시적으로 빈을 설정하고 싶을 때 사용됩니다.
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService();
}
}
5. 스프링 빈의 LifeCycle
스프링 빈은 간단하게 다음과 같은 라이프사이클을 가진다.
객체 생성 -> 의존관계 주입
스프링 빈의 이벤트 라이프사이클은 다음과 같다.
스프링 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 사용 → 소멸 전 콜백 → 스프링 종료
- 초기화 콜백: 빈이 생성되고, 빈의 의존관계 주입이 완료된 후 호출
- 소멸전 콜백: 빈이 소멸되기 직전에 호출
6. 빈의 스코프(scope) 종류
빈은 생성 방식이 고정된 것이 아니라, 스코프(scope) 에 따라 여러 전략으로 관리될 수 있습니다.
- Singleton (기본값)
애플리케이션 컨텍스 내에서 한 인스턴스만 생성되어 재사용 - Prototype
빈이 요청될 때마다 새로운 객체를 생성 - Request
HTTP 요청 하나당 하나의 빈 생성 (웹 애플리케이션에서 사용) - Session
HTTP 세션 단위로 빈 생성 - Application, WebSocket 등도 존재
예를 들어, 상태를 유지하는 객체나 사용자별 객체가 필요할 경우 Prototype이나 Request 스코프를 사용할 수 있습니다.
7. 스프링 빈의 장점 & 활용 이유
- 결합도 낮춤
객체 간 직접 new 결합을 줄이고, 인터페이스 중심 설계가 쉬워집니다. - 유지보수성 향상
변경이 생겨도 영향 범위가 작아지고, 관리가 쉬워집니다. - 테스트 용이
스프링 컨테이너를 이용해 테스트 환경에서도 빈을 주입받아 사용할 수 있어 단위 테스트가 쉬워집니다. - 비즈니스 로직에 집중
객체 생성, 의존성 연결, 생명주기 관리 등 잡무로부터 해방되어 핵심 로직에 집중 가능
'Development & Projects > Java' 카테고리의 다른 글
| [Java] 비동기 처리와 스레드 관리 (0) | 2025.09.27 |
|---|---|
| [Java] JVM(Java Virtual Machine) (0) | 2025.09.24 |
| [Java] 상속 정리 / 다중 상속 / 다이아몬드 문제 (0) | 2025.09.21 |
| [Java] 추상 클래스와 인터페이스 정리 (0) | 2025.09.20 |
| [Java] 자바 컴파일 과정 (0) | 2025.06.28 |