티스토리 뷰
이번장에는 자동 주입과 하께 사용되는 추가 기능, 컴포턴트 스캔을 소개하겠다.
컴포넌트 스캔은 스프링이 직접 클래스를 검색해 빈으로 등록해주는 기능이다. 설정 클래스에 빈으로 등록하지 않아도 원하는 클래스를 빈으로 등록하는 어노테이션 컴포넌트만 붙이면 되기에 설정코드가 줄어드는 효과를 볼 수 있다.
그럼 어떻게 해야할까?
기존 설정 클래스에서 빈 객체를 만드는 메서드를 다지우고 빈 객체를 만드려는 클래스에 @Component만 붙이면 된다.
간단히 코드를 통해 알아보겠다.
오류가 나지않고 찍히는 것을 확인할 수 있다.
원래라면 Config 클래스에 A, B, C에 대한 빈 등록을 해야했으나 @Component 어노테이션을 이용한 A, B 클래스는 설정 클래스에 빈 등록을 피해 코드의 양을 줄일 수 있다.
대신 Config 클래스에는 @ComponentScan 어노테이션을 붙여서 어떤 클래스를 스캔대상으로 정할지 판단해야한다.
속성 값인 backPackages에 {"spring"}이라고 되어있는데 이 속성은 스캔 대상 패키지와 하위 패키지 목록을 지정한다.
그래서 이 예제를 통해 알아보자면, spring 패키지와 하위에 속한 클래스 즉 @Component 어노테이션이 붙은 클래스를 스캔하고 객체를 생성해 빈으로 등록한다는 소리이다.
그럼 Main 클래스에서 B 빈 객체를 가져올 때 bbb라는 이름으로 가져왔는데 다른 이름으로 가져오면? 에러가난다.
만약 @Component에 속성값을 주지않는다면 맨 첫글자가 소문자로 바뀌고 나머진 그대로의 빈 객체 이름이 된다.
그리고 빈 객체이름을 굳이 넣지 않아도 getBean 메서드에서 클래스 타입만 넣어도 실행이 되기에 이름에 대해선 큰 걱정은 할 필요없다.( 지정하지 않는 이상 ! )
**
스캔 대상에서 제외하거나 포함하기)
excludeFilters 속성을 사용하면 스캔할 때 특정 대상을 자동 등록 대상에서 제외할 수 있다. 코드를 통해 알아보자!
자세한 내용은 다른 블로그를 참고하도록 하고 ! 일단 코드에 집중하자면, 필터를 넣는데 A 클래스는 스캔대상에 넣지 않을거야! 라는 뜻.
실제로 실행해보면 스캔이 되지않았다고 에러메시지를 남긴다.
자세한 내용은 이 블로그를 참고!
1-3) 스프링 @ComponentScan의 다양한 설정들 : basePackages, useDefaultFilters, includeFilters, excludeFilters, lazyInit
- @ComponentScan 어노테이션 스프링으로 서비스를 개발해본 적이 있다면, @ComponentScan 어노테이션이 굉장히 익숙할 것이다. ApplicationContext 설정 클래스에 @ComponentScan("패키지 경로")을 적어두면 해당..
nankisu.tistory.com
그리고 특정 어노테이션을 붙인 타입도 컴포넌트 대상에서 제외가능하다.
만약 A 빈 객체를 호출하거나 B 빈 객체를 호출하면 에러가 난다.
**
Component 어노테이션 뿐만 아니라, 기본 스캔 대상은 Component 어노테이션이 붙은 Controller, Service, Repository가 스캔대상에 포함된다는 사실을 기억하자.
그렇다면 충돌처리는 어떨까?
서로다른 패키지에 같은 클래스이름이 존재하고, 그 클래스 모두 @Component 어노테이션을 붙였는데 이상태에서 @ComponentScan을 통해 서로다른 패키지를 가져온다면?
입셉션이 발생하는데 클래스를 빈으로 등록할 때 빈 이름의 충돌이 난다는 내용을 볼 수 있다.
설정파일을 통해 수동 등록(즉 빈 직접설정) 후 @Component를 붙인 설정파일에 등록한 똑같은 빈과의 충돌은?
여기서는 충돌 에러가 나지 않지만 수동 등록한 빈이 우선한다.(한개만 정의됨)
다만 클래스 이름은 같은데 빈의 이름을 다르게 한 경우 빈 객체가 2개 생성되기에 자동 주입시 @Qualifier를 통해 구별을 하도록 하자.
'책 > 초보 웹 개발자를 위한 스프링5 프로그래밍 입문' 카테고리의 다른 글
7장. AOP 프로그래밍 (0) | 2021.10.08 |
---|---|
6장. 빈 라이프사이클과 범위 (0) | 2021.10.05 |
4강. 의존 자동 주입 (0) | 2021.10.01 |
3강. 스프링 DI (0) | 2021.09.30 |
2강. 스프링 시작. (0) | 2021.09.30 |
- Total
- Today
- Yesterday
- https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html
- ㄴ
- Co
- https://velog.io/@juno7803/React%EA%B0%80-%ED%83%9C%EC%96%B4%EB%82%9C-%EB%B0%B0%EA%B2%BD
- https://react.vlpt.us/
- https://jwprogramming.tistory.com/52
- https://wikidocs.net/68
- https://react.vlpt.us/basic/11-render-array.html
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |