1. IoC
1-1) IoC 개념
Inversion of Control, 의존 관계 주입(Dependency Injection)이라고도 하며
어떤 객체가 사용하는 의존 객체를 직접 만들어 사용하는 게 아니라
주입 받아 사용하는 방법을 말함.
1-2) Spring IoC Container
BeanFactory
애플리케이션 컴포넌트의 중앙 저장소
빈 설정 소스로부터 빈 정의를 읽어들이고, 빈을 구성하고 제공함.
1-3) Bean
Spring IoC Container가 관리하는 객체
1-3)-1. Bean의 장점
의존성 관리
스코프
→ 싱글톤 : 하나만
→ 프로토타입 : 매번 다른 객체 생성하는 타입
라이프사이클 인터페이스
→ 쉽게 여러 시점에 접근 가능함.
1-4) Application Context
BeanFactory
메시지 소스 처리 기능(i18n)
이벤트 발행기능
리소스 로딩 기능
...
2. Bean 구별
2-1) Class Book의 경우
→ Bean이 아님. → Getter와 Setter가 있기 때문에 → 'Java Bean'이라고는는 부를 수는 있음
2-2) Class BookRepository
→ Bean임. @Repository라는 에노테이션을 붙였기 때문에 → Auto Scan을 통해 Bean으로 등록됨. → 의존성 주입을 하고 싶으면 Bean이 되어야 함.
2-3) Class BookService
→ Bean임. 의존성 주입을 하고 싶으면 Bean이 되어야 함. → BookService를 여러 개 만들어서 사용할 필요가 없음. → 싱글톤(Click)으로 객체를 만들어 관리하고 싶을 때 Spring IoC를 만들어서 관리함. → 기본적으로 싱글톤 Scope로 Bean 등록됨.
2-3)-1. 의존 객체를 직접 만들어서 사용하는 경우
→ 의존 객체를 직접 만들어서 사용하지 않는 게 좋음.
2-3)-2. IoC 의존 관계 주입을 한 경우
→ 의존 관계 주입은 직접 생성하는 것이 아닌 어떤 장치(생성자)를 사용해 주입을 받아서 사용함.
2-4) enum BookStatus
3. IoC Container를 사용하는 이유?
여러 개발자들이 커뮤니티에서 논의하여 만들어낸 다양한 Dependency Injection 방법과
Best Practice, Know-How가 쌓여있는 프레임워크이기 때문임.
IoC 기능을 제공하는 빈을 담고 있기 때문에 컨테이너라고 불리며
빈(Bean, 컨테이너 내부에 들어있는 객체)과 컨테이너에 대한 설계를 할 때
아주 많은 개발자들의 의견을 바탕으로 만들어졌음.
초기에는 Xml이 대세였지만 개발자들의 의견을 수렴해 구글 주스(Google Gucie)가
처음 선보인 어노테이션기반의 Dependency Injection을 지원하기 시작했음.
현재는 @Service, @Repository, @AutoWired와 같은 어노테이션을 사용해
객체를 빈으로 등록할 수도 있고, 빈에 등록이 되어있는 객체를 손쉽게 주입받아 사용할 수 있음.