스프링 빈, 왜 이렇게 중요할까?
스프링 프레임워크에서 가장 핵심적인 개념 중 하나가 스프링 빈(Spring Bean)입니다.
하지만 단순한 Java 객체와는 달리, 스프링 IoC(Inversion of Control) 컨테이너에서 관리된다는 점에서 차이가 있습니다.
그렇다면, 스프링 빈이 정확히 무엇이며, 스프링 IoC와 어떤 관계가 있을까요?
이번 글에서는 스프링 컨테이너가 관리하는 스프링 빈의 역할, 등록 방법, 라이프사이클 및 스코프까지 깊이 있게 알아보겠습니다.
📌 스프링 빈이란? – 스프링 IoC 컨테이너의 핵심 객체
스프링 빈(Spring Bean)은 일반적인 Java 객체가 아니라,
스프링 IoC 컨테이너(Spring Container)에서 직접 관리하는 객체를 의미합니다.
일반적으로 Java 개발자는 new 키워드를 사용해 객체를 생성하고 관리해야 합니다.
하지만 스프링 IoC 컨테이너를 활용하면, 객체의 생성과 의존성 주입(Dependency Injection)까지 자동으로 처리할 수 있습니다.
✅ 핵심 요약
1️⃣ 스프링 빈 = 스프링 컨테이너가 관리하는 객체
2️⃣ IoC 컨테이너가 자동으로 빈을 생성하고 관리
3️⃣ 의존성 주입(DI)을 통해 빈 간의 연결을 자동으로 설정
📌 스프링 빈 등록 방법 – 자동과 수동 설정
스프링 프레임워크에서는 스프링 빈을 등록하는 방법이 두 가지가 있습니다.
🔷 자동 등록
@Component
, @Service
, @Repository
, @Controller
위 애노테이션을 사용하면, 스프링 컨테이너가 자동으로 빈을 등록합니다.
Spring Boot에서는 주로 이 방식을 활용합니다.
@Component
public class MyService {
// 비즈니스 로직
}
🔷 수동 등록
@Bean
을 활용하여@Configuration
클래스를 통해 명시적으로 빈을 등록할 수도 있습니다.
빈의 설정을 보다 세밀하게 관리하고 싶을 때 유용합니다.
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyService();
}
}
📌 스프링 빈의 라이프사이클 – 언제 생성되고 언제 소멸될까?
스프링 빈은 생성 → 초기화 → 사용 → 소멸이라는 생명 주기를 따릅니다.
이를 제어하기 위해 @PostConstruct
(초기화)와 @PreDestroy
(소멸 전 정리) 애노테이션을 사용할 수 있습니다.
@Component
public class MyBean {
@PostConstruct
public void init() {
System.out.println("빈 초기화 로직 실행");
}
@PreDestroy
public void destroy() {
System.out.println("빈 소멸 전 정리 작업 실행");
}
}
이 기능을 활용하면, 스프링 빈이 생성되거나 소멸될 때 특정 작업을 수행하도록 설정할 수 있습니다.
📌 스프링 빈의 스코프 – 싱글톤이 기본, 하지만 프로토타입도 있다
스프링 빈의 기본 스코프(scope)는 싱글톤(Singleton)입니다.
즉, 같은 타입의 빈은 하나만 생성되어 애플리케이션 전반에서 공유됩니다.
하지만 필요에 따라 Prototype, Request, Session 등의 스코프를 설정할 수도 있습니다.
@Component
@Scope("prototype") // 새로운 객체를 매번 생성
public class PrototypeBean { }
- 싱글톤(Singleton) 스코프: 하나의 객체만 생성되어 애플리케이션 전체에서 공유
- 프로토타입(Prototype) 스코프: 매번 새로운 객체가 생성됨
- 웹 애플리케이션에서는 Request, Session 스코프 사용 가능
📌 스프링 빈이 중요한 이유는?
스프링 빈은 스프링 IoC 컨테이너가 직접 관리하는 객체이며,
IoC와 DI(의존성 주입)를 통해 효율적으로 애플리케이션을 개발할 수 있도록 돕습니다.
이를 이해하면 객체 생성 및 관리 부담을 줄이고, 유지보수성이 뛰어난 구조를 만들 수 있습니다.
📌 스프링 빈 & IoC 관련 추가 팁
✅ 자동 등록 vs 수동 등록: 자동 등록이 일반적이지만, 명확한 제어가 필요하면 수동 등록을 고려하세요.
✅ 싱글톤 주의: 빈이 공유되므로, 상태를 가지지 않도록 설계하는 것이 중요합니다.
✅ 라이프사이클 활용: 초기화와 소멸이 필요한 경우 @PostConstruct와 @PreDestroy를 적극 사용하세요.