[기술정리] 컴포넌트 스캔

Stupefyee's avatar
Nov 14, 2024
[기술정리] 컴포넌트 스캔

1. 개념

  • 자동화된 빈 등록: 클래스에 어노테이션을 적용하여 Spring 컨테이너에 자동으로 빈(bean)을 등록.
  • 어노테이션 기반: @Component, @Service, @Repository, @Controller 등 어노테이션을 사용하여 자동으로 스프링이 관리하는 객체로 등록.
  • 패키지 탐색: 특정 패키지 및 서브패키지에 있는 클래스들을 탐색하여 빈으로 등록.

2. 작동 원리

  1. 클래스에 어노테이션 적용
      • @Component, @Service, @Repository, @Controller 등 어노테이션을 클래스에 붙여 해당 클래스가 빈으로 등록되도록 지정.
  1. 패키지 스캔
      • @ComponentScan 어노테이션을 사용해 특정 패키지 내 클래스를 스캔하여 빈을 자동으로 등록.
  1. 스프링 컨테이너 관리
      • 스캔된 클래스들은 스프링 컨테이너에 빈(bean)으로 등록되어 의존성 주입(Dependency Injection) 등에 활용.

2. 예시 코드

  1. 어노테이션 적용
      • @Service, @Component 등을 사용하여 클래스에 빈 등록 어노테이션을 붙임.
      @Service public class MyService { public void execute() { System.out.println("Service is running..."); } }
  1. @ComponentScan 사용
      • 스프링 설정 파일 또는 @Configuration 클래스에서 @ComponentScan을 사용하여 패키지 탐색 범위 지정.
      @Configuration @ComponentScan(basePackages = "com.example.services") public class AppConfig { // Spring이 com.example.services 패키지 내 클래스를 스캔하여 빈으로 등록 }
  1. 자동 빈 등록
      • @Service, @Component 어노테이션이 붙은 클래스들은 @ComponentScan에 지정된 패키지 내에서 자동으로 빈으로 등록됨.

3. 주요 어노테이션

  • @Component: 일반적인 컴포넌트 클래스에 사용.
  • @Service: 서비스 계층 클래스에 사용.
  • @Repository: 데이터 접근 계층 클래스에 사용.
  • @Controller: 웹 계층 클래스에 사용.
  • @RestController: RESTful 웹 서비스에서 사용.

4. 장점

  • 자동화: 어노테이션만으로 빈을 등록하므로 코드가 간결하고 설정이 간단.
  • 유지보수 용이: 클래스에 어노테이션만 추가하면 Spring이 자동으로 관리하므로 코드 유지보수가 쉬워짐.
  • 유연성: 패키지와 클래스를 변경하지 않고 어노테이션을 추가/삭제하는 방식으로 빈 관리가 가능.

5. 단점

  • 디버깅 어려움: 자동으로 빈이 등록되기 때문에, 실제로 어떤 빈이 등록되는지 추적이 어려울 수 있음.
  • 어노테이션에 의존: 모든 빈을 어노테이션으로 등록해야 하므로, 어노테이션에 의존하게 됨.

6. 컴포넌트 스캔의 예시

1. 기본 설정 예시
  • @ComponentScan을 사용하여 패키지 내의 클래스를 자동으로 빈으로 등록하는 예시:
@Configuration @ComponentScan(basePackages = "com.example") public class AppConfig { // Spring은 com.example 패키지 내의 @Service, @Repository 등 어노테이션을 처리하여 빈으로 등록 }
 
2. 어노테이션을 이용한 빈 등록
  • @Service로 빈을 등록하고, 다른 빈에서 의존성 주입 받는 예시:
@Service public class MyService { public String serve() { return "Service is working!"; } } @Component public class MyController { @Autowired private MyService myService; public void showServiceMessage() { System.out.println(myService.serve()); } }
 
3. 자동 주입 확인
  • @Autowired를 통해 MyController에서 MyService 빈을 자동으로 주입받는 방식:
@Autowired private MyService myService;
Share article

stupefyee