스프링 프레임워크 핵심 기술
강의 기록
IOC 1부
Bean이란 IoC 컨테이너가 관리하는 객체
Bean으로 등록하는 이유는?
- 의존성 주입을 하기 위해, 또 받기 위해 (의존성 관리)
- 빈의 Scope 때문.
- 싱글톤 관리 (빈에 등록될 때 기본적으로 싱글톤 Scope으로 등록됨)
- 프로토타입 ( 매번 다른 객체로 등록)
- 라이프 사이클 인터페이스
- ex. 객체 생성 때 뭔가 실행 (@PostConstruct)
IOC 2부
Bean은 어떻게 등록하는가?
- xml 파일에 하나하나 등록 (불편)
- bean-scanning을 xml에 등록해서 context를 scan 하기 (@Component + @Autowired)
- xml -> 자바 파일로 바꾸자! @Configuration에 Bean을 등록
- 마찬가지로 @ComponentScan 으로 스캔 기능 추가
- 그 자바 파일도 없애서, @SpringBootApplication을 붙이면, 그 파일 역할을 해줌 (Spring boot)
IOC 3부
@Autowired
Bean에 등록하고 DI를 하는 방법
1. 생성자로 받는다. (@Autowired, Bean 등록하면 문제없음)
2. setter로 받는다.
- bookRepository가 bean이 아니어도, 생성이 가능해야하지만
@autowired가 있으면 실패함. (required = false
하면 실행가능)
- bookRepository implement가 두개라면?
=> Error (어떤건지 알 수 없음)
=> 3가지 action 가능 (@Primary, Qulifier, 모두 주입받기)
++ specificBookRepository라고 이름을 명시하면 이름이 같은걸 주입해주긴 함 (비추)
Bean 라이프사이클
@BeanPostProcessor (Bean 등록 이후 작업을 처리해주는?)
새로 만든 빈 인스턴스를 수정할 수 있는 라이프사이클 인터페이스
AutowiredAnnotationBeanPostProcessor extends BeanPostProcessor
스프링이 제공하는 @Autowired와 @Value 애노테이션 그리고 JSR-330의 @Inject 애노테이션을 지원하는 애노테이션 처리기
결국 스프링은 추상화의 산물이고, 현재 단계의 스프링을 이해하기 위해선 추상화의 역사를 알아야한다.
@Autowired는 해당 class가 빈으로 등록되어 있는지 확인하고, 자동으로 주입을 해준다.
이를 위해선 Bean으로 먼저 등록이 되어야하고
빈 등록은 xml or @Configuration 작성 => @Component 스캔으로 빈 등록을 하고
등록된 빈은, 자동 주입이 가능하다!