타입스크립트 꽝꽝 11

http-proxy-middleware 사용하기

서론 현재 팀에서는 클라이언트가 하나의 프록시 서비스를 바라보고 있고, 해당 프록시 서비스가 요청에 따라 여러 서비스를 호출하고 있다. 때문에 한 서비스에서 새로운 기능이 생겨나면 프록시 서비스가 해당 기능도 호출할 수 있도록 업데이트를 해줘야 된다. 레거시라는 걸 알고 있지만 언제 제거될 지 모르고, 그 사이에 새 기능이 추가되면 프록시 서비스도 업데이트를 해야 하는 상태이기 때문에 업데이트가 없어도 알아서 프록시를 하는 방법이 없을까 팀원과 고민해보던 중 이 라이브러리를 알게 되었다. 이에 해당 라이브러리를 사용해보면서 공부한 것들을 간단히 정리해보기로 했다. http-proxy-middleware 라이브러리 HTTP 요청 및 응답을 프록시하는 데 사용되는 미들웨어 라이브러리. 서버 간에 데이터를 전..

[Typescript] TypeORM 0.3.x 메이저 Changes + 0.3.x에 대한 의견

TypeORM은 2022년 3월 18일을 기준으로 0.3.0 버전을 출시했다. (링크) 0.2.x 와 다르게 달라지거나 deprecated 된 부분이 많기도 하고, 릴리즈 노트 또는 공식 docs에 적혀있지 않고 issue에만 언급된 changes도 있어 마이그레이션할 때 참고했던 것들을 정리하기로 했다. (매번 느끼지만 typeorm 공식 문서는 업데이트도 느리고 설명도 간단하게만 적혀있어 불편할 때가 많다ㅠㅠ) 차례는 다음과 같다. Config 만들기 Repository 만들기 Repository 사용하기 0.3.x으로 바꾸는 게 좋을까? Config 만들기 0.2.x에서 config를 주입할 때 사용하던 ConnectionOptions은 0.3.x에서 deprecated되었다. 대신 DataSouc..

[TypeScript] MissingDriverError: Wrong driver: "undefined" given. 에러 해결

데이터베이스 세팅을 하는데 해당 에러 때문에 2주간 고생을 했었다. 다른 팀원들에게도 도움을 구했었는데 다름 팀원들 컴퓨터에서는 잘 돌아가서 혼란을 많이 줬었다... env 파일을 지정해놨음에도 왜 저렇게 뜨나 해서 디버깅을 돌려보니 env 파일을 왕따시키고 있는 것 마냥 변수를 아예 먹고 있질 못했다. 많은 방법을 시도했음에도 불구하고 에러가 해결되지 않아 편법으로 터미널을 이용해 직접 환경 변수를 먹이거나 docker compose 파일에서 env file을 지정해주는 식으로 해결을 했다. 그러나 언제까지고 편법으로 승부할 수는 없는 법이다... 시도했던 방법들은 아래와 같다. 여기를 많이 참고했다. 1) export = config 를 module.exports = config 로 변경 별 차이 없..

[TypeScript] 인터페이스를 활용한 커스텀 Repository 만들기(w.typeorm)

이전 게시물에서 커스텀 레포지토리를 활용한다고 했다. typeorm에서 커스텀 레포지토리 문서를 제공하긴 하나 typeorm에 지나치게 의존하게 된다는 느낌이 들어 인터페이스를 활용해보기로 했다. 인터페이스 user.repository.ts export interface UserRepository { findById(id: number): Promise; } 인터페이스를 사용하게 된 이유? - 확장성. typeorm 구현체를 사용하게 될 경우, 다른 orm 라이브러리로 갈아타게 될 일이 생길 때 리팩토링 비용이 많이 들 것이다. 또한 typeorm에서만 통하는 문법이 있어 다른 개발자가 봤을 때 이해하기까지 시간이 더 걸릴 수 있다. 이에 공통으로 통용되는 방식을 차용해 접근성을 높이고, 다른 라이브러리..

[TypeScript] ts-mockito 로 테스트하기. 그런데 트랜잭션을 곁들인

개발환경 - Nest.js - Jest (+) ts-mockito (+) typeorm-transactional-cls-hooked Jest에 기본으로 있는 Mock을 사용하면서 다양한 불편함(문자열로 메소드 주입하기, 모킹하는 과정이 구구절절 뭔가 많음...) 을 느꼈는데 조졸두님의 글을 보고 ts-mockito를 사용해보기로 했다. 자세한 사용법은 해당 라이브러리 공식 깃허브에서 확인할 수 있다. 테스트할 User Service import { InjectRepository } from '@nestjs/typeorm'; import { Injectable } from '@nestjs/common'; import { Transactional } from 'typeorm-transactional-cls-..

[ TypeScript ] TypeORM - Cannot read properties of undefined (reading 'column') 에러 해결하기

nest.js 웹 프레임워크를 활용해 프로젝트를 만들고 있었는데 어느 정도 도메인을 짜고 yarn start를 누르니 해당 에러가 떴다. [Nest] 24529 - 02/18/2022, 6:08:29 PM ERROR [TypeOrmModule] Unable to connect to the database. Retrying (1)... TypeError: Cannot read properties of undefined (reading 'id') at new Menu... (중략) at EntityMetadata.create (...link...) at EntityMetadataValidator.validate (...link...) 첫번째 시도 찾아보니 Controller, Service 단에서 리턴 타입..

[TypeScript] 에러 TS2589: Type instantiation is excessively deep and possibly infinite 해결하기

typeorm을 통해 레포에 도메인 정보를 저장하려는데 위와 같은 에러가 떴다. 잘 되던 코드가 갑자기 안 되는 거였기에 코드를 잘못 짠 줄 알고 계속 살펴봤지만 찾을 수 없었다;; 결국 타입스크립트가 또? 하면서 언어 탓하는 나쁜 개발자 마인드가 되었는데... 이번엔 정말로 타입스크립트가 타입스크립트한 거였다 🙄 결론부터 말하자면 타입스크립트의 버전 문제였고, 버전을 낮추면서 해결되었다. 에러가 날 당시 프로젝트의 typeorm과 typescript 버전은 다음과 같았다. 검색해보니 typeorm 깃허브에 관련 버그 이슈가 있었다. (당시 typescript 버전 3.6.x) TypeORM thwors “Type instantiation is excessively deep and possibly in..

[TypeScript] 어떤 ORM을 써야할까? (TypeORM vs MikroORM vs Sequelize)

타입스크립트로 간단한 웹 서비스 만들기를 해보고 있는데 ORM을 고를 일이 생겼다. 프로덕션에서는 TypeORM을 사용하고 있으나 내가 하는 건 개인 과제 같은 거라 다른 ORM을 사용해도 무방했다. 무작정 따라가도 되겠지만... 기술을 쓸 땐 어떤 이유로 쓰게 되었다, 를 알아둬야 기술에 확신을 가지고 사용할 수 있다고 봐 좀 더 알아보기로 했다. 찾아보니 타입스크립트를 지원하는 ORM 중에서 유명한 건 TypeORM, Sequelize(3.1 이상), MikroORM이 있었다. 보통 기술을 선택할 땐 아래 기준으로 고르게 되는 것 같다. 기술을 사용하는 풀의 크기 (다운로드수, Github Stars 등등) 성능 코드 스타일 풀의 크기 npm trends 를 확인하면 라이브러리, 모듈 별로 기간당 다..

[TypeScript] Decorator에 관하여

서론 스프링에서 어노테이션을 통해 AOP를 적용했던 기억이 있어 타입스크립트에서도 비슷하게 적용할 수 있는지 궁금해졌다. 사실 타입스크립트로 로또 뽑기를 구현하다가 try-catch가 너무 반복되는게 신경 쓰여서 AOP를 쓰려고 한건데, 결론적으로 적용은 못하고(ㅋㅋ) 공부만 했다. 나중에 써먹을 데가 있겠지...🥲 각설하고 AOP를 타입스크립트에 적용하기 위해 찾아서 알게 된 건 Decorator 였다. 타입 스크립트 공식 문서에선 Decorator를 이렇게 소개한다. 데코레이터는... - 클래스 선언과 멤버에 어노테이션과 메타-프로그래밍 구문을 추가할 수 있는 방법을 제공한다. - 클래스 선언, 메서드, 접근자, 프로퍼티 또는 매개 변수에 첨부할 수 있는 특수한 종류의 선언이다. - @expressi..

[TypeScript] Java처럼 enum 사용하기

문제 자바를 쓸 때 enum으로 열거형 상수를 줄곧 사용했었다. // 추억의 로또 미션~ public enum WinningBoard { ZERO(0, 0, ""), FIFTH(3, 5_000, "3개 일치"), FOURTH(4, 50_000, "4개 일치"), THIRD(5, 1_500_000, "5개 일치"), SECOND(5, 30_000_000, "5개 일치, 보너스 볼 일치"), FIRST(6, 2_000_000_000, "6개 일치"); private final int hitCount; private final int reward; private final String message; WinningBoard(int hitCount, int reward, String message) { this..