티스토리 뷰

프로그래밍 기초/CS

IoC 와 DI에 대하여

StartCoriny 2024. 3. 5. 20:06

IoC(Inversion of Control)

Inversion of Control의 뜻 그 대로 제어의 역전이다.

컨트롤의 제어권이 사용자(개발자)가 아니라 프레임워크에 있어 프레임워크가 필요에 따라 사용자의 코드를 호출 한다.

■ IoC원칙을 사용하면 구체적인 구현보다는 인터페이스나 추상 클래스에 의존하게 된다.

    즉, 서비스가 변경되어도 관계없이 사용가능.

■ 코드의 결합도가 감소하고, 다른 구현체로 쉽게 교체할 수 있다.

import { prisma } from '../utils/prisma/index.js';
import { UsersController } from '../controllers/users.controller.js';
import { UsersServices } from '../services/users.services.js';
import { UsersRepositories } from '../repositories/users.repositories.js';

// 3계층의 의존성을 모두 주입합니다.
const usersRepository = new UsersRepositories(prisma);
const usersService = new UsersServices(usersRepository);
const usersController = new UsersController(usersService);

일반적으로 프레임 워크 없이 개발을 한다면 위 코드와 같이 객체의 결정, 생성, 의존성 생성, 객체의 메소드 호출과 같이

각 객체들이 프로그램의 흐름을 경정하고 각 객체를 구성하는 작업에 사용자가 직접적으로 참여했다.

즉, 모든 작업을 사용자가 제어를 하는 구조였던 것.

 

직접 객체 생성, 강한 결합

 

하지만 IoC는 개발자가 사용하고 싶은 객체를 직접 생성하는 것이 아니라 객체의 생명 주기 관리 자체를 외부에 위임한다.

외부 = Nest.js IoC 컨테이너 , Spring IoC 컨테이너

그렇기 때문에 객체는 모든 권한을 외부에 위임하고 제어 권한을 위임받은 외부에 의해 결정되고 만들어진다.

객체는 컨테이너에게 위임한뒤 그 객체가 어디에 어떻게 사용되는지는 신경을 안쓴다. 

어디에 어떻게 사용하는지는 컨테이너에게 맡기고 컨테이너는 필요로 하는곳에 주입을 시켜주면 되는 것이다.

그렇게 되면 개발자는 구체적인 구현, 강한 결합을 하게 되는 과정을 하지 않아도 된다.

 

데코레이터를 사용하여 컨테이너에 역할을 위임

 

컨테이너는 필요로 하는곳에 주입

 

즉, IoC란 기존 사용자가 모든 작업을 제어하던 것을 특별한 객체에 모든 것을 위임하여 객체의 생성부터 모든 객체에 대한 제어권이 넘어간것을 말한다.

 

 

DI(Dependency Injection)

■ Dependency Injection - 의존성 주입.

객체가 서로 의존하는 관계가 되게 의존성을 주입하는 것.

■ 일반적인 의존성은 한 객체가 다른 객체를 사용하는 것이다. ex) new controller(service)

IoC에서는 DI컨테이너를 사용하여 의존성이 생성되고 관리 된다.

   ex) constructor(private readonly service : Service)

■ 하나의 작업만 수행하는 작은 객체는 많은 상황에서 재결합하고 재사용하기가 쉬워 코드의 재사용성, 유연성이 높아진다.

■ 클래스들간의 의존관계를 최소화하여 코드를 단순화 할 수 있다.

■ 책임이 분리되어있기 때문에 클래스 수가 늘어가 복잡성이 증가한다.

■ 주입된 객체들에 관한 코드 추적이 어렵다.

■ 의존성 주입 프레임 워크를 사용하면 빌드 시간이 늘어날수 있고, 프레임워크에 대한 의존도를 높인다.

 

 

 

 

참고 : definite

'프로그래밍 기초 > CS' 카테고리의 다른 글

Stateful과 Stateless  (1) 2024.04.19
AOP에 대하여  (0) 2024.04.17
객체지향 프로그래밍 설계 5원칙이란?  (0) 2024.03.04
동시성문제와 격리수준에 대해서  (0) 2024.02.20
Access Token 과 Refresh Token  (0) 2024.02.16
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함