Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 개발
- StringBuffer
- lombok
- java
- Spring
- 아스키코드
- repository
- 삼행시
- Annotation
- CS
- 윤동주
- 어노테이션
- string
- bit
- 백엔드
- Controller
- 스프링
- replace()
- 문자열
- Service
- 이행시
- 항해
- yeouido
- StringBuilder
- upc
- 자바
Archives
- Today
- Total
Dev.끄적끈적
Bean과 스프링 IoC 컨테이너 본문
- 빈 (Bean): 스프링이 관리하는 객체
- 스프링 IoC 컨테이너: 'Bean' 을 모아둔 통
스프링 IoC 컨테이너가 관리하는 객체들을 Bean 이라고 부릅니다. 스프링은 이러한 Bean들의 의존성을 관리하고, 객체를 만들어 주며, Bean으로 등록을 해 주고, 이렇게 만들어진 것들을 관리합니다. 개발자가 이 부분까지 신경쓰지 않아도, 프레임워크가 알아서 해 주는 것입니다.
그리고 스프링 IoC 컨테이너가 위와 같은 관리를 해 줍니다. 이러한 Bean들을 담고 있는 스프링 IoC 컨테이너는 두 가지 중 하나를 사용합니다.
- ApplicationContext 혹은 BeanFactory
- ApplicationContext는 BeanFactory를 상속받으므로 둘 다 같은 일을 하는 것임
이러한 스프링에서의 의존성 주입은 반드시 Bean으로 등록된 객체들 끼리만 가능합니다. 스프링 IoC 컨테이너는 Bean으로 등록되지 않은 객체에는 의존성 주입을 해 주지 않습니다.
- IntelliJ 에서는 Bean 인 경우 아래 사진처럼 왼쪽에 아이콘으로 표시해 줍니다.
- 위에서 예시를 들었듯, OwnerController 생성자에서 의존성 주입이 일어나고 있습니다.
- 그러면 OwnerController, OwnerRepository 모두 Bean이어야 할 것입니다.
Bean으로 등록하는 방법은?
Component Scanning
- @Component Annotation을 활용합니다.
- 개발자가 직접 작성한 Class를 Bean으로 등록해줄 때 사용합니다.
- 여러 인터페이스들을 라이프사이클 콜백이라고 부르는데, @Component 어노테이션이 붙어 있는 모든 클래스들을 찾아, 그 클래스의 인스턴스를 만들고, Bean으로 등록해 주는 복잡한 작업을 하는 어노테이션 처리기가 스프링에 있습니다.
Bean 사용방법;
- @Autowired
- 멤버변수 선언 위에 @Autowired → 스프링에 의해 DI (의존성 주입) 됨
@Component
public class ProductService {
@Autowired
private ProductRepository productRepository;
// ...
}
- @Autowired 적용 조건
- 스프링 IoC 컨테이너에 의해 관리되는 클래스에서만 가능
- Lombok 의 @RequiredArgsConstructor 를 사용하면 다음과 같이 코딩 가능
@RequiredArgsConstructor // final로 선언된 멤버 변수를 자동으로 생성합니다.
@RestController // JSON으로 데이터를 주고받음을 선언합니다.
public class ProductController {
private final ProductService productService;
// 생략 가능
// @Autowired
// public ProductController(ProductService productService) {
// this.productService = productService;
// }
}
2. ApplicationContext
- 스프링 IoC 컨테이너에서 빈을 수동으로 가져오는 방법
@Component
public class ProductService {
private final ProductRepository productRepository;
@Autowired
public ProductService(ApplicationContext context) {
// 1.'빈' 이름으로 가져오기
ProductRepository productRepository = (ProductRepository) context.getBean("productRepository");
// 2.'빈' 클래스 형식으로 가져오기
// ProductRepository productRepository = context.getBean(ProductRepository.class);
this.productRepository = productRepository;
}
// ...
}
'Spring' 카테고리의 다른 글
AOP 란? (0) | 2022.06.16 |
---|---|
JPA의 이해 (0) | 2022.05.17 |
DI (의존성 주입) 의 이해 (0) | 2022.03.27 |
Controller, Service, Repository 역할, 분리 (0) | 2022.03.27 |
리팩토링이란? (0) | 2022.03.27 |