Nest

송은우·2022년 3월 18일
0

imports: [ConfigModule.forRoot({ isGlobal: true })],
providers: [AppService, ConfigService],

라는 걸로 process.env.secret을 대체할 수 있음
service에서 constructor(private readonly configService: ConfigService) {}
this.configService.get("secret")으로 대체 가능

isGlobal:true, load[getEnv]
getEnv=()=>{
return {
DB_Password:패스워드
NAME:네임
}
}
이런 방식으로 되게 간단하게 외부로부터 비밀 키를 처리할 수 있음
바깥에다가 async로 감싸버려서 axios를 덮어씌우면 됨.

'prettier/prettier': ['error', { endOfLine: 'auto' }],
를 eslintic.js에 있는 rules에다 넣으면 crlf delete 'cr' 이 없어짐

import { Injectable, Logger, NestMiddleware } from '@nestjs/common';
import { NextFunction, Request, Response } from 'express';

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  private logger = new Logger('Http');

  use(request: Request, response: Response, next: NextFunction): void {
    const { ip, method, originalUrl } = request;
    const userAgent = request.get('user-agent') || '';

    response.on('finish', () => {
      const { statusCode } = response;
      const contentLength = response.get('content-length');
      this.logger.log(
        `${method} ${originalUrl} ${statusCode} ${contentLength} - ${userAgent} ${ip}`,
      );
    });
  }
}
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer): any {
    consumer.apply(LoggerMiddleware).forRoutes('*');
  }
}

이런 느낌으로 저장 가능함
간단한 로깅 미들웨어. this.logger.log나 Logger.log가 있음.
context를 안 쓰면 Logger.log이고, 쓰면 this.logger.log
Logger('Http') 이 부분에 Http요청은 다 받는다는 것이 있을 뿐

npm 에 debug라는 패키지를 많이 씀. 어떤 프로그램이 로그를 썼는지에 대한 것이 있음.

미들웨어가 라우터보다 먼저 실행 되기에, 시작시 useragent라는 것을 받고, response.on을 next로 갔다 돌아오는 과정에서 처리하게 됨.

implements 부분을 붙히는 이유는 typescript 나 에디터에서 오타를 잡아줌.
di를 하면 테스팅 에 좋기에 provider, injection을 써야 함
결합성을 낮추는 것이 가장 좋음.

{
      provide: AppService,
      useClass: AppService,
    },

이것과 같은 것. provide: 는 고유한 키임. useClass에 상수를 넣어버릴 수도 있음

useFactory: () => {
        return {
          a: 1,
        };
      },
{
      provide: `Custom_Key`,
      useValue: `Custom_Value`,
    },
@Inject('Custom_Key') private readonly customValue,

이런 방식으로 중간에 자기만의 값을 inject할 수 있음

js 객체같은 것들은 다 heap 에 저장됨.
stack에는 호출 스택. 실행 컨텍스트같은 것들이 저장됨
활용 안할 경우에는 그냥 모니터링 서비스에 보내거나,
활용 하면 몽고db같은 것에 저장하면 됨

express에서도 di를 쓰는 경우도 있지만, res moking을 해야하기에 불완전함. req도 모킹해야되지만 req 모킹만 뺐다는 그나마 장점이지만 부족함
next-nest로 조금 편한 플러그인이 있음. 서버를 단 하나만 이용하기에 조금 편할 수 있음

repository역할을 typeorm 이 해줌. controller=>service=>repository=>entity 같은 구조로 쪼개져 나감.
파일로 관리하려면 wimstom, log4j 를 씀. pm2에 연결하고, 로드밸런서를 따로 붙히는 방식

dto: data transfer object express의 body parser객체와 같음
이 모든 것은 다 nest가 넣어줌

nest의 특징은 export default를 안 쓰기에, 대부분 중괄호, interface를 안 쓰고 클래스를 많이 쓴다는 차이가 있음. interface로 하면 runtime에서 날아가기에, class로 js에서도 남아있도록 하는 방법으로 처리를 함
최대한 .을 찍어서 이름을 남기는 것

express는 decorator 몇개만 붙히면 간단하게 api문서를 만들어 줌

const config = new DocumentBuilder()
    .setTitle('API')
    .setDescription('API Document')
    .setVersion('1.0')
    .addCookieAuth('connect.sid')
    .build();
  const document = SwaggerModule.createDocument(app, config);
  SwaggerModule.setup('api', app, document);

라는 것을 만들면, /api경로에 있는 모든 api를 문서화 해줌
컨트롤러 다음에 처리하는 과정을 하는 것이 intercepter의 대표 기능
intercepter 관점 지향 프로그래밍. 가로에서 세로로 관점을 바꿈. 공통 중복 제거

spring과 되게 유사한 구조라는 점.

db꺼를 그대로 가져와서 쓰는 방법 : typeorm-model-generator 라는 npm 패키지에서 긁어올 수 있음
db 관계 다이어 그램이 있음 Entity Relationship Diagram. E-R 다이어 그램 또는 ERD. 존재하고 있는 것들의 관계

  @Column('varchar', { name: 'name', unique: true, length: 30 })
  workspaceName: string;

이런 식으로 바꿀 수 있다는게 orm의 장점이 됨.

class기반으로 사용되기에, 중복을 제거할 수 있다는 장점이 있음 typeorm의 장점
신기함.
one to many, many to one 으로 해야 함.
many to one
서로 규칙을 좀 정해두는게 좋긴 함. 관계에 따른 대문자로 시작하는 그런 규칙이라든가 여러 규칙이 있으면 조금 편한 경우가 많음.

@OneToMany(() => Channels, (channels) => channels.Workspace)

여기서는 channel이고, 반대에서는 workspace다 라는것 명시하기

    onDelete: 'SET NULL',
    onUpdate: 'CASCADE',
  }

라는 sql 옵션을 만들어 주는 것 정도가 특징
foreign key가 있는 곳에다 join column 넣기
many to many는 one to many 2개로 나누는 방식으로 쪼개서 many to many가 버그가 생긴다면 해결할 수가 있음.
many to many는 table에다가 넣는 것 정도?
둘중 하나만 넣기. 내가 workspace면 inverse에다 넣기. error가 난다면 반대로 바꿔보면 됨.

option 에 cascade 옵션을 넣어주는게 좋음. 한 번에 테이블은 업데이트가 됬지만, 다른 테이블은 안 될 수가 있음.

erd 생성하는 사이트
ddl로 erd 를 만들어 주는 사이트.

profile
학생의 마음가짐으로 최선을 다하자

0개의 댓글