Spring - IoC (제어의 역전)

hisungmi·2024년 12월 18일

Java-Spring

목록 보기
2/8
post-thumbnail

IoC - 제어의 역전 (Inversion of Control)

💡프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 
  제어의 역전이라고 한다.
  

실생활 예시1

운전을 직접 한다. ➡️ 운전자는 운전에 관한 모든 제어를 담당한다.
택시, 대리기사 ➡️ 운전에 대한 제어가 승객에서 운전기사로 역전이 됨

소프트웨어에서 IoC

1. 강한 결합도

  • 하나의 결합도는 하나의 객체가 변경될 때 다른 객체에도 영향을 미침
  • 개발자가 객체를 직접 생성하고 관리하기 때문에 객체를 변경할 경우 사이드 이펙트가 발생할 가능성이 높음
  • 객체가 서로 밀집하게 연결되어 있어 객체를 분리해서 재사용 어려움

2. 유연성의 부족

  • 소프트웨어 개발에서 유연성이라는 것은 코드를 쉽게 변경하거나 확장할 수 있는 능력을 의미함
  • 직접 객체를 관리할 시 특정 서비스나 컴포넌트의 구현이 변경될 경우 관리하고 있는 모든 객체들이 영향을 받게 됨

3. 테스트 어려움

  • 객체를 직접 제어해서 의존성을 관리하기 때문에 테스트 시 의존성을 모의 객체나 스텁으로 교체하기 어려울 수 있음
  • 테스트를 위해 의존성을 분리하는 것이 매우 복잡하고 어려움

적용 예시

적용 x

  • 일반적인 상황에서 개발자가 직접 객체 제어
  • new를 통해 객체 생성, 각 객체에 대한 라이프사이클을 직접 관리

적용 o

  • @Autowired 어노테이션을 통해 의존성 주입
  • Snack 클래스가 Juice 객체를 직접 생성하는 것이 아닌, 외부에서 주입받아 사용하게 됨

Spring IoC 컨테이너와 Bean

Bean : Spring IoC Container가 관리하는 객체
BeanFactory : Bean들의 생명 주기를 관리한다는 의미
Spring Container : 객체의 생명주기를 관리하며, 제어의 역전을 통해 스프링 컨테이너 안에서 관리되는 Bean의 생명 주기를 관리

컨테이너

💡 Bean 객체들을 설정 파일에서 읽어서 관리하고, 사용자 대신 프레임워크 측면에서 
  객체들을 생성하거나 주입하는 컨테이너

💡 Spring에 의해 생성되고 관리되는 자바 객체
  • 의존성 관리가 용이
  • 스프링 컨테이너가 객체 인스턴스를 싱글톤 방식으로 관리

스프링 컨테이너 종류

interface
BeanFactoryBean을 등록하고 객체 생성, 조회, 호출 등의 다양한 기능을 담당
BeanFactoryBean의 정의는 즉시 로딩해 오지만
Bean이 사용되기 전 까지는 인스턴스화 하지 않는다.
getBean() 메소드를 통해 호출되면, BeanFactory는 의존성 주입을
통해 Bean을 인스턴스화 하고 Bean의 특성을 설정하기 시작한다.
• 즉, 해당 시점부터 Bean의 생명이 시작된다.
ApplicationContextApplicationContextBeanFactory를 상속해 확장한 컨테이너
• 하는 역할은 BeanFactory와 동일하며, 추가로 스프링이 제공하는
여러 부가 기능을 제공한다. (Transaction 관리, AOP 처리 등)
ApplicationContextBeanFactory와는 달리 초기화 시점에
Bean을 생성해 두기 때문에 Bean이 필요할 때 즉시 사용할 수 있다.

애플리케이션 컨텍스트의 시작과 종료 과정

🫨 애플리케이션 컨텍스트의 실행 시점

  1. 스프링 부트스트랩 클래스의 main() 메소드 호출

    • SpringApplication 클래스의 run() 메소드가 호출됩니다.
    • run() 메소드는 애플리케이션 컨텍스트를 생성하고 초기화합니다.
  2. 애플리케이션 컨텍스트 초기화

    • 객체 생성 및 의존성 주입
    • 객체의 초기화 메소드 호출
    • 애플리케이션 설정 및 환경 설정 로드
  3. 애플리케이션 컨텍스트 시작

    • 컨테이너에 등록된 모든 객체가 사용 가능하게 됩니다.
    • 애플리케이션 서버가 시작되고 요청을 처리할 준비가 됩니다.

🫨 애플리케이션 컨텍스트 종료 시점

  • 애플리케이션 서버가 종료될 때

    • SpringApplication 클래스의 close() 메소드 호출
    • ApplicationContext 인터페이스의 close() 메소드 호출
  • 애플리케이션 컨텍스트 종료 시 수행 작업

    • 객체 소멸
    • 컨테이너 리소스 해제

빈을 컨테이너에 등록하는 방법

1.@Bean 이용하기

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

profile
난 성미다.

0개의 댓글