일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- HTTP 요청 메시지
- HTTP메시지
- BeanValidation
- 객체지향
- 스프링 컨테이너
- 서블릿
- 프로토콜 스택 4계층
- DI
- 의존관계
- ExceptionResolver
- 스프링 파일 업로드
- 깃허브 저장소 합치기
- 김영한
- HTTP 응답 메시지
- http
- 체크에러
- 웹 스코프
- BeanDefnition
- 스프링
- REST #REST API #HTTP 메서드
- 스프링 빈
- 언체크에러
- 백준4256
- 예외추상화
- 백준 2263
- 프로토타입 스코프
- 스프링 예외변환기
- 커밋로그
- 스프링 타입컨버터
- BasicErrorController
- Today
- Total
Enthusiasm! Enthusiasm!
컴포넌트 스캔 본문
컴포넌트 스캔 기초
기존에는 설정정보에 @Bean을 사용하여 일일이 스프링 빈을 등록했다. 이러한 방식은 누락의 위험, 번거로움이 동반되므로 스프링은 자동으로 스프링 빈을 등록하는 컴포넌트 스캔 기능을 제공한다.
컴포넌트 스캔을 사용하려면 @ComponentScan를 설정 정보에 붙여주면 된다.
@Configuration
@ComponentScan
public class AutoAppConfig {
}
-기존의 AppConfig와 달리 컴포넌트 스캔을 사용하면, 객체를 생성하여 반환해주는 함수들이 필요없다.
-의존관계 주입은 일반적으로 클래스 생성자에 @Autowired를 붙이는 생성자 주입을 사용한다.
-컴포넌트 스캔은 이름 그대로 @Component 애노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록한다.
-@Configuration도 컴포넌트 스캔의 대상이 되는데 이는 @Configuration의 소스코드에 @Component가 붙어있기 때문이다.
-@ComponentScan은 @Component가 붙은 모든 클래스를 스프링 빈으로 등록한다.
-이때 스프링 빈의 기본 이름은 클래스명을 사용하고, 맨 앞글자만 소문자를 사용한다.
-빈 이름을 직접 지정하고 싶으면 @Component("memberService2")와 같이 이름을 부여하면 된다.
@Autowired의존관계 자동 주입
생성자에 @Autowired를 지정하면, 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 주입한다.
이때 기본 조회 전략은 타입이 같은 빈을 찾아서 주입한다 (getBean(.class)와 동일하다고 생각하면 된다.)
탐색 위치와 탐색 대상
@Configuration
@ComponentScan
(
basePackages = "hello.core.member",
basePackageClasses = AutoAppConfig.class,
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,
classes = Configuration.class)
)
- basePackages : 탐색할 패키지의 시작위치
- basePackageClasses: 만약 지정하지 않으면 @ComponentScan 이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다. 패키지 위치를 지정하지 않고, 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것을 권장. 최근 스프링 부트도 이 방법을 기본으로 제공한다.
- excludeFilters: 컴포넌트 스캔 대상에서 제외할 대상을 선택.
컴포넌트 스캔 기본 대상
- @Component : 컴포넌트 스캔에서 사용
- @Controlller : 스프링 MVC 컨트롤러에서 사용 / 스프링 MVC 컨트롤러로 인식
- @Service : 스프링 비즈니스 로직에서 사용 / 스프링 관련 특별한 처리는 없지만 핵심 비즈니스 로직을 여기에 주로 사용
- @Repository : 스프링 데이터 접근 계층에서 사용 / 스프링 데이터 접근 계층으로 인식하고, 데이터 계층의 예외를 스프링 예외로 변환해준다. → repo에서 에러가 발생하면 서비스와 같이 다른 클래스에도 영향을 미칠 수 있는데, 이떄 에러를 저장소의 에러임을 명확하게 구분해준다!
- @Configuration : 스프링 설정 정보에서 사용 / 설정정보로 인식하고 싱글톤 유지하도록 추가 처리
필터
- includeFilters : 컴포넌트 스캔에 넣을 대상을 지정, @Component가 이 역할을 하기 때문에 사실상 사용할 일이 없다.
- excludeFilters : 컴포넌트 스캔에서 제외할 대상을 지정
중복등록과 충돌
- 컴포넌트 스캔에서 자동으로 등록 되는 빈이 중복된다면 ConflictingBeanDefinitionException 예외가 발생한다.
- 자동으로 등록되는 빈과 수동으로 등록되는 빈이 중복된다면 수동 빈이 우선순위를 가진다.(수동 빈이 자동 빈을 오버라이드)\
- 오버라이딩 되는 것이 의도한 설정대로 나온거라면 괜찮지만, 대부분은 여러 설정이 꼬여서 이런 결과가 만들어진다. 이런 애매한 버그는 잡기가 어렵기 때문에 최근 스프링 부트에서는 충돌이 발생하면 오류가 발생하도록 기본 값을 바꾸었다.
이전 포스팅 - 싱글톤 컨테이너 https://yulddong.tistory.com/12
싱글톤 컨테이너
이 포스팅은 스프링 핵심원리 - 기본편(By Inflearn 김영한님) 강의 및 강의자료를 참고하여 작성하였습니다. 싱글톤 패턴(디자인) 스프링 전환 이전의 AppConfig를 다시 한번 살펴보자 -위 AppConfig의
yulddong.tistory.com
다음 포스팅- 의존관계 자동 주입(1) https://yulddong.tistory.com/14
의존관계 자동 주입(1)
이 포스팅은 스프링 핵심원리 - 기본편(By Inflearn 김영한님) 강의 및 강의자료를 참고하여 작성하였습니다. 의존관계 주입의 종류 생성자 주입 수정자 주입(setter 주입) 필드 주입 일반 메서드 주
yulddong.tistory.com
이 포스팅은 스프링 핵심원리 - 기본편(By Inflearn 김영한님) 강의 및 강의자료를 참고하여 작성하였습니다.
'자바 스프링 > 스프링 핵심원리' 카테고리의 다른 글
의존관계 자동 주입(2) (4) | 2023.01.10 |
---|---|
의존관계 자동 주입(1) (0) | 2023.01.09 |
싱글톤 컨테이너 (0) | 2023.01.05 |
스프링 빈 조회 (2) | 2023.01.04 |
객체지향 설계 - 스프링으로 전환 (0) | 2023.01.03 |