[ Spring ]/Spring 입문

[Spring 입문] 컴포넌트 스캔과 자동 의존관계 설정

쿠릉쿠릉 쾅쾅 2022. 2. 14. 16:07
728x90

 

 

1. 스프링 빈 등록하는 2가지 방법 

  • 컴포넌트 스캔과 자동 의존관계 설정
  • 자바 코드로 직접 스프링 빈 등록하기

 

 

2. 컴포넌트 스캔과 자동 의존관계 설정

2-1 컴포넌트 스캔을 통해 자동으로 스프링 빈 등록

🔍 정의

  • 컴포넌트 스캔(Component Scan)이란,  @Component 애노테이션을 가진 모든 대상을 빈으로 등록하기 위해 찾는 과정이다.
  • 빈 설정 파일 또는 @Bean 애노테이션을 통해 빈을 하나하나 지정할 필요가 없다.

 

🔍 특징

  • 빈 이름 기본 전략 : 가장 앞 문자를 소문자로 바꾼 것이 빈 이름이 된다.
    • ex) MemberServiceImple → memberServiceImple
  • 빈 이를을 수동으로 지정할 수 있다.
    • @Component("지정할_이름")
  • 기본적인 컴포넌트 스캔 대상
    • @Component : 컴포넌트 스캔에서 사용
    • @Controller : 스프링 MVC 컨트롤러에서 사용
    • @Service : 스프링 비즈니스 로직에서 사용
    • @Repository : 스프링 데이터 접근 계층에서 사용
    • @Configuration : 스프링 설정 정보에서 사용
  • 컴포넌트 스캔 범위
    • @ComponentScan 애노테이션이 있는 파일의 패키지 아래를 찾는다.
      • 스프링 부트에서는 @SpringBootApplication 애노테이션이 @ComponentScan 애노테이션을 포함하고 있어서 @SpringBootApplication 애노테이션이 있는 파일의 패키지 아래를 찾는다.
    • basePackages 또는 basePackageClasses 로 스캔 범위를 따로 지정 가능하다.
    • 권장 방법 : @ComponentScan 애노테이션이 있는 파일을 프로젝트 폴더의 최상단에 둘 것
      • 스프링 부트를 사용하면 @SpringBootApplication 애노테이션이 있는 파일이 자동으로 프로젝트 폴더의 최상단에 위치하고 있다.

 

🔍 주의할 점

  • DiscountPolicy 인터페이스를 상속 받는 RateDiscountpolicy 클래스와 FixDiscountpolicy 클래스가 있을 때, 둘 중 내가 사용할 것만 빈에 등록해야하기 때문에 한 곳에만 @Component 애노테이션을 붙여야한다.
  • 아니면 두 클래스에 모두 @Component 애노테이션을 붙이고 @Qulifier 또는 @Primary를 사용해서 우선순위를 지정할 수 있다.
  • 수동 빈 등록 vs 자동 빈 등록
    • 자동으로 빈을 등록한 상태에서 수동 등록 파일과 이름이 겹칠 경우에는 수동 빈 파일이 우선권을 가진다.
    • 그러나 최근 스프링 부트에서는 빈 이름 중복시 오류로 처리하고 있다.

 

 

 

2-2 자동 의존 관계 설정 (Auto Dependency Injection)

🔍 정의

  • 의존관계 주입을 스프링 컨테이너에서 등록된 빈을 찾아서 설정하는 방법이다.

 

🔍 설명

  • 스프링 빈 설정 파일이 없어진다면 해당 파일에서 해주던 의존관계 주입을 해주는 것이 필요하다.
    • @Autowired 애노테이션을 사용하면 된다.

 

🔍 원리

  • 스프링 컨테이너가 @Component 애노테이션을 찾아서 모두 스프링 빈으로 등록한다.
  • 의존성이 필요한 부분에서 @Autowired 애노테이션이 있다면 등록된 스프링 빈에서 찾아서 의존관계를 주입해준다. 

 

참고) 스프링 컨테이너는 빈을 싱글톤으로 관리한다.

  • 스프링에 스프링 빈을 등록할 때 기본으로 싱글톤으로 등록한다.
  • 따라서 같은 스프링 빈이면 모두 같은 인스턴스다.
  • 설정으로 싱글톤이 아니게 설정할 수 있지만, 특별한 경우를 제외하면 대부분 싱글톤을 사용한다.

 

 

3. 자바 코드로 직접 스프링 빈 등록하기

  • 메서드 위에 @Bean 애노테이션을 붙여 빈을 수동으로 등록한다.

 


👀 참고 자료

https://velog.io/@neity16/Spring-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8-6-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8-%EC%8A%A4%EC%BA%94Component-Scan-DI

 

Spring 핵심 원리 기본편 (6) - 컴포넌트 스캔(Component Scan) / @Autowired

지금까지 스프링 빈(Bean)을 등록할 때 구성파일에 @Bean 을 사용했다   \--> 관리할 빈이 많아지면 관리하기 번거로워 진다굳이 빈 설정파일을 만들지 않거나, @Bean을 안쓰고 빈 등록을 할 수 있다

velog.io

 

728x90