스프링 빈 자동 등록과 의존성 주입

2025. 5. 1. 19:23·SpringBoot

스프링 빈 자동 등록과 주입, 제대로 이해하기

스프링은 객체를 직접 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
'SpringBoot' 카테고리의 다른 글
  • RequestScope로 요청별 로그 분리하기
  • 스프링 DI: 생존자 주입을 권장하는 이유
  • 싱글톤 패턴과 스프링의 싱글톤 관리
  • Spring Boot: 데이터 검증(Validation)
moodone
moodone
  • moodone
    무던하게
    moodone
  • 전체
    오늘
    어제
    • 분류 전체보기 (36)
      • Java (7)
      • SpringBoot (24)
      • JavaScript (0)
      • Database (1)
      • Python (0)
      • Git (1)
      • IDE (0)
      • 기타 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    티스토리챌린지
    오블완
    Repository
    git
    git bash
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
moodone
스프링 빈 자동 등록과 의존성 주입
상단으로

티스토리툴바