스프링 핵심 원리[기본편] - 컴포넌트 스캔

2022. 12. 27. 23:47·Spring

컴포넌트 스캔과 의존관계 자동 주입 시작하기

  • 직접 @Bean을 통해 스프링 빈을 지정하다 보면 프로젝트가 커졌을때 귀찮고, 누락되는 정보도 있을것이다. 따라서 설정정보가 없어도 자동으로 스프링 빈을 등록해주는 컴포넌트 스캔이라는 기능을 제공
  • 또한 의존관계도 자동으로 주입하는 @Autowired라는 기능도 제공
더보기

스프링 컨테이너와 빈을 사용하는이유

서로 연관되어있는 객체(인스턴스 , 메서드)를 직접가져다 쓰면 ocr을 위반하고 유지보수면에서 불편함이 있기때문 기억하기

AutoAppConfig.java

@Configuration 어노테이션은 그대로 -> 설정정보이기 때문

@ComponentScan 어노테이션을 이용하면 자동으로 @Component가 붙은 클래스를 스프링 컨테이너에 빈으로 등록

@Configuration
@ComponentScan(
    excludeFilters = @Filter(type = FilterType.ANNOTATION, classes =
    Configuration.class))
public class AutoAppConfig {

}

MemoryMemberRepository @Component 추가

@Component
public class MemoryMemberRepository implements MemberRepository {}

RateDiscountPolicy @Component 추가

@Component
public class RateDiscountPolicy implements DiscountPolicy {}

MemberServiceImpl @Component, @Autowired 추가

  • @Autowired가 자동으로 의존관계 주입
@Component
public class MemberServiceImpl implements MemberService {
	private final MemberRepository memberRepository;
    @Autowired
    public MemberServiceImpl(MemberRepository memberRepository) {
    this.memberRepository = memberRepository;
    }
}

컴포넌트 스캔과 자동 의존관계 주입

1. @ComponentScan

  • @ComponentScan이 @Component가 붙은 모든 클래스를 스프링 빈으로 등록
  • 이때 스프링 빈의 기본 이름은 클래스명을 사용하지만 첫글자가 소문자(카멜 기법)
    • 직접 이름을 지정하고 싶다면 @Component("memberService2") 과 같이 지정 가능

2. @Autowired의존관계 자동주입

  • 생성자에 @Autowired를 지정하면, 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아 주입
    • 기본적으로 같은 타입의 빈을 찾아 주입(부모타입도 같은 타입)
    • getBean(MemberRepository.class) 와 동일하다고 이해하면 된다.

탐색 위치와 기본 스캔 대상

탐색할 패키지의 시작 위치 지정

  • 모든 자바 클래스를 스캔하려면 너무 많은 시간이 걸리기 때문에 스캔 시작 위치(시작 위치에서 최하단 폴더까지)를 정할수 있다.
@ComponentScan(
 basePackages = "hello.core",
}
  • basePackages = {"hello.core", "hello.service"} 이렇게 여러 시작 위치를 지정할 수도 있다.
  • 만약 지정하지 않으면 @ComponentScan 이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다

권장하는 방법

  • 최상단에 놓자

컴포넌트 스캔 기본 대상

다음 어노테이션들도 컴포넌트 스캔의 기본대상으로 지정

  • @Component : 컴포넌트 스캔의 대상으로 사용
  • @Controlller : 스프링 MVC 컨트롤러에서 사용
  • @Service : 스프링 비즈니스 로직에서 사용
  • @Repository : 스프링 데이터 접근 계층에서 사용
  • @Configuration : 스프링 설정 정보에서 사용

필터

  • includeFilters : 컴포넌트 스캔 대상을 추가로 지정한다.
  • excludeFilters : 컴포넌트 스캔에서 제외할 대상을 지정한다.

FilterType 옵션

  • ANNOTATION: 기본값, 애노테이션을 인식해서 동작한다.
  • ASSIGNABLE_TYPE: 지정한 타입과 자식 타입을 인식해서 동작한다.
  • ASPECTJ: AspectJ 패턴 사용
  • REGEX: 정규 표현식
  • CUSTOM: TypeFilter 이라는 인터페이스를 구현해서 처리

중복 등록과 충돌

두가지 상황이 있다.

  1. 자동 빈 등록 vs 자동 빈 등록
  2. 수동 빈 등록 vs 자동 빈 등록

자동 빈 등록 vs 자동 빈 등록

  • ConflictingBeanDefinitionException 오류 발생

수동 빈 등록 vs 자동 빈 등록

  • 수동빈이 우선권을 가짐
    • 최근 스프링부트에서는 그냥 오류를 내버림

 


참고강의

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

728x90
저작자표시 (새창열림)

'Spring' 카테고리의 다른 글

JPA Auditing기능이란?  (0) 2022.12.29
스프링 핵심 원리[기본편] - 의존관계 자동 주입  (0) 2022.12.28
스프링 핵심 원리[기본편] - 싱글톤 컨테이너  (0) 2022.12.27
스프링 핵심 원리[기본편] - 스프링 컨테이너와 스프링 빈  (0) 2022.12.27
스프링 핵심 원리[기본편] - 예제만들기 , 객체 지향 원리 적용  (0) 2022.12.27
'Spring' 카테고리의 다른 글
  • JPA Auditing기능이란?
  • 스프링 핵심 원리[기본편] - 의존관계 자동 주입
  • 스프링 핵심 원리[기본편] - 싱글톤 컨테이너
  • 스프링 핵심 원리[기본편] - 스프링 컨테이너와 스프링 빈
study ticket
study ticket
  • study ticket
    혼자하는 공부
    study ticket
  • 전체
    오늘
    어제
    • 개발 (77)
      • 오류 (1)
      • Spring (13)
      • Java (0)
      • Data structure (6)
      • Algorithm (49)
        • 백준 (17)
        • 프로그래머스 (2)
      • 문제풀면서 알게되는것들 끄적 (2)
      • 머신러닝 (4)
        • sklearn (3)
        • pandas (1)
      • 프로젝트 (0)
        • 핏두 (0)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    백준1157
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
study ticket
스프링 핵심 원리[기본편] - 컴포넌트 스캔
상단으로

티스토리툴바