IoC(제어의 역전)
- 기존의 프로그램, 개발자들은 스스로 객체를 생성하고 메소드를 호출하며
의존관계가 필요한 것들을 일일히 넣어줌
-> 개발자가 모든 흐름을 제어하는 방식
- 문제점
- 개발자가 모든 것을 제어하기 때문에 실수가 일어나기 쉬움
- 의존관계가 복잡한 객체는 변경이 있을 때 파급 효과가 커짐
- IoC?
- 프로그램에서 필요한 객체를 생성하고 메소드를 호출하는 등의 작업을
외부에서 해주는 방식
- IoC 컨테이너에서 객체에 대한 생성 및 생명주기, 의존성을 관리
- 개발자가 프레임워크에 필요한 부분을 개발하고, 조립하면 프레임워크
내부에서 정해진대로 흐름을 이어나간다.
DI(의존성 주입)
- 구성요소 간의 의존 관계가 소스 코드 내부에서가 아닌 설정을 통해 외부에서 정의되는 방식
- 즉, 의존적인 객체를 직접 생성하거나 제어하는 것이 아니라 특정 객체에 필요한 객체를 외부에서 결정하여 연결
- 이 설정 정보를 바탕으로 컨테이너가 의존관계로 이루어진 객체들을 연결하고
필요한 객체는 개발자가 컨테이너로부터 받아서 사용한다.
Spring bean
- 스프링 컨테이너에서 관리되는 자바 객체
- 스프링 컨테이너는 싱글톤 컨테이너!
-> 호출 될 때마다 다른 객체를 생성해 주는 것이 아니라, 같은 객체(공유 객체)를 생성하여 사용한다
-> 공유 객체를 사용하기 때문에 무상태로 설계해야 한다!!
(특정 클라이언트가 값을 변경할 수 있는 필드가 존재해선 안된다)
- 등록 방식
- @Component & @ComponentScan
- @Component: Bean으로 등록할 클래스
- @ComponentScan: 어느 지점부터 Component를 찾을지 결정
- @Configuration & @Bean
- @Configuration이 있는 설정 파일 내에 @Bean을 통해 등록