본문 바로가기

javascript

(72)
[typescript] generic + constructor 타입에서 생성자 파라미터 타입 추론 결론 생성자에 대한 타입을 지정할 때 반환 값 T만 지정하는 대신, 파라미터 P에 대한 정보도 함께 지정하면 ConstructorParameters을 통해 제네릭 타입의 생성자 파라미터를 추론할 수 있다. IConstructor = new (...args: any) => T 정의는 생성자 파라미터가 any로 고정되어 있어 추론이 발생하지 않으나, args의 타입도 추론하도록 제네릭 타입 매개변수 P로 분리해두면 ConstructorParameters가 이를 추론한다. // 생성자 파라미터도 인식하는 클래스 생성자 타입 정의 export type IConstructor = new (...args: P) => T; // 테스트 클래스 export class Bullet extends GameObject { ..
[typescript] ts2345 클라우드 강의 마지막 발표를 위해 기존에 aws 기반으로 구성한 뉴스 댓글 수집 파이프라인을 azure 기반으로 마이그레이션 하고 있다. 이 과정에서 뉴스 데이터를 수집할 때 타입 선언으로 정의한 내용이 있어 인터페이스로 변경해보았는데, 다음과 같은 에러가 발생했다. // 인터페이스로 변경한 타입 interface NLListOptions { query: string; ds: string; de: string; news_office_checked?: string; office_type?: string; mynews?: string; }; // 해당 객체를 이용하는 함수 export async function getNewsLinkList( variable_options: NLListOptions, dela..
[graphql] graphql N+1 문제와 prisma ORM의 해결 방식 Query optimization | Prisma Docs Query optimization How Prisma optimizes queries under the hood www.prisma.io graphql은 resolver을 적절히 연결하고, 이를 결합하여 한번의 요청으로 많은 데이터를 가져올 수 있다. 이때 resolver이 동작하는 과정에서 N+1 문제가 발생하므로, 이를 처리하기 위한 적절한 방법이 요구된다. N+1 문제 1번의 쿼리를 이용하여 A 엔티티를 N개 가진 배열을 읽어왔을 때, A엔티티에 대한 연관 관계 B 엔티티를 가져오기 위해 N번의 쿼리를 추가로 수행하는 상황이다. 간단하게 생각하면, 아래처럼 동작하는 상황이 N+1이라고 볼 수 있다. const users = db.user.f..
[nest.js & docker] window 환경에서 nest.js에 volume을 연결했지만 동작하지 않는 경우 결론 typescript 4.9 버전 정도부터 감시 옵션이 파일 시스템 기반 감시를 수행하도록 구성되어 있으나, window 환경에서 volume을 지정하면 해당 옵션이 제대로 동작하지 않는 듯 하다. tsconfig.json 파일에 다음 옵션을 추가해보자. "watchOptions": { "watchFile": "fixedPollingInterval" } 최신 버전의 nest.js을 사용하고 있다. docker-compose.yml 파일을 다음과 같이 작성했다. version: '3' services: backend: ports: - 8080:8080 depends_on: - my-redis # redis 동작해야 의미 O build: context: ./server dockerfile: Dockerf..
[typescript] Type vs Interface 면접에서 이 타입과 인터페이스를 사용한 이유에 대한 질문이 나왔다. 둘 사이의 차이를 깊게 생각해 본 적이 없어서, 이 부분을 이상하게 대답했던 점이 참 아쉽게 느껴진다. type은 몰라도 interface에 대해서는 선언 병합이라는 명확한 이점이 있는데, 이게 왜 문을 나온 후에 기억나는 걸까? 정말 너무 아쉽다. 이러한 배경에서 type과 interface의 차이에 대해 정리해보기로 한다. type alias https://www.typescriptlang.org/ko/docs/handbook/2/everyday-types.html#%ED%83%80%EC%9E%85-%EB%B3%84%EC%B9%AD 우리는 쉽게 type이라고 칭하지만, 공식 문서에서는 type alias라고 명시되어 있다. 타입 별칭..
[오늘의 삽질] jest.fn이 undefined을 반환하는 경우 jest를 이용하여 테스트를 진행하는데, mocked 객체가 동작하지 않는 현상이 발생했다. jest.fn( )에 반환값을 명시했기 때문에 반드시 함수가 값을 반환해야 하지만, 실제로는 undefined만 반환되는 문제가 있었다. 참고로 javascript에서 아무런 값도 반환하지 않으면 undefined이므로 정확히 말하면 mock 함수가 값을 반환하지 않는 문제로 볼 수 있다. describe('TokenInfoService', () => { let service: TokenInfoService; let repo: jest.Mocked; // 작성한 mock repository 객체 const mocked_repo = { save: jest.fn((tokenInfo: TokenInfo): Promis..
[javascript] Ajv 라이브러리 https://ajv.js.org/ Ajv JSON schema validator The fastest JSON schema Validator. Supports JSON Schema draft-04/06/07/2019-09/2020-12 and JSON Type Definition (RFC8927) ajv.js.org Ajv는 자바스크립트 진영에서 많이 사용되는 validator 라이브러리 중 하나로, JSON Schema 또는 JSON Type Definition (JTD)을 이용하여 객체의 타입을 표현한다. 두 표현 방식 모두 표준으로 등록되어 있기 때문에, 해당 표준을 이용한 표기법만 알고 있다면 Ajv를 사용하기는 매우 쉽다. JSON Schema 문서: https://json-schema.org..
[nestjs] nestjs swagger Swagger https://swagger.io/ 오픈소스 기반 문서 자동화 도구로, 바로 테스팅해볼 수 있는 환경도 함께 지원한다. 졸업 프로젝트에서 프론트엔드 분과 협업할 필요가 있다. 이전에 진행했던 프로젝트에서는 API 요청 및 응답에 대한 문서화가 제대로 되지 않아 API 구조에 대한 의견을 주고 받다가 시간을 많이 낭비한 경험이 있다. 작성해 둔 API 관련 정보가 개발 과정에서 변화를 많이 겪었지만 이에 대한 문서는 최신화하지 않아 발생한 문제다. 따라서 이번 프로젝트에서는 swagger을 도입하여 이러한 시행착오를 줄이고자 한다. @nestjs/swagger https://docs.nestjs.com/openapi/introduction nestjs는 추가 모듈 설치를 통해 swagger을..