새로운 내용을 공부할 때
새로운 내용의 공부를 시작할 때 용어의 정의를 이해하지 못하거나 정확하게 알지 못한다면 그 용어가 포함된 문장을 이해하지 못합니다.
작은 단어 하나가 내용을 이해하지 못하게 하기 때문에 용어를 정확하게 이해하는 것이 중요합니다.

2 분 소요

학습목표

  • IoC(제어의 역전)와 DI(의존성 주입) 원리를 이해한다.
  • 애플리케이션에서 활용하는 방법

IoC (Inversion of Control)

제어의 역전은 전통적인 객체지향 프로그래밍에서 클라이언트가 스스로 의존 객체를 생성하고 관리하는 방식을 벗어나, 그 제어권( 객체 생성, 의존성 연결, 라이프사이클 관리 등)을 프레임워크나 컨테이너에게 위임하는 개념입니다.

Spring에서는 IoC 컨테이너가 이러한 역할을 수행하며, 이를 통해 의존성 주입(Dependency Injection) 을 실현하여 코드의 결합도를 낮추고 테스트하기 편하게 합니다.

등장 배경

  • 객체 생성 및 의존성 관리가 어렵다.

    전통적인 객체 생성 방식은 각 클래스가 자신이 필요한 의존 객체를 직접 생성하거나 관리했습니다. 이 경우, 한 객체가 다른 객체를 내부에서 직접 생성하게 되어 결합도가 높아졌습니다. 즉, 클래스 간의 의존성이 강하게 연결되어 변경이나 확장이 어려워지는 문제가 발생했습니다.

  • 유지 보수 및 테스트의 어려움

    직접 객체를 생성하고 의존성을 관리하는 방식은 코드 수정시 연쇄적인 영향이 발생하여 유지보수가 어렵다.

    단위 테스트 작성 시에도 외부 의존성을 제어하기 힘들어 테스트의 효율성이 떨어진다.

결론

제어의 역전은 기존의 객체 생성 및 의존성 관리 방식에서 발생한 높은 결합도와 유지보수, 테스트의 어려움 등의 문제를 해결하기 위해 등장했습니다. DI를 통해 필요한 의존 객체를 외부에서 주입받음으로써, 코드의 모듈화와 유연성을 높이고, 실제 스프링 프레임워크에서는 이 원칙을 바탕으로 간결하고 효율적인 애플리케이션 개발을 지원합니다.

질문

  1. Spring IoC 컨테이너는 실제로 어떻게 동작하며, Bean의 생성과 의존성 주입 과정은 어떤 단계로 이루어지는지 설명해보세요.

    첫번째 대답 6/10점

    스프링 컨테이너는 필요한 빈 오브젝트를 생성 및 라이프사이클을 관리하는 역할과 책임을 담당합니다.

    설정 정보로 등록된 팩토리 메소드나 컴포넌트 애노테이션이 추가된 클래스를 빈 오브젝트로 등록합니다.

    이때 필요한 의존성이 빈 오브젝트에서 관리하는 타입인 경우에 의존성 주입을 하여 빈으로 등록됩니다.

  1. Bean Definition 등록:

스프링은 XML, 자바 설정 파일(@Configuration) 또는 컴포넌트 스캔(@Component)을 통해 Bean 정의를 읽어 들입니다. 이 정의에는 Bean의 클래스, 의존성, 스코프, 초기화 및 소멸 메서드 등이 포함됩니다.

  1. Bean 인스턴스화:

등록된 Bean Definition에 따라 스프링은 Bean 인스턴스를 생성합니다. 이 과정은 생성자 주입이나 팩토리 메소드를 사용하여 이루어지며, 싱글톤 빈은 애플리케이션 시작 시 미리 생성되고, 프로토타입 빈은 요청 시 생성됩니다.

  1. 의존성 주입 (DI):

Bean 인스턴스가 생성된 후, 스프링은 해당 Bean에 필요한 의존성을 해결해 주입합니다. 이 때 @Autowired, @Inject 같은 어노테이션을 기반으로 타입이나 이름에 맞는 Bean을 자동으로 주입하며, 이를 통해 객체 간의 결합도를 낮춥니다.

  1. 초기화 및 후처리:

의존성 주입이 완료되면, 스프링은 초기화 콜백(예: InitializingBean 인터페이스의 afterPropertiesSet 메서드나 custom init-method)을 호출합니다. 또한, BeanPostProcessor를 통해 초기화 전후의 추가 처리를 수행하여 Bean의 최종 상태를 구성합니다.

  1. 라이프사이클 관리 및 종료:

스프링 컨테이너는 애플리케이션 종료 시, 소멸 콜백(destroy-method)을 호출하여 Bean의 자원 정리와 종료 처리를 담당합니다.

  1. 의존성 주입 방식에는 어떤 종류(예: 생성자 주입, setter 주입, 필드 주입)가 있으며, 각각의 장단점은 무엇인지 논의해보세요

  2. IoC와 DI를 사용할 때 발생할 수 있는 순환 참조 문제에 대해 설명하고, 이를 어떻게 해결할 수 있는지 설명해 주세요

태그:

카테고리:

업데이트:

댓글남기기