혼자 고민해보기_ 개발/TIL (Today I Learned)

20231102(목)_ 최종프로젝트 리팩토링

nuri-story 2023. 11. 2. 19:16

금일 달성 항목

1)  최종프로젝트 Redis추가


문제 해결 과정 1 - TypeORMError: Provided "skip" value is not a number. Please provide a numeric value

[문제]

cache 코드를 작성하고 테스트하려고 하는데 자꾸만 타입 에러가 떴습니다.

  // 채용공고 전체 조회
  @Get()
  @ApiOperation({
    summary: '채용공고 전체조회 API',
    description: '채용공고 전체조회',
  })
  @ApiCreatedResponse({ description: '채용공고 전체조회' })
  async findAllJobposting(
    @Query() pageReqDto: PageReqDto,
  ): Promise<Jobposting[]> {
    const { page, size } = pageReqDto;

    const cachedList: Jobposting[] = await this.cacheManager.get(
      `jobpostingList${page}`,
    ); // 캐싱된 리스트가 있는지 조회
    if (cachedList) {
      return cachedList;
    } else {
      const jobposting = await this.jobpostingService.findAllJobposting({
        pageReqDto,
      });
      await this.cacheManager.set(`jobpostingList${page}`, jobposting, 5);
      // 캐싱된 데이터가 없을 경우 페이지별로 캐시를 구분하고 5초 동안 데이터를 캐싱
      return jobposting;
    }
  }

 

[시도 및 해결]

찾아보니 skip의 타입이 Number로 설정되어있지 않다고 하지만 이미 pageReqDto에는 Number로 설정되어있는 상황이었습니다.

import { Transform } from 'class-transformer';
import { IsInt } from 'class-validator';

export class PageReqDto {
  @Transform((param) => Number(param.value))
  @IsInt()
  page?: number = 1;

  @Transform((param) => Number(param.value))
  @IsInt()
  size?: number = 20;
}

 

npm run start:dev 를 실행하니 파일 정리로 인해 오류가 생긴 부분이 있어 모두 수정해주었더니 오류가 해결되었습니다.
경로의 문제였던 것으로 보입니다.

 

 


문제 해결 과정 2 -

EntityMetadataNotFoundError: No metadata for "Jobposting" was found.

 

[문제]

포스트맨을 통해 api를 테스트하는데 나타나는 오류였습니다.

 

[시도 및 해결]

확인해보니 경로의 문제였습니다. 파일 정리를 하면서 같이 생긴 문제 같습니다.

 

orm.config.ts

import { TypeOrmModuleOptions } from '@nestjs/typeorm';
import { ConfigService } from '@nestjs/config';
import { SnakeNamingStrategy } from 'typeorm-naming-strategies';

async function ormConfig(): Promise<TypeOrmModuleOptions> {
  const configService = new ConfigService();
  const commonConf = {
    SYNCHRONIZE: true, // 엔티티에 있는대로 테이블을 생성을 할건지 정한다.
    ENTITIES: [__dirname + '/apis/domain/*{.ts,.js}'],
    MIGRATIONS: [__dirname + '/migrations/**/*{.ts,.js}'],
    MIGRATIONS_RUN: false,
  };

  return {
    type: 'mysql',
    database: configService.get<string>('DB_DATABSE_NAME'),
    host: configService.get<string>('DB_HOST'),
    port: Number(3306),
    username: configService.get<string>('DB_USERNAME'),
    password: configService.get<string>('DB_PASSWORD'),
    logging: true,
    namingStrategy: new SnakeNamingStrategy(), // createAt, updateAt 스네이크 케이스로 전환
    synchronize: commonConf.SYNCHRONIZE,
    entities: commonConf.ENTITIES,
    migrations: commonConf.MIGRATIONS,
    migrationsRun: commonConf.MIGRATIONS_RUN,
  };
}

export { ormConfig };

 

위 코드에서 ENTITIES의 경로를 수정해주었습니다.

 

[참고]

https://velog.io/@fj2008/NestJSentitymetadatanotfound-error.typeorm-error-%ED%95%B4%EA%B2%B0

 

NestJS/entitymetadatanotfound error.typeorm error 해결

entitymetadatanotfound error.typeorm error No metadata for "User" was found 라는 에러 로고가 떠서 찾아보니 entity를 설정할때 config파일의 위치를 entities라는 옵션에 명시를 해뒀어야했는데 이부

velog.io