티스토리 뷰
● Spring bean을 등록하는 방법
1. @Configuration & @Bean : 외부 라이브러리, 프레임워크 등에서 만든 class를 등록할 때 사용
- JdbcTemplate은 외부 라이브러리이기에 @Configuration과 @Bean을 이용해 Spring bean으로 등록돼었다.
(1). @Configuration
- class에 붙이는 Annotaion
- @Bean을 사용할 때 함께 사용해 주어야 한다.
(2). @Bean
- 메소드에 붙이는 Annotaion
- 메소드에서 반환되는 객체를 Spring bean으로 등록한다.
ex) UserRepository에 @Bean을 사용해보자
cf) 보통 @Configuration Annotaion은 config package 안에 넣어둔다.
2. @Service, @Repository 같은 Annotaion : 개발자가 직접 만든 class를 spring bean 으로 등록할 때 사용
- UserRepository, UserService class는 직접 만든 class이기에 @Service, @Repository 같은 Annotaion을 이용해야한다.
- 위의 UserRepository에 대한 @Configuration & @Bean 예시는 보여주기 위해 일부러 수정한 것이다.
3. @Component
1) Controller, Service, Repository가 모두 아니고
2) 개발자가 직접 작성한 class를 Spring bean으로 등록할 때 사용되기도 한다.
- 주어진 class를 '컴포넌트'로 간주한다.
- 컴포넌트로 간주되는 class들은 스프링 서버가 뜰 때 자동으로 감지되서 스프링 컨테이너에 bean으로 등록된다.
- @Component Annotation은 @RestController, @Controller, @Service, @Repository 같은 Annotation 안에 숨어있다.
- 즉, 숨어있는 @Component Annotation 덕분에 @Controller, @Service, @Repository 같은 Annotation 들이 자동으로 감지되어 Spring bean 으로 등록됐던 것이다.
● Spring bean을 주입 받는 방법(가져오는 방법)
1. 생성자를 이용해 주입받는 방식(가장 권장)
- 이전 글에서는 생략했는데 원래는 생성자 위에 @Autowired Annotation을 붙여야한다.
- 근데 Spring version이 업데이트 되면서 굳이 붙이지 않아도 생성자 방식 일때는 알아서 넣어준다.
@Autowired
- 해당 Annotation이 붙은 생성자에 있는 파라미터(매개변수)에 Spring bean을 집어넣으라는 의미
- 자동(Auto)으로 연결(wired)시키라는 의미
2. setter & @Autowired
3. 필드에 직접 @Autowired 사용
[생성자 사용이 가장 권장되는 이유]
1. setter 방식 : 누군가 setter 메소드를 사용하면 오작동할 수 있다.
2. 필드에 직접 사용하는 방식 : 테스트를 어렵게 만드는 요인이다.
4. @Qualifier
- UserController가 있고 거기에서 FruitService interface를 사용중이다.
- 이때 FruitService interface를 3가지 Service가 모두 구현중인 상태이다.
- 이중 UserController가 AppleService, BananaService, OrangeService 중 어떤 것을 주입받을지 어떻게 설정할 수 있을까?
- 이런 경우에 @Qualifier를 사용할 수 있다.
- AppleService를 주입받는다고 하면 아래와 같이 설정할 수 있다.
- 즉, @Qualifier Annotation은 여러 개의 후보군 중 하나를 특정해서 가져올 때 사용할 수 있다.
- 다른 방식으로도 @Qualifier Annotation을 사용할 수 있다.
cf) 반드시 main 이라는 단어를 사용할 필요는 없다. Controller와 Service에서 동일한 단어만 사용하면 된다.
- Spring bean을 사용하는 쪽, Spring bean을 등록하는 쪽 모두 @Qualifier를 사용할 수 있다.
- Spring bean을 사용하는 쪽에서만 쓰면 bean의 이름을 적어주어야 한다. → AppleService
- 양쪽 모두 사용하면 @Qualifier 끼리 연결된다 → BananaService
● @Primary vs @Qualifier
Q. 만약 BananaService에는 @Qualifier를 사용하고 OrangeService에는 @Primary를 사용하면 둘 중에 어느 것을 가져올까?
A.
- 사용하는 쪽에서 직접 적어준 @Qualifier를 가져온다.
- 즉, @Primary와 @Qualifier 중 우선 순위는 @Qualifier가 더 높다는 것이다.
cf) Spring은 일반적으로 사용자가 특수하게 직접 명시한 것에 우선순위를 더 높게 둔다.
'Backend > Spring' 카테고리의 다른 글
#23 Entity Class (0) | 2023.09.10 |
---|---|
#22 JPA - 등장 (0) | 2023.09.05 |
#20 Spring Container 사용 이유 with @Primary, IoC, DI (0) | 2023.08.31 |
#19 UserController & 스프링 컨테이너 with @RestController (0) | 2023.08.28 |
#18 Clean Code - Controller, Service, Repository 분리 (0) | 2023.08.24 |
- Total
- Today
- Yesterday
- 자료구조
- SQL
- 알고리즘
- Advanced Stream
- Spring Boot
- java
- API
- MySQL
- 코테
- 프로그래머스
- DART
- node.js
- 운영체제
- 빅데이터
- spring
- Stream
- git
- MongoDB
- Java8
- OS
- 빅데이터 분석기사
- SpringBoot
- jpa
- 메모리
- nosql
- 코딩테스트
- db
- 프로세스
- Phaser
- Phaser3
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |