- Reflect - JavaScript | MDN
- The Reflect namespace object contains static methods for invoking interceptable JavaScript object internal methods. The methods are the same as those of proxy handlers.
Node.js로 서버 개발을 하다보면 수많은 스프링의 유혹을 받고는 합니다.
구조화되고, 체계적이며, 함부로 탈옥하기가 힘들기 때문이죠
그래서 Node.js 진영에서는 Nest.js라는 프레임워크가 생겨났습니다.
적어도 Spring처럼 구조화된 형태에서 서버개발을 하고싶다는 수많은 의욕들이였던거죠
하지만 Spring의 DI는 런타임의 리플렉션을 이용하여 언어레벨에서 DI를 진행할 수 있도록 지원을 해줍니다
Dotnet도 마찬가지로 어트리뷰트를 기반으로 추적하여 리플렉션으로 DI를 진행하죠
그렇다면 Nest.js는 어떻게 DI를 진행할 수 있었을까요?
Spring과 Dotnet은 기반이 되는 언어가 컴파일러 언어라서 언어레벨에서 리플렉션을 지원했다지만
ecma script는 그저.. 인터프리터 언어인 범부잖아요?
아래는 Nest.js의 튜토리얼에 있는 예제 중 하나입니다.
분명 이렇게 TypeScript로 짜인 코드는 컴파일되면 타입 태그가 싹 빠진 형태일거고, 클래스로부터 생성자에 필요한 argument type을 모를테니까요
해법은 언어 스펙에 있었습니다.
Reflect
다행히 언어레벨에서 각 오브젝트에 메타데이터를 넣으라고 만들어놓은 기능이 있었습니다.
그냥 단순히 오브젝트에 메타데이터를 추가하고, 가져오는 단순한 기능이죠
그래서 타입스크립트는 생각했습니다.
그렇다면, 클래스를 컴파일해줄 때 타입 정보를 메타데이터에 넣어줄까?
그래서 타입스크립트는 클래스 데코레이터가 달리는 곳마다 해당 클래스의 생성자에 필요한 인자값의 정보를 Reflect에 저장해주고 있었습니다.
여기에는 어떤 트랜스폼이나 흑마법이 들어가지않았고, 오로지 타입스크립트 컴파일러의 기능입니다.
이렇게 해당 클래스의 메타데이터에 생성자에 필요한 인자값들의 타입이 들어간다면
우리는 클래스를 불러와서 타입을 알기에, 그대로 넣어줄 수가 있게 된거죠
이에 대한 구현은 NestJS를 봐도 좋지만, 이는 너무 장황하기에 저는 다른 라이브러리를 추천드립니다.
위 라이브러리는 microsoft에서 만든만큼 코드가 꽤나 깔끔합니다.
한번 봐보시는 것을 추천드리며, 이대로 글을 마치도록 하겠습니다.
댓글0