Spring boot

[기본] 컴포넌트 스캔

메모

 

@Repository 

스프링이 데이터 예외를 추상화해서 반환해준다

특정 DB에 한정적인 예외를 스프링이 추상화해준다 /??

 

@Target(Element.TYPE)

필드에 붙냐 어디에 붙냐 이런건데, TYPE라 하면 클래스 레벨에 붙는 것?

 

 

코드를 조금 더 깔끔하게 하기 위해 어설프게 추상화 등 우선순위가 생기면 나중에 잡기 힘든 버그가 됨

코드가 조금 더 많아지더라도 명확하게 짜는 것이 좋음

 


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

직접 설정 정보에 입력할 스프링 빈이 수백개가 되면 관리가 힘들어진다.

그래서 스프링은 자동으로 스프링 빈을 등록하는 컴포넌트 스캔 기능을 제공한다.

의존관계 주입은 @Autowired로 가능하다.

 

설정 클래스에 @ComponentScan, @Configuration을 붙인다.

ComponentScan은 excludeFilters, includeFilters를 통해 뺄 정보와 추가할 정보를 설정할 수 있다.

 

@Component 애노테이션이 붙은 클래스를 스캔해 스프링 빈으로 등록한다.

기본 클래스 명을 사용하되 맨 앞글자만 소문자로 변경하여 등록한다.

 

기존에 생성자를 통해 넣어줬던 의존관계는 @Autowired를 붙여주면 스프링 빈이 조회해 자동 주입해준다.

기본 조회 전략은 타입이 같은 빈을 우선으로 찾는다.

 


탐색 위치와 기본 스캔 대상

 

basePackages 를 통해 탐색 패키지의 시작 위치를 지정한다. 이 패키지를 포함해 하위 패키지를 모두 탐색한다.

@ComponentScan(
 basePackages = "hello.core",
}

 

패키지를 지정하지 않고 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것을 권장한다.

ex) com.hello 에 AppConfig 를 놓자.

 

컴포넌트 스캔은 다음 내용도 스캔한다.

@Component

@Controller

@Service

@Repository

@Configuration

 

참고: 애노테이션은 스프링이 지원하는 기능으로 상속관계가 없다.

 


필터

 

includeFilters : 컴포넌트 스캔 대상을 추가로 지정한다.

excludeFilters : 컴포넌트 스캔에서 제외할 대상을 지정한다

 

참고: includeFilters는 거의 사용하지 않는다.

옵션을 변경하며 사용하기보단 스프링 기본 설정에 최대한 맞춰서 사용하자.

 


중복 등록과 충돌

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

ConflictingBeanDefinitionException 에러 발생

 

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

스프링은 수동 빈이 자동 빈을 오버라이딩 하도록 설계되었지만

스프링부트가 최근 오버라이딩 불가능하도록 설정함 개발자가 의도하지 않았을 확률이 높기 때문

만약 오버라이딩하고싶다면 application.properties에 overriding = true 하자