본문 바로가기

Backend

(112)
must be a number conforming to the specified constraints params.ts에 담아뒀던 파일(dto도 가능)에 다음과 같이 정의를 했었다. 해결 전 export class CompanyRequestParams extends CollectionAddressOrSlugParams { @IsNumber() @IsOptional() readonly tokenId: number; ... } Run을 해보니 must be a number conforming to the specified constraints 라는 400 에러가 떴다. number Type에 대해 뭔가 문제가 있는걸까 싶어서 구글링을 해보니 type 변환의 문제였으며 @Type 데코레이터로 Number로 type을 변환해줘야 했다. 해결 후 export class CompanyRequestParams ext..
sort 쿼리 날릴때 정렬 createdAt(생성시점)을 기준으로 ASC(오름차순 정렬)을 하려면 아래와 같이 postman에서 설정하면 된다.
keyof와 typeof 파일을 둘러보다보니, 다음과 같은 코드가 있었다. export const ActivityType = { ... } as const; export type ActivityType = (typeof ActivityType)[keyof typeof ActivityType]; 도대체 typeof와 keyof가 무엇이냐 말이다! 결론적으론, ActivityType 내부에 쓰여진 항목들을 다른 파일에서 import 해와서 잘 쓸 수 있다는 것. 일단 정의를 보자면, typeof : 객체 데이터를 객체 타입으로 변환해주는 연산자 객체는, 객체 자체를 type으로 쓸 수 없는데 객체에 쓰인 type 구조를 그대로 가져와 독립된 타입으로 만들어 사용하고 싶을때 사용한다 * class는 class 자체가 객체 type이 ..
다른 api 호출해오는법 (feat. httpService) 내가 작성한 api가 다른 곳에서 작성된 api를 필요로 할 때가 있다. 그때 바로 사용할 수 있는 것이 httpService이다. import { HttpService } from 'nestjs/axios'; nestjs의 axios 라이브러리에 HttpService가 존재한다. 이를 사용하기 위해서는 constructor에 아래와 같이 주입을 해주어야 한다 private readonly httpService: HttpService, 대체적으로, 이런 형태를 띈다. const 변수명 = await firstValueFrom(this.httpService.get(`${this.configService.get('url의 제일 루트 디렉토리 경로')}/해당 url의 디렉토리 경로/api 이름`)); firs..
QueryFailedError: relation DB이름 does not exist api를 실행하던 중에 ERROR [LoggingInterceptor] QueryFailedError: relation "champion-admin" does not exist 라는 에러가 발생하였다.  처음에는 relation이 존재하지 않는다? 나 이 테이블에 relation 설정한 적 없는데 하며 의아하던 중 다음과 같은 점들을 발견할 수 있었다. 1) PostgreSQL에 테이블만 만들어놓고 안에 컬럼이 없음 2) entity.ts 파일에서 @Entity('champion-admin')으로 되어있었고, table 이름은 championship_admin으로 되어있었음. 그래서 각각에 대해 1) 테이블 안에 컬럼 추가 2) entity.ts 파일 -> @Entity('champion_admin')..
param과 query의 차이점 REST API를 작성하면서 해당 메서드에 @Param과 @Query는 빠질 수 없는 요소다. async hello(@Param or @Query) 이런 식으로 종종 쓰는데 둘은 어떤 차이가 있을까? Param - parameter의 줄임말. 함수나 메서드에 전달되는 값이나 변수를 나타낸다 - 웹개발에서는 URL의 일부로 파라미터를 전달하는 경우가 있음. 경로 내에 포함되어 있음 https://example.com/user?id=123 위에서는 id가 파라미터이다. Query - DB에서 정보를 검색하거나 필터링하기 위해 사용되는 매개변수나 조건을 나타낸다. - DB 질의(query)를 수행할때 사용 - 웹개발에서는 URL의 일부로 쿼리 문자열을 전달하는 경우가 많다. 쿼리 문자열은 일반적으로 ? 로 시..
api.module.ts에서 global:true로 넣기 @Module({ imports: [ CommonModule, ScheduleModule.forRoot(), { module: ChampionDataModule, global: true, }, { module: AuthModule, global: true, }, ... 일일이 module.ts 파일에서 정의를 해주지 않아도 global:true 옵션에서 해당 모듈을 모두 가져올 수 있다고 한다. 다만 module : 모듈 이름 에서 모듈 이름과 관련된 파일이 정의되어 있어야 한다. 예를 들면 ChampionDataModule에서 champion-data.module.ts 파일이 정의되어 있어야 하고 Auth 모듈도 auth.module.ts 파일이 정의되어 있어야 한다.
rabbitMQ) prefetchCount란? event-lisenter repo에서 app.connetMicroservice {} 내부에 prefectCount라는게 있었다. 이것을 처음 보아서 이번 기회에 정리해두려고 한다. prefetchCount:1로 설정이 되어있었는데, 서버당 한 번에 1개의 메시지를 처리한다는 의미이다. 이를 5로 조정한다면, 서버당 한 번에 5개의 메시지를 가져와 처리할 수 있다는 의미이다. 그렇다면 여기서 의문이 생겼었다. 서버당 메시지를 받는 개수가 정해져 있는거면, 한 서버의 하나의 메시지만 온다는 것이 잘 와닿지 않는다. => 이는 여러 개의 이벤트가 큐에 쌓여있을 때 동시에 몇 개까지 땡겨서 작업하겠는가?에 대한 것이다. prefetch:5로 설정했을 경우 1개만 작업하던 것을 동시에 5개까지 메시지를 땡겨와 ..
role이 단수개가 아닌 복수개 처리 role이 원래 단수개였다가 roles로 복수개 처리해야 하는 상황이 왔다. roles를 그냥 string[]으로 받으면 될 줄 알았는데, 이미 있는 메서드에서 role:string으로 처리하고 있었기 때문에 따로 이벤트를 수신할때 처리가 필요했다. const roles = []; for (const role of event.returnValues.roles) { roles.push(this._parseHexToUtf8(role)); }  const payload: ~ payload(constants) = { roles: roles, ... }; 위에서 따로 foreach처럼 하나씩 꺼내와서 리스트에 저장하는 로직을 작성해주고, payload 부분에서는 갖다쓰기만 하면 된다.
event listener와 handler에서 이벤트 수신하기 위한 Dev 환경 셋팅 모노레포인데, 모듈로 쪼개졌기 때문에 evenet listener와 handler repo를 각각 clone받아 작업해야 하는 상황이다. 그래서 event listener와 handler 레포를 각각 다운받고 Dev 환경 셋팅을 하였다. 1. 제일 기본이 되는(.development.env가 먼저 쓰여진) 파일을 listener 레포의 최상위 env 파일 하위에 .development.env 파일을 만들고 똑같이 복사해온다. 2. postgresConfig 파일도 복사해온 환경과 같이 맞춰준다. 특히 ssl 부분을 잘 봐야한다. 3. 복사해온 곳으로부터 가져온 dev db 연결정보를 똑같이 입력해주어 Dev DB를 연결해준다. 그런데, 아래와 같은 문제가 발생하였다. [Nest] 88887 - 08/31..