IoC 와 DI #30
Replies: 6 comments
1. IoC(제어의 역전)란 무엇인가요? 쉬운 말로 설명해주세요.IoC(Inversion of Control, 제어의 역전) 은 프로그램의 실행 흐름을 내가 직접 관리하지 않고, 외부에서 관리하도록 맡기는 것이다. 보통 우리가 직접 요리를 한다고 생각해보자. 내가 무엇을 언제 할지 전부 직접 결정한다. 그런데 식당에 가면 다르다. 나는 "김치찌개를 만들어 달라"고만, 실제 요리 과정은 식당이 관리한다. 이것이 IoC의 핵심적인 느낌이다. 프로그래밍에서는, 예를 들어 객체가 다른 객체를 필요로 한다고 해보자. IoC가 없다면:
IoC를 적용하면: 이제 객체를 만드는 제어권이 그리고 IoC를 구현하는 대표적인 방법이 DI(Dependency Injection, 의존성 주입)이다. 2. DI(의존성 주입)란 무엇이며, 우리가 직접 객체를 만들지 않고 Spring이 대신 넣어주면 뭐가 좋은가요?DI(Dependency Injection, 의존성 주입) 는 쉽게 말하면, 객체가 필요한 객체(의존성)를 직접 만들지 않고, 외부에서 만들어서 넣어주는 것이다. 앞에서 설명한 IoC(제어의 역전)를 구현하는 대표적인 방법이라고 볼 수 있다. DI가 없다면? 예를 들어 여기서는 를 사용해서 객체를 만든다. 즉, DI를 사용하면? 이제 여기서 이것이 의존성 주입(DI)이다. Spring을 사용하면 우리가 일일이 객체를 생성하고 연결할 필요가 줄어든다. 예를 들어: Spring이 애플리케이션을 실행하면서 필요한 객체를 관리하고, 해준다. 즉, 개발자는 " 핵심적인 장점은 결합도를 낮추고 유지보수와 테스트를 쉽게 만든다는 것이다.
3. IoC와 DI는 서로 어떤 관계인가요?IoC는 "제어권을 외부에 맡기는 개념"이고, DI는 "그렇게 제어권을 넘기기 위해 사용하는 방법"이다. [ IoC — 큰 개념 ] 원래 객체가 직접 다른 객체를 만들고 관리한다.
IoC를 적용하면 이 제어권을 외부로 넘긴다. [ DI — IoC를 구현하는 방법 ]
Spring에서는 이 역할을 Spring 컨테이너가 담당한다. DI 외에도 템플릿 메서드, 이벤트 기반 구조 등 제어 흐름을 외부 프레임워크가 결정하는 다양한 형태가 IoC에 포함될 수 있다. |
1. IoC(제어의 역전)란 무엇인가요? 쉬운 말로 설명해주세요.→ 제어의 역전은 소프트웨어 개발에서 코드의 흐름과 객체 관리를 외부로 넘김으로써 프로그램의 유연성과 확장성을 높이는 설계 패턴
2. DI(의존성 주입)란 무엇이며, 우리가 직접 객체를 만들지 않고 Spring이 대신 넣어주면 뭐가 좋은가요?객체가 직접 필요한 다른 객체를 만드는 대신 외부에서 생성된 객체를 전달 받아 사용하는 디자인 패턴으로 객체간의 결합도를 낮추고 유연한 코드를 짤 수 있게 됩니다 3. IoC와 DI는 서로 어떤 관계인가요?DI(Dependency Injection) 의존성을 외부에서 주입받고 객체간의 관계를 외부에서 결정하고 주입하기에 객체가 제어권을 가지지 않아도 되는 제어의 역전 상태가 유지되는 관계이다 |
1. IoC(제어의 역전)란 무엇인가요? 쉬운 말로 설명해주세요.IoC 는 제어의 흐름을 내가 아니라 프레임워크가 가져가는 것이다. 이름 그대로 제어권이 뒤집힌다. 내가 발제를 냈으니 예시를 좀 자세히 써보면, 원래 코드는 이렇게 생겼다. public class OrderService {
private final PaymentService paymentService = new PaymentService();
}여기서 흐름의 주도권은 프레임워크는 반대이다. 내가 프레임워크를 호출하는 게 아니라, 프레임워크가 내 코드를 호출한다. 나는 클래스를 만들어서 여기서 객체를 만들고 관리해주는 스프링 쪽 주체가 IoC 컨테이너이고, 컨테이너가 관리하는 객체를 빈(Bean) 이라고 부른다. 한 가지 정리해두고 싶은 건, IoC 가 스프링이 만든 개념은 아니라는 점이다. 이벤트 리스너를 등록해두면 이벤트가 발생할 때 프레임워크가 내 함수를 불러주는 것도 IoC 고, 템플릿 메서드 패턴에서 부모가 흐름을 정하고 자식이 일부만 채우는 것도 IoC 이다. 스프링은 이걸 DI 라는 방식으로 구현한 것뿐이다. 2. DI(의존성 주입)란 무엇이며, 우리가 직접 객체를 만들지 않고 Spring이 대신 넣어주면 뭐가 좋은가요?DI 는 객체가 필요로 하는 다른 객체를 자기가 만들지 않고, 밖에서 넣어주는 것이다. 위의 코드를 이렇게 바꾸면 DI 이다. public class OrderService {
private final PaymentService paymentService;
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService;
}
}
뭐가 좋은가
주입 방법은 생성자 / 세터 / 필드( 3. IoC와 DI는 서로 어떤 관계인가요?IoC 가 목적(개념)이고 DI 는 그걸 이루는 수단(구현 방법) 중 하나이다. 포함 관계로 보면 IoC ⊃ DI.
그래서 DI 를 쓰면 IoC 를 하는 것이지만, IoC 를 한다고 해서 반드시 DI 인 건 아니다. 위에서 말한 템플릿 메서드 패턴이나 이벤트 콜백도 DI 없이 IoC 이다. 원래는 스프링을 IoC 컨테이너라고 부르는데 왜 굳이 DI 라는 말을 따로 쓰나 싶었는데, 찾아보니 IoC 라는 말이 너무 넓어서 마틴 파울러가 "우리가 말하는 그 IoC 는 정확히는 의존성 주입이다" 라고 이름을 붙인 게 시작이라고 한다. 그래서 두 단어가 거의 같이 붙어 다니는 것 같다. |
1. IoC(제어의 역전)란 무엇인가요? 쉬운 말로 설명해주세요.IoC(Inverison of Control)는 객체를 만들고 관리하는 주체가 개발자에서 Spring으로 바뀌는 것입니다. 2. DI(의존성 주입)란 무엇이며, 우리가 직접 객체를 만들지 않고 Spring이 대신 넣어주면 뭐가 좋은가요?DI(Dependency Injection)는 어떤 객체가 필요로 하는 다른 객체를 외부에서 넣어주는 것입니다. 예를 들어 Car가 Engine을 필요로 한다고 할 때, //직접 만들면, Car가 스스로 Engine을 생성하기 때문에, Car와 Engine 두 클래스가 강하게 연결됩니다.
class Car {
private Engine engine = new Engine();
}
//DI를 적용하면, Car는 Engine을 밖에서 받아서 사용하며, Spring에서는 이렇게 Engin 객체를 만들어 필요한 Car에 주입하는 방식이 사용됩니다.
class Car {
private final Engine engine;
public Car(Engine engine){
this.engine = engine;
}
}DI를 적용했을 때의 가장 큰 장점은 객체 사이의 결합도가 낮아진다는 것입니다. Car는 원래 자동차의 기능에만 집중하면 되고, Spring이 알아서 어떤 엔진을 사용할지 결정하고, 그 엔진을 생성하기 때문에 객체의 책임이 명확해지고, 유지보수나 테스트에 용이합니다. 3. IoC와 DI는 서로 어떤 관계인가요?DI는 IoC를 구현하는 대표적인 방법이라고 볼 수 있습니다. 먼저 IoC는 객체를 생성하고 관리하는 제어권을 개발자가 아닌 외부(Spring 등)에게 맡기는 것입니다. 이때 필요한 객체를 생성하지 않고 가져오는 방법 중 하나가 외부에서 만든 것을 주입받는다는 개념의 DI(의존성 주입)입니다.
추가 공부 예정)Spring의 다음 개념인 IoC Container → Bean → |
|
기본 질문1. IoC(제어의 역전)란 무엇인가요? 쉬운 말로 설명해주세요.IoC는 프로그램의 제어 흐름을 개발자가 직접 다루는 것이 아니라, 외부 프레임워크나 컨테이너에 위임하는 소프트웨어 디자인 원칙입니다. 개발자 주도 방식은 개발자가 직접 객체를 생성하고, 필요한 의존성을 만들어 결합하는데 비해 IoC 방식은 객체의 생성, 생명주기 관리, 의존성 연결을 외부 컨테이너가 대신 수행합니다. 이렇게 되면 개발자는 직접 new 키워드로 객체를 직접 생성하지 않아도 되고, 의존 객체를 찾아 연결할 필요가 없으며 객체 소멸, 생명 주기 관리를 하지 않아도 되고, 또 구현체를 손쉽게 교체할 수 있습니다. 2. DI(의존성 주입)란 무엇이며, 우리가 직접 객체를 만들지 않고 Spring이 대신 넣어주면 뭐가 좋은가요?DI(의존성 주입)이란 클래스가 필요한 다른 객체를 직접 만들지 않고, 외부에서 전달받아 사용하는 것입니다. 의존성 주입은 생성자 주입, 세터 주입, 필드 주입 등이 있고, 의존성 주입으로 Spring이 대신 주입을 해준다면 직접 조립하던 controller, service, repository를 어노테이션만으로 Spring이 대신 조립해 줍니다. 그리고 객체의 생명주기와 객체의 무분별한 생성을 관리해줍니다. 결론적으론 생산성, 유연성, 유지보수성을 극대화해줍니다. 3. IoC와 DI는 서로 어떤 관계인가요?DI는 IoC를 실현하기 위한 대표적인 방법 중 하나입니다. IoC는 프로그램의 흐름이나 객체의 생성, 관리를 개발자가 직접하지 않고 외부에 넘기는 개념이라면 DI는 IoC라는 원칙을 ‘객체 간의 의존 관계’에 특화하여 구체적인 코드로 구현해 낸 디자인 패턴입니다. |

Uh oh!
There was an error while loading. Please reload this page.
📆 일자: 26년 8월 16일(일) : 일주일 미루어졌는데 어제 깜박해서 지금이라도 발제합니다.
🤔오늘의 질문
All reactions