Node.js/NestJS

[NestJS] 각종 트러블 슈팅

왈왈디 2023. 5. 18. 15:55
728x90

사수님이 코드 리뷰 해주시면서 배운 너무나 많은 정보들.

알찬 것들이 많은데 까먹을 것 같아서 적어두기.

 

1. Circular Depencies

: Module끼리 서로 import할 경우 뭘 우선할 지 알 수 없어 일어나는 오류

forwardRef()=> 를 걸어주자

 

2. Module import, exoprt Service

: 일반적으로 다른 모듈의 service를 사용하고 싶을 때에는 그 모듈에서 export:[Service]를 해주고, 사용하고자 하는 모듈에서 import: [쓰고 싶은 서비스가 있는 Module]을 해줘야 한다. provider에 남의 모듈의 Service를 그대로 넣어버리면 그 service의 clone을 만드는 격으로 둘은 엄격히 보았을 때 다른 두 객체가 된다.

 

3. Service class super에서 constructor에 넣은 Service 사용하기

평소에 메서드 안에서 this.authService 사용하듯이 super()로 묶여 있는 곳에서 this.~ 로 사용하려고 했으나, 계속 super 안에서는 this.를 어떻게 사용하나 한참 헤맸는데, 그냥 this. 를 빼고 그대로 사용하면 된다. 아래 코드 참고

export class UserAtStrategy extends PassportStrategy(Strategy, 'jwt-user') {
  constructor(
    private authService: AuthService,
    private readonly config: ConfigService,
  ) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      secretOrKey: config.get('SECRET_KEY'), //this.config가 아니라 config
      ignoreExpoiration: true,
    });
  }

4. entity 안에 method 만들기

entity도 하나의 class 이기 때문에 method를 포함할 수 있다. db에 entity 저장될 때 method도 함께 저장되므로, db에서 불러온 entity에도 메서드가 포함되어 있다.

 

5. static 메서드 활용하기

class 안에 static 메서드를 만들면 instance를 생성하지 않고 메서드를 사용할 수 있을 뿐만 아니라, 다른 class 안에서 constructor에 인자로 넣지 않고서도 전역으로 사용이 가능하다. entity 내 메서드에서 utilsService의 메서드를 사용하고 싶었는데, entity는 db에서 불러올 때가 많아 그때는 utilsService를 어떻게 주입해야 할까 고미했는데, utilsService 내 메서드를 static 메서드로 바꾸면서 해결했다.

static 메서드는 메모리에 올라가있기 때문 전역으로 사용 가능하다고 하는데 이 부분은 무슨 말인지를 잘 모르겠어서 추후 공부해봐야겠다.

 

6. 타입스크립트의 생명은 타입

웬만하면 자주 쓰이는 타입은 만들어서 폴더에 모아두고 활용하라. Types 폴더(Interfaces 폴더도(?)) 등이 적당하다고 한다. 타입 지정하지 않으면 바로 오류 나는 경우 많으니 항상 타입 지정하자.

 

7. await 남발 금지

await 아래 점 세개가 찍히면 Promise 객체가 아닌데 무의미하게 await를 걸었다는 의미이다. 점 세개가 보이면 await는 삭제.

 

8. resource는 되도록이면 적게 사용하라.

인자를 넘겨줄 때 불필요하게 너무 많은 정보를 넘기지 말자. 예를 들어, user 객체에서 id 와 name만 필요하다면 그 둘을 추출하여 보내자.

 

9. index.ts 활용하기

파일이 많아지면서 import한 파일들이 너무 많아 지저분해 질 때 index.ts 파일을 활용하자. 파일이 많은 폴더 안에 index.ts 를 만들고 각 객체들을 그 안에서 export하면 사용하는 쪽에서 index.ts로 주소를 인식한다. 아래 예시 참고.

//src/auth/dto/index.ts

export { Payload } from './payload.interface';
export { ReqUser } from './requser.interface';
export { Tokens } from './tokens.interface';
export { SigninAuthDto } from './signin-auth.dto';

10. utils 폴더 활용하기

다양한 entity에 대해 공통으로 사용되는 도구 역할의 메서드나 데코레이터 등이 있다면 추후 관리가 수월하도록 utils 폴더에 모아두고 관리하자. 예를 들어 암호화하는 함수를 만들어 utils에 저장해두면 추후 bcrypt에서 crypto로 바꾸더라도 모든 파일들을 점검할 필요 없이 손쉽게 수정할 수 있다.

 

11. NestJS의 풍요를 즐기기

NestJS를 사용하는 만큼 dotenv, postman 보다는 nestjs config, swaggar를 사용하자. NestJS Config 모듈과 JWT를 함께 사용하는 게 까다로웠다. UserFactory를 사용하여 어찌저찌 가동은 시켰으나 어떻게 돌아가는지 모르겠어서 추후 알아봐야겠다.


앞으로 공부해서 적용할 것.

  • Swagger
  • Subscriber
  • Decorator
  • Filter
728x90