Javascript, Typescript
-
[JS] 알쏭달쏭 자바스크립트 this 바인딩Javascript, Typescript 2022. 3. 19. 14:51
Java, C# 같은 객체지향 프로그래밍 언어들은 this라는 키워드를 사용한다(Python 에는 self라는 키워드가 있다). 이때 this가 의미하는 것은 해당 코드를 실행하는 클래스의 인스턴스를 나타낸다. 자바스크립트에도 this라는 키워드가 있는데 자바스크립트의 this는 앞선 개념에 익숙해져있는 사람이 이해하기에는 다소 까다로운 개념이다. 마치 학부 초창기에 C언어 수업에서 포인터를 만났을 때 벽을 느꼈던 것처럼, 처음 자바스크립트의 this를 만나게 되면 혼란스러움에 벽을 느끼게 된다. 도대체 자바스크립트에서는 this를 어떻게 사용해야 하는지 알아보자. Javascript의 this 바인딩 function foo() { const a = 10; console.log(this.a); } foo..
-
[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)라고 부른다..
-
[TypeORM] Entity의 constructor를 사용할 수 있을까?Javascript, Typescript 2022. 1. 13. 23:56
TypeORM의 Entity에 대한 공식문서를 찬찬히 읽어보면 다음 문구를 찾을 수 있다. 엔티티 생성자의 인자들은 반드시 옵셔널이어야 한다라니... 굉장히 의미심장한 문구가 아닐 수 없다. 다른 말로는 생성자의 인자들은 반드시 nullable 이어야한다 라고 생각할 수 있다. 그렇다면 인스턴스 생성시에 유효성 검증은 어떻게 하지? 이 경고가 의미하는 것이 무엇인지, 그리고 문제를 해결할 수 있는 방법은 무엇인지 알아보자. 무슨 소리일까? 다음과 같은 간단한 엔티티가 있다. @Entity() export class User { @PrimaryGeneratedColumn() id: number; @Column() name: string; @Column() age: number; } TypeORM의 Gett..
-
[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..