티스토리 뷰
스프링 빈
스프링 IoC 컨테이너에 의해 자바 객체가 만들어지게 되는데, 이 객체가 스프링 빈이다. 컨테이너에 의해 빈은 인스턴스화되어 조립되거나 관리된다. 즉, 개발자가 작성한 코드를 컨테이너가 스스로 참조한 뒤 알아서 객체의 생성과 소멸을 컨트롤해준다. 개발자는 싱글톤 패턴으로 인스턴스화된 객체를 재사용하게 된다. new 연산자로 만들어진 것은 Bean이 아니다.
빈과 빈 사이의 의존성은 컨테이너가 사용하는 메타데이터 환경설정에 반영된다.
빈을 등록하는 방법
스프링 빈을 등록하기 위해서는 @Component, @Controller, @Service, @Repository, @Configuration, @Bean 과 같은 어노테이션을 사용하여 등록할 수 있는데, @Controller, @Service, @Repository는 모두 @Component를 상속받고 있으며, 해당 어노테이션으로 등록된 클래스들은 스프링 컨테이너에 의해 자동으로 생성되어 빈으로 등록된다(컨테이너는 @Component가 달린 클래스를 Component Scan을 통해 등록한다. 참고로, main 이 있는 하위 패키지만 뒤진다. 물론 이것은 설정으로도 변경 가능하다).
1) @Component: Class 위에 작성할 수 있다. 이름을 명시하지 않을 경우 소문자로 시작하는 클래스 이름이 자동으로 사용된다.
소스가 변경될 일이 없는 경우에 주로 활용한다. 예를 들어 컨트롤러나 서비스, 리포지터리는 한 번 만들어놓고 변경할 일이 거의 없다.
@Component
public class Search extends NaverShopSearch {
public String search(String query) { ... }
}
2) @Bean: 개발자가 직접 컨트롤이 불가능한 외부 라이브러리를 등록하고 싶을 때, @Configuration 어노테이션과 함께 사용하여 등록이 필요하다는 것을 알려준다. Class에는 선언이 불가능하고 메서드 상단에 써준다. 이름을 명시하지 않을 경우 소문자로 시작하는 메서드 이름이 자동으로 사용된다.
@Configuration
public class NaverShopSearch {
@Bean
@Primary
public String search(String query) {...}
}
소스가 변경될 가능성이 있다면, Config 파일을 별도로 만들어서 Configuration-Bean을 활용한다.
등록된 빈을 사용하는 방법
- @Autowired: 빈 객체를 특정 참조변수에 매핑할 때 사용한다. 생성자, Setter, 필드 주입 세 가지 방식이 있다. 이것이 가능한 이유는 컨테이너에 빈이 등록되어 있기 때문이다. 컨테이너에서 인스턴스화된 빈을 알아서 주입해준다(DI).
- @Qualifier: 어떤 빈을 사용할지 정할 때 사용한다. 만약 동일한 인터페이스/클래스를 상속한 클래스가 두 개 있고, 각각 컴포넌트로 명시했다면, 참조변수는 어떤 객체를 참조해야 할지 몰라 에러를 발생시킬 것이다. 이때 참조변수의 상단에 이 어노테이션을 써준다.
@Autowired
@Qualifier("NaverShopSearch")
Search search;
- @Primary: 클래스 상단에 사용하여 동일한 클래스가 여러 개 있을 때 어떤 것을 참조해야 할지 우선순위를 정해준다. 만약 @Autowired와 함께 쓰였다면 @Autowired가 우선한다.
@Component
@Primary
public class Search extends NaverShopSearch {
public String search(String query) { ... }
}
'TIL' 카테고리의 다른 글
| [Spring] Controller, Service, Repository & Spring MVC (0) | 2022.05.26 |
|---|---|
| [Spring Boot] IoC, DI, 컨테이너 (0) | 2022.05.23 |
| [WIL] 둘째주 회고 - 자바 & 스프링 공부 (0) | 2022.05.22 |
| [Spring Boot] JPA Repository (0) | 2022.05.22 |
| [Spring Boot] Controller & RestController (0) | 2022.05.20 |
- Total
- Today
- Yesterday
- 상속
- 항해99
- AssertJ
- AfterEach
- IOC
- bean
- ResetController
- toCharArray
- 패키지
- 제어자
- 배열
- 고민
- Java
- OneToMany
- MVC
- ManyToOne
- 자바의정석
- DI
- controller
- 서버환경
- ManyToMany
- clean-up policy
- 스프링부트
- 단항연산자
- 임포트
- overfatching
- 몽고db
- jinja2
- ORM
- GIT
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
