on
Nest.js 에서 Ioc , DI, Singleton 이 무에오?...
Nest.js 에서 Ioc , DI, Singleton 이 무에오?...
728x90
ㅇNest.js 를 이제는 좀 많이 사랑하게 됬다..
더럽...네스트 일단 고양이가 아이콘이라서 좋아하게된건 안비밀
Nest는 앵귤러와 자바 스프링부트의 철학을 공유하고있다고 한다
그리고 공식문서가 진짜진짜 너무너무잘되어있다
정말 굳굳
공식문서 1회독을 목표로하고있는데
거기서 처음보는 이야기들이 많이 나온다 대체뭘까?...
찾아보자잉
IoC(Inversion of Control)
인버전...얼마전 영화 테넷에서 인버전 하면 시간을 거꾸로 흘러가는것처럼 살아갈수있는데 그런인버전이면
너무이해하기 어려울듯하다...
하지만 다행히도 아닌거같다
그말인즉슨 개발자가 제어해야할 영역을 프레임워크에게 믿고 맡기는 거라고 생각하면 좋을거같다
라이브러리는 내가 주도권을 가지고 각각의 의존성을 설계하고 능동적으로 만드는반면
프레임워크는 내가 작성한 앱이 수동적으로 프레임워크에 의해 사용된다고 생각하면된다
우리가 만든 애플리케이션의 동작방식을 Nest 에게 믿고 맡깁니다
싸랑해오!!네스트!!
IoC(제어의 역전):
우리는 Nest.js 라는 프레임워크를 사용함으로써 우리가 제어해야 할 영역을 넘겨줘버려!!
Dependency Injection, Injectable
제일 이해가 안갓다 의존성주입 뭘 의존하는걸 주입한다는건지?...
굉장히 추상적인 개념이라
아마 비유를 해서 설명하는게 가장 이해하기가 쉬웟다
너가 냉장고에서 스스로 무언가를 꺼낼 때, 문제가 될 수 있단다. 냉장고의 문을 그대로 열어둘 수 있고, 엄마와 아빠가 너가 먹기를 원하지 않는 초콜릿이나 사탕같은것들을 왕창 꺼낼 수도 있지. 또는 엄마와 아빠가 냉장고에 넣어놓지 않은 땅콩버터를 찾을수도있고, 또는 미처 버리지 못해서 유통기한이 지난 땅콩버터를 찾을수도 있지. 그렇기 때문에 냉장고에서 필요한게 있을때 항상 말해주면 좋겠다. “저는 점심에 빵과 함께 먹을 땅콩버터가 필요해요” 이런식으로. 그러면 엄마랑 아빠가 너가 점심을 먹기위해 식탁에 앉았을 때 땅콩버터가 준비될 수 있도록 할게
dependency injecttion wekipedia에 실려있는 5살에게 DI 설명하기라고 합니다
아이에게 냉장고문을 열수있는 능력을 주는것이 아니라
부모에게 냉장고문을 열수있는 제어능력을 맡기는것
필요한걸 부모에게말하면 부모는 문을열고 꺼내서 가져다준다
예를 들어서
userService 같은 파일은 user 관련 한 비즈니스 로직들이 들어있는 모듈이다
login ,register 같은 메소드를 구현해서
user 의 정보를 리턴해달라는요청에 응답하는 Controller 에서 사용되는것들
@Service() export class userService { // 이 코드가 바로 Dependency Injection 의 핵심코드다. constructor(private readonly db: databaseService) {}
public, private, protected, readonly 의 키워드를 constructor 변수의 앞에 기입하면 이 변수가 실제로 이름과 값을 가지는 클래스의 속성이 된다고 한다
db 는 databaseServie 라고 우리가 타입만 지정했는데도 불구하고
실제로 사용할땐
this.db.블라블라 하고 db 의 메소드들을 호출할것이다
우리는 nestJS에서 의존성주입을 사용할때는 타입을 지정해야만 한다는것을 알수있다
@Injectable, @Service 등의 데코레이터를 사용하면 의존성주입의 대상이 된다고한다
의존성주입대상들은 일반적으로 싱글톤객체라고 한다
밑에서 싱글톤객체는 다시설명해보기로하겟다
DI(의존성 주입): Nest.js 는 IoC를 구현하기 위해 의존성 주입이라는 개념을 사용했는데,
어플리케이션이 실행 될 때,
해당 클래스를 생성하기 위해 필요한 의존성을 생성하고 주입하는 코드를 동작시킨다.
Singleton
Nest.js 에서 핵심개념은 바로 우리가 작성한 모듈들 (@Module 데코레이터로 수식된 엔티티 모듈 또는 @Injectable 데코레이터로 수식된 서비스 로직들 모두를 의미함)이 Singleton 으로 작동된다는 것
싱글톤은 말그대로 한 개란 뜻
Nest.js 에서 싱글톤 패턴을 사용하는 이유??
새로운 인스턴스를 필요할 때 마다 매 번 생성할 필요가 없고, 필요하지 않을 때 인스턴스를 삭제 할 필요가 없다.
(마치 냉장고 예에서 냉장고를 열고, 닫는 문제에서 벗어남)
직접 인스턴스화를 하게 되면 언제 어느 시점에 메모리를 관리해야 할지 결정하기 어렵다.
클래스 또는 함수가 어떤 의존성을 갖는지 선언적 으로 알 수 있다. (ex. constructor 메소드의 인자를 보고서)
어떤 클래스에서든지 접근할 수 있도록 global(전역) scope 를 가지도록 한다.
(따라서 인스턴스가 실수로 더럽혀 지는 것을 방지하기 위해 private readonly 플래그를 통해 의존성 주입을 선언한다.)
Node.js 는 싱글스레드로 작동하기 때문에 각각의 클래스 인스턴스들이 싱글톤으로 관리가 되어도 성능상에 문제가 없고 동시에 안전하다.
혹시 나중에 scale out 을 할 때에도, 노드 프로세스 마다 분리된 싱글톤 객체들을 갖기 때문에 확장에도 용이하다.
(스케일 아웃은 몽고db 같은 nosql 이 좋다고 합니당)
하나의 인스턴스만 존재하기때문에 테스트도 용이하다는 장점!
Singleton(싱글톤): 의존성 주입을 위해서는 클래스를 인스턴스화 해야 하는데,
Nest.js의 기본 설정으로 하나의 클래스는 오로지 하나의 인스턴스만을 가지도록 한다.
module 을 사용해서 injection 하는 패턴이 싱글톤패턴 이라고 한다
직접 인스턴스들을 만드는것이 아닌
모든 모듈은 싱글톤이기 때문에 다른 모듈에서도 서로를 export 해서 사용할수있다는뜻!!
728x90
from http://ganzicoder.tistory.com/163 by ccl(A) rewrite - 2021-08-20 01:00:40