Spring의 제어의 역전을 배우면 빠질 수 없는게 Bean이다.
어제 프로젝트를 만들며 DI를 사용했는데 DI를 사용하기 위해서는 객체 생성이 우선 되어야 했다.
어 근데 왜 됐지? 객체 생성을 먼저 안 해줬는데 내 프로젝트는 왜 돌아갔을까?
Spring 프레임워크가 필요한 객체를 생성하고 관리하는 역할을 대신 해준다.
- 빈 (Bean): Spring이 관리하는 객체(POJO)
- Spring IoC 컨테이너: 'Bean'을 모아둔 컨테이너
Spring에서 Bean으로 등록하는 방법은
'@Component', '@Controller', '@Service', '@Repository'
등의 어노테이션을 클래스 위에 붙여서 등록한다.
그러면 스프링이 실행 될 때, 스프링은
@ComponentScan에 설정해 준 packages 위치와 하위 packages 들을 전부 확인하여 위와 같은 어노테이션이 설정된 클래스들을 'Bean'으로 등록해준다.
@ComponentScan은 @SpringBootApplication에 default 어노테이션으로 등록되어 있다.
Spring 'Bean' 사용 방법
- @Autowired
- 필드 위에 @Autowired
- Spring에서 IoC 컨테이너에 저장된 repository 'Bean'을 해당 필드에 DI 즉, 의존성을 주입 해준다.
- 필드 위에 @Autowired
@Service public class Service {
@Autowired
private Repository repository;
// ...
}
- 'Bean'을 주입할 때 사용할 메서드 위에 @Aurowired
- 객체의 불변성을 확보할 수 있기 때문에 일반적으로는 생성자를 사용하여 DI 하는 것이 좋다
- 현업에서는 거의 생성자 주입으로 사용하고 있다고 한다.
- set... Method를 만들고 @Autowired를 적용하여 DI 할 수도 있다.
- 이건 불안정하기에 추천하지 않는 방식이라고 한다.
- 객체의 불변성을 확보할 수 있기 때문에 일반적으로는 생성자를 사용하여 DI 하는 것이 좋다
@Service
public class Service {
private final Repository repository;
@Autowired
public MemoService(Repository repository) {
this.repository = repository;
}
// ...
}
- @Autowired 생략 조건
- Spring 4.3 버전 부터 생략 가능
- 생성자가 한 개 일 때만 생략이 가능하다
- ApplicationContext
- ApplicationContext는 BeanFactory등을 상속하여 기능을 확장한 Container 다.
- BeanFactory는 ‘Bean’ 의 생성, 관계설정등의 제어를 담당하는 IoC 객체다.
- 이걸 활용해서 수동으로 Bean을 가져올 수 있다.
- ApplicationContext는 BeanFactory등을 상속하여 기능을 확장한 Container 다.
@Service
public class Service {
private final Repository repository;
public Service(ApplicationContext context) {
// 1.'Bean' 이름으로 가져오기
Repository repository = (Repository) context.getBean("repository");
// 2.'Bean' 클래스 형식으로 가져오기
// Repository repository = context.getBean(Repository.class);
this.repository = repository;
}
...
}
아~~
스프링이 시작 될 때 Component 어노테이션으로 등록된 애들을 찾아서
객체로 만들고 그걸 'Bean' 이라는 이름으로 IoC 컨테이너에 저장하고 쓰는구나~~
디스패처 서블릿은 이렇게 등록된 Bean들 중에서 HTTP 요청을 처리할 적절한 컨트롤러를 찾아 핸들러 메소드에 연결하는 역할을 담당하는구나~~
로 요약하면 될 거 같다
지금 요약 해보니 이거 TIL 상단에 적으면 되게 좋을 거 같은 느낌..?
'TIL' 카테고리의 다른 글
TIL 2023-11-09 nullable = false 설정 했는데도 빈 값이 들어갈 때 (0) | 2023.11.09 |
---|---|
TIL 2023-11-08 영속성 컨텍스트, Jpa의 트랜잭션 (0) | 2023.11.08 |
TIL 2023-11-06 개인프로젝트 완성 및 3 레이어 아키텍처 (0) | 2023.11.06 |
TIL 2023-11-03 다형성 업 캐스팅 다운 캐스팅 참조 변수 완벽 이해 (0) | 2023.11.03 |
TIL 2023-11-02 Path Variable, Request Param, Model Attribute, Request Body (0) | 2023.11.02 |