Blog

[CS]29 DI, IoC에 대해 설명해주세요.

Author
Summary
DI, IoC에 대하여
Category
Study
Tags
CS
Favorite
Memory Date
2023/10/26
Cross Reference Study
Related Media
Related Thought
Related Lessons
tag
날짜
작성자
진행상황
진행 전
태그구분
6 more properties
DI, IoC에 대해 설명해주세요.
간단히 요약하면, DI는 객체 간의 의존성을 외부에서 주입하는 것으로 프로그램을 잘 만드는 레시피, 과정 중 하나라고 볼 수 있으며 IoC는 제어의 주도권을 개발자에서 제 3자 또는 프레임워크나 컨테이너로 넘기는 설계 원칙으로 프로그램을 잘 만드는 방법이라고 생각합니다. 스프링은 이 같이 프로그램을 잘만들기 위한 원칙과 레시피를 잘 준수 할 수 있도록 도움을 주는 역할을 한다고 볼 수 있습니다.
DI는 디펜던시 인젝션으로 의존성 주입이라고 합니다. 하나의 객체가 다른 객체에 의존성을 직접적으로 만들지 않고, 외부에서 주입받도록 하는 디자인 패턴입니다. 일반적으로 이는 코드의 유연성과 재사용성을 높이고 테스트하기 쉽게 만들어주기 위해 사용됩니다.
IoC는 인버전 오브 컨트롤의 약자로, "제어의 역전"이라고 합니다. 기존에는 개발자가 프로그램의 흐름과 제어를 직접 다루었지만, IoC에서는 프레임워크나 컨테이너가 제어의 흐름을 가져가게 됩니다. 이를 통해 객체지향 설계 원칙을 따를 수 있도록 하고 IoC를 적용함으로써 코드의 의존성을 외부로 옮기고, 객체의 생성 및 관리를 외부에 위임하여 개발자는 중요한 비지니스로직 개발에 힘쓸 수 있도록 합니다.
추가질문 : 스프링 프레임워크에서 DI, IoC는 어떻게 활용되는지 예시가 있나요?
스프링 프레임워크에서 DI와 IoC가 사용되는 대표적인 예시 중 하나는 의존성 주입(Dependency Injection)을 이용한 컨트롤러, 서비스, 리포지토리 등의 빈(Bean) 관리입니다.
예를 들어, 스프링 기반의 웹 애플리케이션에서는 각 계층(Controller, Service, Repository)이 각각의 역할에 집중하고 의존성을 외부에서 주입받아 사용합니다. 각 클래스마다 @Controller, @Service, @Repository 어노테이션을 사용하면서 해당 클래스가 컴포넌트로 등록됩니다. DI를 통해 각 계층이 필요로 하는 의존성을 직접 생성하지 않고 외부에서 주입받아 사용함으로써 결합도를 낮추고 유연성을 확보할 수 있습니다.
제어의 역전(Inversion of Control - IoC)은 주로 스프링 프레임워크의 IoC 컨테이너에서 발생합니다. 이 IoC 컨테이너는 애플리케이션의 제어 흐름을 개발자가 아닌 프레임워크나 컨테이너로 넘깁니다. IoC 컨테이너는 빈을 생성하고 필요한 의존성을 주입하는 역할을 합니다. 빈 객체의 생성, 초기화, 소멸과 같은 라이프사이클을 관리합니다. 이렇게 IoC 컨테이너가 제어의 주도권을 가져가게 되면서 제어의 역전이 발생하게 됩니다. 이는 애플리케이션의 코드가 컨테이너에 의해 호출되는 것이 아니라, 컨테이너가 코드를 호출하는 형태로 제어의 주도권이 반전된 것을 의미합니다.
추가질문 : 장점과 단점에 대해서도 간단히 설명해주세요.
DI, IoC의 장점은 DI를 통해 싱글톤 패턴(하나의 객체로 통일)을 보장하기 때문에 재사용성이 높아집니다. 또한 모듈이 독립적으로 주입되기 때문에 코드 유연성이 증가하여 변경, 교체 등 확장, 유지보수성이 높아집니다. 모의 객체(Mock objects) 등을 쉽게 주입 할 수 있어 테스트도 더욱 간편해집니다.
의존성 주입의 개념과 사용법을 이해해야 하는 러닝커브가 있는 단점이 있습니다. 더하여 버그, 오류가 발생 했을 때 대처하기 어려울 수 있으며 내부적으로 예상과 다른 방향으로 작동할 가능성이 있습니다. 또한 의존성 주입을 과도하게 사용하면 코드의 가독성이 감소할 수 있습니다.