728x90
1. 스프링 빈 등록하는 2가지 방법
- 컴포넌트 스캔과 자동 의존관계 설정
- 자바 코드로 직접 스프링 빈 등록하기
2. 컴포넌트 스캔과 자동 의존관계 설정
2-1 컴포넌트 스캔을 통해 자동으로 스프링 빈 등록
🔍 정의
- 컴포넌트 스캔(Component Scan)이란, @Component 애노테이션을 가진 모든 대상을 빈으로 등록하기 위해 찾는 과정이다.
- 빈 설정 파일 또는 @Bean 애노테이션을 통해 빈을 하나하나 지정할 필요가 없다.
🔍 특징
- 빈 이름 기본 전략 : 가장 앞 문자를 소문자로 바꾼 것이 빈 이름이 된다.
- ex) MemberServiceImple → memberServiceImple
- 빈 이를을 수동으로 지정할 수 있다.
- @Component("지정할_이름")
- 기본적인 컴포넌트 스캔 대상
- @Component : 컴포넌트 스캔에서 사용
- @Controller : 스프링 MVC 컨트롤러에서 사용
- @Service : 스프링 비즈니스 로직에서 사용
- @Repository : 스프링 데이터 접근 계층에서 사용
- @Configuration : 스프링 설정 정보에서 사용
- 컴포넌트 스캔 범위
- @ComponentScan 애노테이션이 있는 파일의 패키지 아래를 찾는다.
- 스프링 부트에서는 @SpringBootApplication 애노테이션이 @ComponentScan 애노테이션을 포함하고 있어서 @SpringBootApplication 애노테이션이 있는 파일의 패키지 아래를 찾는다.
- basePackages 또는 basePackageClasses 로 스캔 범위를 따로 지정 가능하다.
- 권장 방법 : @ComponentScan 애노테이션이 있는 파일을 프로젝트 폴더의 최상단에 둘 것
- 스프링 부트를 사용하면 @SpringBootApplication 애노테이션이 있는 파일이 자동으로 프로젝트 폴더의 최상단에 위치하고 있다.
- @ComponentScan 애노테이션이 있는 파일의 패키지 아래를 찾는다.
🔍 주의할 점
- DiscountPolicy 인터페이스를 상속 받는 RateDiscountpolicy 클래스와 FixDiscountpolicy 클래스가 있을 때, 둘 중 내가 사용할 것만 빈에 등록해야하기 때문에 한 곳에만 @Component 애노테이션을 붙여야한다.
- 아니면 두 클래스에 모두 @Component 애노테이션을 붙이고 @Qulifier 또는 @Primary를 사용해서 우선순위를 지정할 수 있다.
- 수동 빈 등록 vs 자동 빈 등록
- 자동으로 빈을 등록한 상태에서 수동 등록 파일과 이름이 겹칠 경우에는 수동 빈 파일이 우선권을 가진다.
- 그러나 최근 스프링 부트에서는 빈 이름 중복시 오류로 처리하고 있다.
2-2 자동 의존 관계 설정 (Auto Dependency Injection)
🔍 정의
- 의존관계 주입을 스프링 컨테이너에서 등록된 빈을 찾아서 설정하는 방법이다.
🔍 설명
- 스프링 빈 설정 파일이 없어진다면 해당 파일에서 해주던 의존관계 주입을 해주는 것이 필요하다.
- @Autowired 애노테이션을 사용하면 된다.
🔍 원리
- 스프링 컨테이너가 @Component 애노테이션을 찾아서 모두 스프링 빈으로 등록한다.
- 의존성이 필요한 부분에서 @Autowired 애노테이션이 있다면 등록된 스프링 빈에서 찾아서 의존관계를 주입해준다.
참고) 스프링 컨테이너는 빈을 싱글톤으로 관리한다.
- 스프링에 스프링 빈을 등록할 때 기본으로 싱글톤으로 등록한다.
- 따라서 같은 스프링 빈이면 모두 같은 인스턴스다.
- 설정으로 싱글톤이 아니게 설정할 수 있지만, 특별한 경우를 제외하면 대부분 싱글톤을 사용한다.
3. 자바 코드로 직접 스프링 빈 등록하기
- 메서드 위에 @Bean 애노테이션을 붙여 빈을 수동으로 등록한다.
👀 참고 자료
728x90
'[ Spring ] > Spring 입문' 카테고리의 다른 글
[Spring 입문] 회원 관리 예제 (0) | 2022.02.14 |
---|---|
[Spring 입문] 스프링 웹 개발 기초 (정적 컨텐츠, MVC와 템플릿 엔진, API) (0) | 2022.02.13 |
[Spring 입문] Welcom page 만들기 (0) | 2022.02.12 |
[Spring] 스프링 부트 프로젝트 생성 (0) | 2022.02.12 |