TypeScript
-
[TypeORM] QueryBuilder 사용시 return 타입 구체화하기Javascript, Typescript 2022. 2. 10. 17:28
QueryBuilder의 getOne(), getMany()를 이용해서 데이터를 조회할 때 리턴되는 객체의 타입은 항상 엔티티 클래스의 인스턴스이다. 그렇기 때문에 특정 컬럼들만 가져오는 경우, 잠재적인 문제가 일어날 수 있다. 반환되는 객체가 엔티티의 인스턴스인 경우 일어날 수 있는 문제는 무엇이고 이것을 어떻게 해결할 수 있는지 알아보자. 가능한 문제상황 데이터베이스에 게시글(Post)이 등록되어있고, 이 게시글들의 목록을 조회하는 API를 개발해야한다. 이때, 게시글의 목록에서는 게시글의 내용(content)은 가져올 필요가 없다. 위와같은 요구사항이 있고, Post 테이블의 스키마는 다음과 같다. 데이터는 3개만 넣어놓았다. 다음과 같이 Entity를 정의한다. @Entity() export cl..
-
[TS] 모듈 import 경로에 별칭 사용하기(VS Code)Javascript, Typescript 2022. 1. 26. 23:38
Typescript나 Javascsript를 사용할 때 디렉토리 계층이 깊어질수록, 다음과 같이 지저분한 import 문의 경로를 경험할 수 있다. 모듈의 경로를 표현할 때 사용자의 개발환경에 의존적인 절대경로가 아닌, 현재 스크립트 파일을 기준으로 한 상대 경로가 사용되기 때문에 이와 같은 경로가 된다. 이런식으로 표현된 경로들은 다음과 같은 문제점이 있다. 프로젝트의 루트 경로를 기준으로 어느 경로에 있는 모듈인지 파악하기가 힘들다. 현재 파일의 경로가 바뀌면 import 문의 모듈의 경로를 바뀐 경로를 기준으로 다시 작성해 주어야 한다. 하지만 타입스크립트의 tsconfig를 조금만 수정하면 프로젝트의 루트 경로를 기준으로 절대경로로 표현할 수 있다. 이때 이 절대경로를 별칭(alias)라고 부른다..
-
[TS] class-validator의 활용과 검증 옵션Javascript, Typescript 2022. 1. 3. 22:21
class-validator는 joi의 Typescript 버전으로, 데코레이터를 이용해서 편리하게 오브젝트의 프로퍼티를 검증할 수 있는 라이브러리이다. 웹 서버에서 들어오는 HTTP 요청의 JSON body 검증할 때 굉장히 유용한데, Nest.js에서는 빌트인 ValidationPipe가 이 두 라이브러리를 이용한다. 이번에는 class-validator의 활용 방법과 검증 옵션을 알아보자. 기본 사용법 import { IsEmail, IsOptional, IsString, Min } from 'class-validator'; class CreateUserDto { @IsString() name: string; @Min(1) age: number; @IsEmail() @IsOptional() emai..
-
[Jest] object에 대한 다양한 matcher 함수들Javascript, Typescript 2021. 12. 31. 14:07
facebook에서 개발 및 유지보수 중인 자바스크립트의 대표적인 테스팅 라이브러리인 Jest는 다양한 matcher함수를 제공한다. 그중 두 오브젝트를 비교할 때 사용할 수 있는 다양한 matcher 함수 중 비슷하면서도 다른 toBe, toEqual, toStrictEqual, toMatchObject 함수의 동작과 그에 따른 차이점을 알아보자. toBe() 기본형을 비교할 때 가장 많이 사용되는 toBe 함수는 두 값이 같은지 비교한다. 비교 대상이 기본형(primitive type)이라면 두 원시 값이 같은지 비교하고, 오브젝트(object type)라면 같은 오브젝트에 대한 참조인지를 비교(Shallow compare)한다. 두 값에 대해서 === 과는 다르게 동작하는 Object.is를 수행한..
-
[TypeORM] repository.save()의 동작과 upsert()Javascript, Typescript 2021. 12. 19. 13:44
TypeORM에서 Data Mapper 패턴으로 repository를 이용해서 엔티티를 다루는 경우, 새로운 엔티티를 생성하고 데이터베이스에 저장할 때 repository.save() 메서드를 사용하게 된다. const newUser = new User(); await userRepository.save(newUser); 또한 save 메서드는 다음처럼 엔티티를 조회한 후에 엔티티에 변경을 가하고 변경사항을 저장할 때에도 사용할 수 있다. const user = await userRepository.findOne(); user.changeName('New Name'); await userRepository.save(user); 개발자가 실제 쿼리를 작성하지 않아도 되는 ORM을 사용할 때는, 실제 ORM..
-
[TypeORM] Relation 관계에서 Join을 하는 방법들Javascript, Typescript 2021. 12. 8. 22:27
2022.09.28 TypeORM 2.41 버전을 기준으로 작성된 글입니다. 요새 Node.js를 안하다보니... 최근에 3.X 버전이 상당히 변경되어 나온걸 확인해서 3.X 버전에는 맞지 않을 수 있습니다. RDBMS를 사용할 때 테이블 간의 참조를 통한 관계는 필수적이다. Node.js 진영에서 가장 핫한 ORM 라이브러리인 TypeORM에서 관계가 맺어져 있는 테이블을 다음 4가지 Join 하는 방법들을 통해 실제 쿼리는 어떻게 구성되는지 알아보자. find* + 옵션 Lazy Loading Eager Loading Query Builder 환경설정 예제 데이터베이스는 PostgreSQL을 사용하고 team과 member라는 테이블을 다음과 같이 준비한다. CREATE TABLE team( id s..
-
[TS] Typescript의 메소드 오버로딩Javascript, Typescript 2021. 11. 4. 22:41
최근에 유용하게 사용하고 있는 TypeORM 이라는 Typescipt의 ORM 라이브러리는 데이터를 저장하는 함수로 repository 클래스의 save라는 메소드를 제공한다. 이 save 메소드는 공식문서에서 확인할 수 있는 것처럼, 매개변수로 단일 객체 또는 배열 두 가지를 다 넘겨줄 수 있기 때문에 굉장히 유용하다. 그리고 VS code 같은 IDE의 Intellisense를 통해, save메소드에 단일 객체를 넘겨주면 단일 객체를 resolve하는 Promise를, 배열을 넘겨주면 배열을 resolve하는 Promise를 반환한다는 것을 알 수 있다. 그렇다면 타입스크립트 컴파일러는 어떻게 단일 객체를 넘겨주면 단일 객체를, 배열을 넘겨주면 배열을 반환한다는 것을 알고 있는 걸까? save 메소드..
-
[TS] Typescript의 타입 검사Javascript, Typescript 2021. 11. 1. 20:58
타입스크립트의 공식문서에서 말하기를, Typescipt의 타입 검사는 해당 값의 ‘형태’에 관심을 갖는 덕 타이핑(구조적 타이핑)을 따른다고 한다. One of TypeScript’s core principles is that type checking focuses on the shape that values have. This is sometimes called “duck typing” or “structural typing”. Typescript의 이 타입 검사 시스템은 개발자에게 편리함을 줄 때도 있지만, 개발자가 예상하지 못한 곳에서 버그를 일으킬 수도 있다. 덕 타이핑(Duck typing) 또는 구조적 타이핑(Structural typing)이라고 하는 타입스크립트의 타입 체킹 방법에 대해 알..