You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
컴포넌트 스캔과 의존관계 자동 주입
@Bean애노테이션이나 XML의<bean>등을 통해서 설정 정보에 직접 등록할 스프링 빈을 나열함컴포넌트 스캔이라는 기능을 제공함@Autowired라는 기능도 제공함AutoAppConfig.java
@ComponentScan을 설정 정보에 붙여주면 됨@Bean이 하나도 없음보통은 설정 정보를 컴포넌트 스캔 대상에서 제외하지 않지만, 해당 예제에서는 수동으로 등록한
AppConfig파일이 존재하여 중복되기 때문에excludeFilters를 이용해서 스캔 대상에서 제외했다.@Component애노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록함MemoryMemberRepository,RateDiscountPolicy,MemberServiceImpl에@Component추가생성자를 통한 의존 관계 주입 코드에
@Autowired추가AnnotationConfigApplicationContext를 사용하는 것은 기존과 동일함AutoAppConfig클래스를 넘겨줌@Component로 등록한 빈들이 잘 등록된 것을 확인할 수 있음@ComponentScan@ComponentScan은@Component가 붙은 모든 클래스를 스프링 빈으로 등록함@Component("memberService2")@Autowired의존 관계 주입@Autowired를 지정하면 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아 주입해줌타입이 같은 빈을 찾아서 주입한다getBean(MemberRepository.class)와 동일하다고 이해하면 됨탐색 위치와 기본 스캔 대상
탐색할 패키지의 시작 위치 지정
basePakages: 이 패키지를 포함해서 하위 패키지를 모두 탐색함basePakageClasses: 지정한 클래스의 패키지를 탐색 시작 위치로 지정함@ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 됨⭐️ 권장하는 방법
패키지 위치를 지정하지 않고, 설정 정보 클래스 위치를 프로젝트 최상단에 두는 것
스프링 부트도 이 방법을 기본으로 제공함 (
@SpringBootApplication)컴포넌트 스캔 기본 대상
@Component: 컴포넌트 스캔에서 사용@Controller: 스프링 MVC 컨트롤러에서 사용Service: 스프링 비즈니스 로직에서 사용 (별다른 기능은 없음)Repository: 스프링 데이터 접근 계층에서 사용Configuration: 스프링 설정 정보에서 사용필터
includeFilters: 컴포넌트 스캔 대상을 추가로 지정excludeFilters: 컴포넌트 스캔에서 제외할 대상을 지정컴포넌트 스캔 대상에 추가할 애노테이션과 제외할 애노테이션으로
MyIncludeComponet와MyExcludeComponent를 만들어주고 각각BeanA는 추가,BeanB는 제외해준다.설정 정보와 전체 테스트 코드
BeanA는 등록,BeanB는 제외된 것을 확인할 수 있다.FilterType 옵션
주로 기본값인
ANNOTATION을 사용한다. (따로 명시해주지 않아도 됨)중복 등록과 충돌
자동 빈 등록 vs 자동 빈 등록
ConflictingBeanDefinitionException예외 발생수동 빈 등록 vs 자동 빈 등록
이 경우 수동 빈 등록이 우선권을 가진다 (수동 빈이 자동 빈을 오버라이딩함) - 에러는 발생하지 않음
개발자가 일부러 의도해서 이런 상황이 만들어지기 보다는 현실에서는 여러 설정들이 꼬여서 이런 경우가 발생하기 때문에 최근 스프링부트에서는 스동 빈 등록과 자동 빈 등록이 충돌나면 그냥 오류가 발생하도록 기본 값을 바꾸었다.
수동 빈 등록, 자동 빈 등록 오류시 스프링 부트 에러
onsider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=trueAll reactions