이전 포스팅에서 토큰을 인증하고 req에 user객체를 담아주었는데 담을 때 아래의 이미지와 같이 user에는 id와 nickname을 담았었다.
하지만 req.user에서 바로 id를 꺼내서 쓰려고 하니 User에는 id타입이 없다고 에러를 반출한다.
req.user.id에서 user를 ctrl+click으로 step-in해 보면 Express의 Request인터페이스에 User라는 인터페이스가 있지만, User는 빈 객체만 있을 뿐 다른 속성타입을 가지고 있지 않다.
이러한 문제를 해결하기 위해서는 any타입으로 선언된 유저에 req.user를 담고, 거기서 다시 userId를 선언해 user.id를 변수에 담아서 사용하는 방법이 있다.
물론 코드를 쓰는데 몇개 안되는 문자로 작성하는 쉬운 방법이지만, 이러한 방법은 타입을 보장하기 힘든 any타입을 사용하게 되고, 매번 라우터에서 user.id를 사용하려면 썻던 것을 굳이 또 써서 코드를 지저분하게 만들 수 있다.
이러한 단점을 보완하고 좀 더 깔끔한 코드를 만들때 @Req()데코레이터가 아닌, 커스텀으로 데코레이터를 만들어서 해결하는 방법이 있다.
createParamDecorator함수를 이용해서 커스텀 데코레이터를 만든다.
실행 컨택스트에서 리퀘스트를 뽑아와서 req변수에 담고 req의 user만 꺼내올 수 있도록 리턴을 주면 아래와 같이 만들어둔 GetUser데코레이터를 사용해서 user.id를 바로 사용할 수 있게 된다.