스프링 빈 자동 등록과 주입, 제대로 이해하기
스프링은 객체를 직접 new로 생성하지 않아도,
스프링 컨테이너가 대신 객체를 만들고 관리하며
필요한 곳에 자동으로 의존성을 주입해주는 프레임워크다.
이 과정에서 @ComponentScan은 빈을 자동으로 찾아 등록하고,
@Component는 해당 클래스를 스프링 빈으로 표시하며,
@Autowired는 필요한 빈을 자동으로 주입해주는 역할을 한다.
또한, 개발자가 직접 빈을 등록하고 싶을 때는 @Configuration을 사용해 수동으로 설정할 수 있다.
@ComponentScan — 어디서 자동으로 빈을 찾을지 알려주는 기능
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
}
@ComponentScan은 지정한 패키지를 스캔해서@Component,@Service,@Repository,@Controller등이 붙은 클래스를 자동으로 스프링 빈으로 등록해준다.
등록 "대상"을 찾는 역할을 한다.
@Component — 이 클래스를 스프링 빈으로 등록해주세요
@Component
public class MemberService {
public void join() {
System.out.println("회원 가입 처리");
}
}
- 해당 클래스는 스프링이 자동으로 관리해주는 객체가 된다.
- 별도로
@Bean을 쓰지 않아도 된다.
자동 등록만으로 끝일까?
아니다! 등록만 해서는 아무 일도 일어나지 않는다.
등록된 객체를 실제로 사용하려면 다른 클래스에서 참조해야 한다.
@Autowired — 필요한 빈을 알아서 넣기!
@Component
public class OrderService {
private final MemberService memberService;
@Autowired
public OrderService(MemberService memberService) {
this.memberService = memberService;
}
public void order() {
memberService.join(); // 의존 객체 호출
}
}
OrderService는MemberService가 필요하다.- 그런데
new MemberService()라고 만들지 않는다. - 대신
@Autowired를 통해, 스프링 컨테이너가 등록해둔 MemberService 객체를 주입받는다.
그러면 언제 Autowired를 써야 할까?
- 내 클래스가 다른 빈을 의존할 때 (필요로 할 때)
- 생성자 주입이 가장 권장되는 방식
- 생성자가 1개일 경우에는
@Autowired를 생략할 수 있다. (스프링이 자동 감지)
예제 코드 전체 흐름
// AppConfig.java
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
}
// MemberService.java
@Component
public class MemberService {
public void join() {
System.out.println("회원 가입 처리");
}
}
// OrderService.java
@Component
public class OrderService {
private final MemberService memberService;
@Autowired
public OrderService(MemberService memberService) {
this.memberService = memberService;
}
public void order() {
memberService.join(); // 의존 객체 호출
}
}
// Main.java
public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
OrderService orderService = context.getBean(OrderService.class);
orderService.order(); // 자동으로 주입된 MemberService가 실행됨
}
}'SpringBoot' 카테고리의 다른 글
| RequestScope로 요청별 로그 분리하기 (0) | 2025.05.07 |
|---|---|
| 스프링 DI: 생존자 주입을 권장하는 이유 (0) | 2025.05.05 |
| 싱글톤 패턴과 스프링의 싱글톤 관리 (0) | 2025.04.30 |
| Spring Boot: 데이터 검증(Validation) (1) | 2024.11.22 |
| Spring Boot: 로깅(Logging) 구현하기 (1) | 2024.11.21 |