Spring Bean은 Spring Framework가 관리하는 객체를 의미합니다. 다시 말해, Spring 컨테이너가 생성하고 생명주기를 관리하는 객체를 Spring Bean이라고 합니다.
📌 1. Spring Bean이란?
- Spring은 객체를 생성하고 의존성을 주입하여 애플리케이션을 구성합니다.
- Spring 컨테이너는 설정 파일 또는 애노테이션을 통해 Bean 정의를 읽고, 애플리케이션 실행 시 객체를 생성하고 관리합니다.
- 이때 컨테이너가 생성하고 관리하는 객체를 Spring Bean이라고 합니다.
즉, 일반적인 Java 객체지만, Spring에 의해 등록되고 관리되면 그것을 “Spring Bean”이라고 부릅니다.
스프링 빈의 특징:
- 컨테이너에 의해 관리: 스프링 컨테이너(ApplicationContext)가 빈의 생명주기(생성, 초기화, 소멸)를 전적으로 관리합니다. 개발자는 객체 생성 및 관리에 대한 부담을 덜 수 있습니다.
- 의존성 주입: 스프링 컨테이너는 빈들 간의 의존성을 자동으로 해결하고 주입합니다. 이를 통해 느슨한 결합(Loose Coupling)을 촉진하고, 테스트 용이성을 높입니다.
- 싱글톤(기본): 특별히 지정하지 않는 한, 스프링 빈은 기본적으로 싱글톤 스코프를 가집니다. 즉, 컨테이너 내에서 해당 빈의 인스턴스는 하나만 존재합니다.
- POJO(Plain Old Java Object): 스프링 빈은 특별한 인터페이스를 구현하거나 특정 클래스를 상속할 필요가 없는 일반적인 자바 객체입니다. 스프링은 POJO를 컨테이너에 등록하여 빈으로 활용할 수 있게 합니다.
📌 2. Spring Bean을 정의하는 방법
Spring Bean은 Spring Framework가 관리하는 객체를 의미합니다. 다시 말해, Spring 컨테이너가 생성하고 생명주기를 관리하는 객체를 Spring Bean이라고 합니다.
Spring Bean을 정의하는 방법은 크게 3가지가 있습니다:
✅ 1. XML 기반 설정
이 방식은 스프링 초기부터 사용되던 전통적인 방법입니다. applicationContext.xml과 같은 XML 파일에 <bean> 태그를 사용하여 빈을 정의합니다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myService" class="com.example.MyService">
<property name="myRepository" ref="myRepository"/>
</bean>
<bean id="myRepository" class="com.example.MyRepository"/>
</beans>
- 장점:
- 설정 내용을 한눈에 파악하기 용이합니다.
- XML 파일이 커지면 관리하기 어렵습니다.
- 컴파일 시점에 오류를 발견하기 어렵습니다 (런타임 오류).
- 최근 스프링 개발에서는 잘 사용되지 않습니다.
✅ 2. 애노테이션 기반 설정 ( @Component, @Service, @Repository, @Controller )
가장 보편적이고 편리한 빈 정의 방식입니다. 스프링은 특정 패키지(또는 패키지들)를 스캔하여 @Component 또는 @Component를 포함하는 스테레오타입 애노테이션(@Service, @Repository, @Controller, @RestController)이 붙은 클래스를 자동으로 스프링 빈으로 등록합니다.
// com.example.MyService.java
package com.example;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
@Service // 이 클래스를 스프링 빈으로 등록
public class MyService {
private final MyRepository myRepository;
@Autowired // MyRepository 빈을 주입
public MyService(MyRepository myRepository) {
this.myRepository = myRepository;
}
public void doSomething() {
myRepository.save();
System.out.println("MyService: Doing something...");
}
}
// com.example.MyRepository.java
package com.example;
import org.springframework.stereotype.Repository;
@Repository // 이 클래스를 스프링 빈으로 등록
public class MyRepository {
public void save() {
System.out.println("MyRepository: Saving data...");
}
}
그리고 @ComponentScan으로 해당 클래스를 스캔하여 Bean으로 등록할 수 있게 합니다:
// com.example.AppConfig.java (컴포넌트 스캔 설정)
package com.example;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = "com.example") // "com.example" 패키지 이하를 스캔하여 빈을 찾음
public class AppConfig {
// 여기에 @Bean 메소드를 추가할 수도 있음
}
또는 스프링 부트 애플리케이션의 경우 @SpringBootApplication 애노테이션이 @ComponentScan을 포함하고 있으므로 별도 설정 없이 자동으로 스캔됩니다.
장점:
- 가장 간편하고 생산성이 높습니다.
- 클래스 레벨에서 애노테이션만 붙이면 되므로 설정이 분리되지 않고 해당 클래스에 명시됩니다.
- 대부분의 스프링 애플리케이션에서 사용되는 방식입니다.
단점:
- 스캔 대상 패키지가 너무 넓으면 불필요한 스캔이 발생할 수 있습니다.
- 일부 복잡한 설정(예: 특정 조건에 따라 빈을 다르게 생성)에는 부적합할 수 있습니다 (이 경우 @Configuration, @Bean과 함께 사용).
✅ 3. Java Config 기반 설정 (@Bean)
스프링 3.0부터 도입된 방식으로, 자바 클래스에 @Configuration 애노테이션을 붙이고, 해당 클래스 내부에 @Bean 애노테이션이 붙은 메소드를 사용하여 빈을 정의합니다.
// com.example.AppConfig.java
package com.example;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration // 이 클래스가 스프링 설정 클래스임을 명시
public class AppConfig {
@Bean // 이 메소드가 반환하는 객체를 스프링 빈으로 등록
public MyService myService() {
// MyService 빈이 MyRepository 빈에 의존한다고 가정
return new MyService(myRepository());
}
@Bean
public MyRepository myRepository() {
return new MyRepository();
}
}
장점:
- 타입 기반의 설정을 할 수 있어 안전합니다.
- 컴파일 시점에 오류를 발견하기 쉽습니다.
- 리팩토링이 용이합니다.
- 최근 스프링 부트 프로젝트에서 많이 사용됩니다.
단점:
- 설정 클래스가 많아지면 관리하기 어려울 수 있습니다 (단, 컴포넌트 스캔과 함께 사용하면 보완됨).
📌 3. 정리
구분 방식 장점 단점
| XML 설정 | <bean> 태그 사용 | 설정이 명확함 | 장황하고 유지보수 어려움 |
| 애노테이션 기반 | @Component, @Service 등 | 간단하고 직관적 | 자동 등록으로 명시성 떨어질 수 있음 |
| Java Config | @Bean 사용 | 자바 코드로 유연하게 설정 가능 | 코드가 길어질 수 있음 |
'탐구하기' 카테고리의 다른 글
| SpringBoot와 Spring, 이 둘의 차이점은 무엇일까? (1) | 2025.06.16 |
|---|---|
| Spring Bean의 생명주기는 어떻게 될까? (0) | 2025.06.13 |
| AWS EC2 서버 구성 및 배포, AMI 생성 및 복제 (0) | 2025.06.10 |
| RestAPI란 무엇일까?? (1) | 2025.06.02 |
| 빌더패턴은 무엇일까? (0) | 2025.06.02 |