Spring Bean
2025. 6. 9. 22:01ㆍJava/Spring
Spring Bean
- Spring IoC(Inversion of Control) 컨테이너에 의해 관리되는 자바 객체
- 재사용 가능한 소프트웨어 컴포넌트
- 객체를 직접 new 키워드로 생성하지 않고, Spring Container가 대신 Life Cycle 관리
- 즉, 스프링 간 객체가 의존관계를 관리
@Bean 어노테이션을 사용한 빈 등록
@Configuration - 설정 클래스
- Spring 설정 정보를 담는 클래스임을 표시하는 어노테이션
- 컨테이너 초기화 시점에 해당 클래스 내용이 해석
- 내부에 @Bean 메서드들을 포함할 수 있음
- Bean에 추가 설정을 주지 않는 이상, 무조건 싱글톤 보장
- XML 설정 파일을 Java 코드로 대체
@Bean - Bean 등록
- 메서드가 컨테이너에 등록한 Bean을 생성함을 표시하는 어노테이션
- 예시 코드 (@Configuration 클래스 정의 → @Bean 메서드 생성)
@Configuration
public class ProjectConfig {
// 이 클래스는 Spring 설정을 담고 있습니다
// Bean 정의들을 포함
@Bean
Parrot parrot() {
var p = new Parrot();
p.setName("Koko");
return p;
}
}
- 컨텍스트 초기화 및 빈 추출
public class Main { public static void main(String[] args) { var context = new AnnotationConfigApplicationContext(ProjectConfig.class); Parrot p = context.getBean(Parrot.class); System.out.println(p.getName()); // 출력: Koko } }
@Component - 자동으로 Bean으로 등록할 클래스임을 표시

- @ComponentScan이 이 어노테이션을 찾아서 자동으로 Bean 등록
- @ComponentScan - 자동으로 Bean으로 등록하도록 지시
- 지정된 패키지에서 @Component, @Service, @Repository, @Controller 등을 스캔
- 찾은 클래스들을 자동으로 Spring Container에 Bean으로 등록
- "자동 Bean 등록"의 핵심 메커니즘
@Component // 빈 이름: parrot (클래스명의 camelCase)
public class Parrot {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Configuration
@ComponentScan(basePackages = "org.scoula.domain")
// org.scoula.domain 패키지와 하위 패키지에서 @Component, @Service, @Repository 등을 찾아서 Bean으로 등록
public class ProjectConfig3 {
// 별도의 @Bean 메소드 없이도 @ComponentScan이 자동으로 Bean들을 등록해줌
// org.scoula.domain 패키지의 모든 @Component 계열 어노테이션이 붙은 클래스들이
// Spring Container에 Bean으로 등록됨
}
@PostContruct
- Bean이 생성되고 의존성 주입이 완료된 후 자동으로 실행될 메소드를 지정하는 어노테이션
- Bean 생성 직후 한 번만 자동 실행
- 의존성 주입이 완료된 상태에서 실행
@Component
public class Parrot {
private String name;
@PostConstruct
public void init() {
this.name = "Kiki";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
🔑 스프링 빈 간의 관계 설정
- IoC Container
- Spring Container : IoC Container를 Spring ****방식으로 구현한 실제 시스템
- Dependency Injection
- Bean Wiring
1. @Bean 메서드 간 직접 호출 방식
@Configuration
public class ProjectConfig {
@Bean
public Parrot parrot() {
Parrot p = new Parrot();
p.setName("Koko");
return p;
}
@Bean
public Person person() {
Person p = new Person();
p.setName("Ella");
**p.setParrot(parrot()); // Parrot 빈을 반환하는 메서드 직접 메서드 호출**
return p;
}
}
2. 매개변수를 통한 의존성 주입
- 코드가 더 명확함
- 스프링이 자동으로 의존성 해결
- 메서드 직접 호출보다 권장되는 방식
@Configuration
public class ProjectConfig {
@Bean
public Parrot parrot() {
Parrot p = new Parrot();
p.setName("Koko");
return p;
}
@Bean
public Person person(**Parrot parrot**) { **// 매개변수로 빈 주입**
Person p = new Person();
p.setName("Ella");
**p.setParrot(parrot);**
return p;
}
}
3. @Autowired - 필드 기반 의존성 주입
- 지정된 필드/메서드(setter, 생성자)에 적절한 Bean을 찾아서 자동으로 주입
- 스프링 컨테이너에서 타입이 맞는 Bean을 찾아서 자동 연결
4. 생성자 기반 의존성 주입
- 더 안전한 방식
final필드 사용 가능하여 불변성 보장 - 가장 권장되는 방식
5. Setter 기반 의존성 주입
@Qualifier - 대상 지정
- 같은 타입의 Bean이 여러 개 있을 때 특정 Bean을 선택해서 주입받기 위한 어노테이션
- Bean 이름을 직접 지정하여 모호함 해결
public class Person3 {
private String name = "Ella";
private final Parrot parrot;
public Person(@Qualifier("parrot2") Parrot parrot) {
this.parrot = parrot;
}
...
}
참고자료
'Java > Spring' 카테고리의 다른 글
| Spring MVC (0) | 2025.06.12 |
|---|