분류 전체보기
-
[OOP] DTO, Entity와 객체지향적 사고Software Design 2022. 1. 10. 20:47
express, mongoose 두 스택을 사용할 때는 DTO와 Entity를 사용하는 법은커녕 개념조차 깊게 이해하고 있지 못했다. 그러다가 Nest.js, TypeORM 스택을 이용해서 개발을 하다보니 DTO와 Entity에 대해 알게 되고, 객체지향이란 무엇일까를 생각하며 코드를 작성하는 방식이 바뀌고 있다. 계층형 아키텍처에서 Controller는 DTO로 변환된 요청 body를 매개변수로 적절한 Service의 메소드를 호출하게 되고, Service는 DTO를 비즈니스 로직을 통해 Entity로 변환된 객체를 Repository를 이용해서 저장하게 된다. 이때 DTO를 Entity로 변환해보면서 객체지향적인 방법에 대해서 고민했던 점들을 정리해 보았다. 스키마 사용자가 회원가입 form을 작성해..
-
[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..
-
[Nginx] Proxy 상황에서 Connection 유지하기Backend 2021. 12. 13. 22:48
예전에 Connection 헤더 문제로 삽질 했던걸로 최근에 또 삽질을 하게 돼서 이번에는 확실하게 정리를 하려고 한다. 3줄 요약 Nginx는 upstream 서버로 proxy를 할 때 HTTP 버전을 1.0으로, Connection 헤더를 close로 변경해서 전달한다. Connection을 유지하기 위해서는 HTTP 버전은 1.1로, Connection 헤더는 없애주자. 관련 공식 문서: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_version 문제 상황 서버에서 클라이언트로 일정 간격으로 데이터를 내려주어야 하는 상황이어서 Server Sent Event 엔드포인트를 개발 중이었다. 로컬에서 문제없이 작동하는 것을 확인..
-
[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..
-
[JS] Trailing Commas에 대한 고찰 (feat.ESLint)Javascript, Typescript 2021. 12. 5. 18:00
eslint의 여러 설정들을 살펴보는 도중 comma-dangle이라는 옵션이 궁금해져서 구글링을 조금 해보게 되었다. 그러다가 medium에 올라온 한 게시글과 댓글들을 보고 재미있는 주제라고 생각이 되어서 이에 대한 내 생각을 글로 작성하게 되었다. Trailing-commas Trailing-commas 또는 Final-commas는 배열, 오브젝트 프로퍼티 등 콤마를 이용한 항목의 나열에서 마지막 항목에도 콤마를 붙이는 코딩 방식을 말한다(우리나라 말로는 후행 콤마? 정도로 부르는 것 같다). 자바스크립트에서는 이후에 더이상 요소가 존재하지 않아도 실행할 때 오류가 발생하지 않기 때문에 가능한 코딩 방식이다. MDN에 자세한 설명이 나와있다. // array에서의 trailing-commas co..
-
[Node.js] Readable Stream을 다루는 방법Node.js 2021. 11. 29. 20:38
Node.js는 데이터를 클라이언트에 전달하거나, 클라이언트로부터 데이터를 받을 때, 또는 파일을 읽고 쓸 때 Readable stream과 Writable stream을 사용하게 된다. 이번에 다룰 Readable stream을 이해하기 위해서는 먼저 Readable stream의 2가지 모드에 대해서 알아야 한다. Readable stream의 2가지 모드 Readable stream은 flowing과 paused 2가지 모드 중 하나로 존재한다. 다음 3가지 상황에서 Readable stream은 flowing 모드로 전환된다. 'data' 이벤트 리스너를 등록한 경우 Readable.resume() 메소드를 실행한 경우 Readable.pipe() 메소드를 통해 다른 스트림과 연결된 경우 그리고 ..