빈팩토리
오브젝트의 생성과 오브젝트 사이의 런타임 관계를 설정하는 DI 관점으로 볼 때는 컨테이너를 빈팩토리라고 한다.
애플리케이션 컨텍스트
빈 팩토리 + 엔터프라이즈 애플리케이션을 개발하는 데 필요한 여러 가지 컨테이너 기능을 추가한 것
이 둘은 각각 BeanFactory, ApplicationContext라는 두 개의 인터페이스로 정의되어 있다.
=> IoC 컨테이너라고 말하는 것은 이 ApplicationContext를 구현한 클래스 오브젝트
StatiAppicationContext ac = new StaticApplicationContext(); // ApplicationContext 인터페이스 구현한 클래스
책에서는 아래의 클래스를 생성
class Hello {}
interface Printer {}
class StringPrinter implements Printer {}
class ConsolePrinter implements Printer {}
POJO 클래스들 중에 애플리케이션에서 사용할 것을 선정하고 이를 IoC 컨테이너가 제어할 수 있도록 적절한 메타 정보를 만들어 제공하는 작업
스프링 컨테이너가 관리하는 오브젝트는 bean이라고 부른다.
설정 메타정보는 바로 이 빈을 어떻게 만들고 어떻게 동작하게 할 것인가에 관한 정보
BeanDefinition 인터페이스로 표현되는 순수한 추상정보다.
즉, 애플리케이션 컨텍스트는 바로 이 BeanDefinition으로 만들어진 메타정보를 담은 오브젝트를 사용해 IoC와 DI 작업을 수행한다.
따라서, 스프링의 메타 정보는 특정한 파일 포맷이나 형식에 제한되거나 종속되지 않는다.
IoC 컨테이너가 사용하는 빈 메타 정보
- 빈 아이디: 빈 오브젝트를 구분할 수 있는 식별자
- 클래스: 빈으로 만들 POJO 클래스 또는 서비스 클래스 정보
- 스코프: 싱클톤, 프로토타입과 같은 빈의 생성방식과 존재 범위
- 프로프티 값 또는 참조: DI에서 사용할 프로퍼티 이름과 값 또는 참조하는 빈의 이름
- 생성자 파라미터 값 또는 참조: DI에 사용할 생성자 파라미터 이름과 값 또는 참조할 빈의 이름
- 지연된 로딩 여부, 우선 빈여부, 자동와이어링 여부, 부모 빈 정ㅇ보, 빈팩토리 이름 등

StaticApplicationContext ac = new StaticApplicationContext();
ac.registerSingleton("hello1", Hello.class); // hell1이라는 이름의 싱클톤 빈으로 컨테이너 등록
// Ioc 컨테이너가 등록한 빈을 생성했는지 확인
Hello hello1 = ac.getBean("hello1", Hello.class);
assertThat(hello1, is(notNullValue());
BeanDefinition helloDef = new RootBeanDefinition(Hello.class);
helloDef.getPropertyValues().addPropertyValue("name", "Spring"); // 빈의 name 프로퍼티의 들어갈 값을 지정
ac.registerBeanDefinition("hello2", helloDef);
하지만 직접 구현할일은 없을 걳이다.. 보통 자동으로 만들어지는 방법을 사용하기 때문..
제일 많이 슨다.
웹 환경에서 사용할 때 필요한 기능이 추가된 애플리케이션 텍스트
어딘가 특정 빈 오브젝트의 메소드를 호출함으로써 애플리케이션을 동작시켜야 한다.
스프링 애플리케이션을 만들고 IoC 컨테이너를 직접 셋업했다면 빈을 가져와 기동하는 코드가 있어야한다. (getBean())
그 이후에는 필요없다. 알아서 연ㅇ결되어 있으므로
IoC컨테이너의 역할은 이렇게 초기에 빈 오브젝트를 생성하고 DI한 후 최초로 애플리케이션을 기동할 빈 하나를 제공해주는 것까지이다.
웹 애플리케이션은 독립 자바프로그램은 자바 vm 에게 main() 메소드를 가진 클래스를 시작시켜 달라고 요청할 수 있다.
웹 환경에서는 서블릿 컨테이너가 브라우저로부터 오는 HTTP 요청을 받아서 해당 요청에 매핑되어 있는 서블릿을 실행해주는 방식으로 동작한다. 서블릿이 일종의 main() 메소드와 같은 역할을 해줌

웹 애플리케이션 안에 WebApplicationContext 타입의 IoC 컨테이너를 둔다.
자바 서버에는 하나 이상의 웹 모듈을 배치해서 사용할 수 있다.
스프링은 보통 웹 모듈(WAR) 형태로 애플리케이션을 배포한다.
하나의 웹 애플리케이션은 여러 개의 서블릿을 가질 수 있다.
웹 요청을 한 번에 받을 수 있는 대표 서블릿을 등록해두고, 공통적인 선행 작업을 수행하게 한 후에, 각 요청의 기능을 담당하는 핸들러라고 불리는 클래스를 호출하는 방식이 일반적이다.
프론트 컨트롤러 패턴
몇 개의 서블릿이 중앙집중식으로 모든 요청을 다 받아서 처리하는 방식
서블릿 숫자는 3개 이하
웹 애플리케이션 안에서 동작하는 IoC 컨테이너는
WebApplicationContextUtils.getWebApplicationContext(SeveletContext sc)
빈스캐닝 : 특정 애노테이션이 붙은 클래스를 자동으로 찾아서 빈으로 등록
빈 스캐너: 스캐닝 작업 담당
스테레오타입 애노테이션
- @Component, @Component를 메타 애노테이션으로 가진 애노테이션
- @Repository
- @Service