빈(Bean)
- Spring이 관리하는 객체
Spring IoC 컨테이너
- 'Bean'을 모아둔 컨테이너
Spring Bean을 등록하는 방법
- @Component를 Bean으로 등록하려고 하는 클래스 위에 작성
- Bean의 이름은 클래스의 앞 글자만 소문자로 변경하여 저장
- 이때 제대로 Bean이 되었다면 커피콩 모양의 Bean 아이콘 생성
@ComponentScan Spring
- 서버가 뜰 때 @ComponentScan에 설정해 준 packages 위치와 하위 packages 들을 전부 확인하여 @Component가 설정된 클래스들을 ‘Bean’으로 등록해줌.
Spring 'Bean' 사용 방법
@Autowired
- 필드 위에 @Autowired
- Spring에서 IoC 컨테이너에 저장된 memoRepository ‘Bean’을 해당 필드에 DI 즉, 의존성을 주입해줌.
- 객체의 불변성을 확보할 수 있기 때문에 일반적으로는 생성자를 사용하여 DI 하는 것이 좋음.
- @Autowired 적용 조건 : Spring IoC 컨테이너에 의해 관리되는 클래스에서만 가능.
- Spring IoC 컨테이너에 의해 관리되는 ‘Bean’ 객체만 DI에 사용 가능.
- @Autowired 생략 조건 : 생성자 선언이 1개 일 때만 생략 가능.
3 Layer Annotation
- Spring 3 Layer Annotation은 Controller, Service, Repository의 역할로 구분된 클래스들을 ‘Bean’으로 등록할 때 해당 ‘Bean’ 클래스의 역할을 명시하기 위해 사용됨.
- @Controller, @RestController
- @Service
- @Repository
Bean 수동 등록
- @Component를 사용하면 @ComponentScan에 의해 자동으로 스캔되어 해당 클래스를 Bean으로 등록해줌.
- 일반적으로 @Component를 사용하여 Bean을 자동으로 등록하는 것이 좋음.
- 프로젝트의 규모가 커질수록 등록할 Bean들이 많아지기 때문에 자동등록을 사용하면 편리함.
- 비즈니스 로직과 관련된 클래스들은 그 수가 많기 때문에 @Controller, @Service와 같은 애너테이션들을 사용해서 Bean으로 등록하고 관리하면 개발 생산성에 유리함.
- Bean 수동 등록 사용 시점
- 기술적인 문제나 공통적인 관심사를 처리할 때 사용하는 객체들을 수동으로 등록하는 것이 좋음.
- 공통 로그처리와 같은 비즈니스 로직을 지원하기 위한 부가 적이고 공통적인 기능들을 기술 지원 Bean이라 부르고 수동등록함.
- 비즈니스 로직 Bean 보다는 그 수가 적기 때문에 수동으로 등록하기 부담스럽지 않음.
- 또한 수동등록된 Bean에서 문제가 발생했을 때 해당 위치를 파악하기 쉽다는 장점이 있음.
- 기술적인 문제나 공통적인 관심사를 처리할 때 사용하는 객체들을 수동으로 등록하는 것이 좋음.
- Bean 수동 등록 방법
- Bean으로 등록하고자 하는 객체를 반환하는 메서드를 선언하고 @Bean을 설정.
- Bean을 등록하는 메서드가 속한 해당 클래스에 @Configuration을 설정.
- Spring 서버가 뜰 때 Spring IoC 컨테이너에 'Bean'으로 저장됨.
같은 타입의 Bean이 2개 일 때
- 같은 타입의 Bean이 2개이면 Bean을 주입해줘야하는데 같은 타입의 Bean 객체가 하나 이상이기 때문에 어떤 Bean을 등록해줘야할지 몰라 오류가 발생함.
해결방법
- 등록된 Bean 이름 을 정확하게 명시하여 해결할 수 있음.
- @Primary가 추가되면 같은 타입의 Bean이 여러 개 있더라도 우선 @Primary가 설정된 Bean 객체를 주입 함.
- @Qualifier 사용하여 Bean으로 등록한 클래스와 주입하고자 하는 필드에 @Qualifier("사용할 Bean") 를 추가해주면 해당 Bean 객체가 주입 됨.
- 같은 타입의 Bean들에 Qualifier와 Primary가 동시에 적용되어있다면 Qualifier의 우선순위가 더 높음.
- 하지만 Qualifier는 적용하기 위해서 주입 받고자하는 곳에 해당 Qualifier를 반드시 추가해야함.
- 따라서 같은 타입의 Bean이 여러 개 있을 때는 범용적으로 사용되는 Bean 객체에는 Primary를 설정하고 지엽적으로 사용되는 Bean 객체에는 Qualifier를 사용하는 것이 좋음.
'🗂️ Study > 🌿Spring' 카테고리의 다른 글
Entity (0) | 2024.05.21 |
---|---|
JPA (0) | 2024.05.21 |
IoC(제어의 역전) & DI(의존성 주입) (0) | 2024.05.21 |
3 Layer Architecture (0) | 2024.05.21 |
JDBC (0) | 2024.05.21 |