
💡프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을
제어의 역전이라고 한다.
운전을 직접 한다. ➡️ 운전자는 운전에 관한 모든 제어를 담당한다.
택시, 대리기사 ➡️ 운전에 대한 제어가 승객에서 운전기사로 역전이 됨
1. 강한 결합도
2. 유연성의 부족
3. 테스트 어려움
new를 통해 객체 생성, 각 객체에 대한 라이프사이클을 직접 관리

@Autowired 어노테이션을 통해 의존성 주입
Bean:Spring IoC Container가 관리하는 객체
BeanFactory:Bean들의 생명 주기를 관리한다는 의미
Spring Container: 객체의 생명주기를 관리하며, 제어의 역전을 통해 스프링 컨테이너 안에서 관리되는Bean의 생명 주기를 관리
💡 Bean 객체들을 설정 파일에서 읽어서 관리하고, 사용자 대신 프레임워크 측면에서
객체들을 생성하거나 주입하는 컨테이너
💡 Spring에 의해 생성되고 관리되는 자바 객체

| interface | |
|---|---|
BeanFactory | • Bean을 등록하고 객체 생성, 조회, 호출 등의 다양한 기능을 담당• BeanFactory는 Bean의 정의는 즉시 로딩해 오지만 Bean이 사용되기 전 까지는 인스턴스화 하지 않는다. • getBean() 메소드를 통해 호출되면, BeanFactory는 의존성 주입을 통해 Bean을 인스턴스화 하고 Bean의 특성을 설정하기 시작한다. • 즉, 해당 시점부터 Bean의 생명이 시작된다. |
ApplicationContext | • ApplicationContext는 BeanFactory를 상속해 확장한 컨테이너 • 하는 역할은 BeanFactory와 동일하며, 추가로 스프링이 제공하는 여러 부가 기능을 제공한다. (Transaction 관리, AOP 처리 등) • ApplicationContext는 BeanFactory와는 달리 초기화 시점에 Bean을 생성해 두기 때문에 Bean이 필요할 때 즉시 사용할 수 있다. |
🫨 애플리케이션 컨텍스트의 실행 시점
스프링 부트스트랩 클래스의 main() 메소드 호출
run() 메소드가 호출됩니다.run() 메소드는 애플리케이션 컨텍스트를 생성하고 초기화합니다.애플리케이션 컨텍스트 초기화
빈 객체 생성 및 의존성 주입빈 객체의 초기화 메소드 호출애플리케이션 컨텍스트 시작
빈 객체가 사용 가능하게 됩니다.🫨 애플리케이션 컨텍스트 종료 시점
애플리케이션 서버가 종료될 때
close() 메소드 호출close() 메소드 호출애플리케이션 컨텍스트 종료 시 수행 작업
빈 객체 소멸1.@Bean 이용하기

수동등록 하려면 설정 클래스 파일을 만들어 @Configuration 어노테이션 적용
➡️ 해당 클래스 내부에서 빈으로 등록할 메서드에 대해 @Bean 어노테이션 적용
@Component 이용하기| 종류 | 설명 |
|---|---|
@Controller | 사용자로부터 요청이 들어오면 해당 업무를 처리하는 모델을 호출하고, 결과를 뷰에 전달하는 역할을 담당하는 컨트롤러 레이어에 적용된다. |
@Service | 사용자의 요구 사항을 처리하는 비지니스 로직을 작성하는 서비스 레이어에 적용된다. |
@Repository | 스프링 MVC 패턴에서 해당 클래스에 대해 Repository 역할을 적용하여 DB등의 외부 통신을 담당한다. |
@Configuration | 빈 등록을 위해 사용하는 애너테이션, 내부에는 @Component 가 내장되어있음 |
