inblog logo
|
stupefyee
    기술정리

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

    Stupefyee's avatar
    Stupefyee
    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

    RSS·Powered by Inblog