목록개발/nest.js (18)
상당히 어려웠던 부분이다. 내가 구현했던 ERD에는 일 대 일 관계와 일 대 다 관계는 없기에, 다 대 일 / 다 대 다 관계에서 다룬다. 다 대 일 다 대 일로 작업한 내용은 카테고리였다. // dto create-product.input.ts @Field(() => String) productCategory: string; // dto 에 카테고리 추가 // product.service.ts create 함수 내부에 추가 create({ const { productCategory, ...product } = createProductInput; // 구조 분해 할당 } const result = this.productsRepository.save({ ...product, productCategory: ..
미래의 나에게 검증을 하기 위한 두 라이브러리 yarn add class-validator yarn add class-transformer 오늘은 오늘 과제였던 CRU API 구현 / TypeORM 에 대해 리뷰한다. DTO / interface 먼저 본격적인 API 구현에 앞서, 이전과 같이 dto 와 Interface 를 작성한다. ( create 를 위한 dto / update 를 위한 dto) 워낙 불려다니는 곳이 많은 친구들이라 먼저 작성해두는 것이 마음 편하다. // dto/create-product.input.ts import { Field, InputType, Int } from '@nestjs/graphql'; import { Min } from 'class-validator'; @Inp..
오늘은 저번에 업로드한 ERD를 기준으로 MySQL에 엔티티를 적용해보았다. // 상품 / product.entity.ts @Entity() // 엔티티 임을 선언 export class Product { @PrimaryGeneratedColumn('uuid') // uuid 를 통해 id 생성 id: string; @Column() product_Name: string; // 중략 // } 엔티티 작성은 다음과 같다. 데코레이션을 통해 Entity 를 선언하고, PrimaryGeneratedColumn 을 통해 PK임을 선언함과 동시에 임의의 id 를 만드는 uuid 를 생성한다. 그리고 그 아래로 콜론 값으로 들어오는 엔티티를 각 타입에 맞추어 작성해준다. 관계 작성 다음은 관계 작성에 대해 다룬다...
집계 쿼리 집계 쿼리란 그 이름처럼 산술로써 집계하는 쿼리다. count : 행들의 갯수를 구하기 위해 사용 sum : 행들의 평균을 구하기 위해 사용 avg : 행들의 평균을 구하기 위해 사용 max : 행들의 최댓값을 구하기 위해 사용 -- 예시 집계 쿼리 -- 치킨집에 치킨이 몇 마리있는지 출력 select count as 치킨수 from 치킨집 -- where 을 통해 조건을 둘 수도 있다 -- 서울에 있는 치킨집 치킨이 몇 마리있는지 출력 select count as 치킨수 from 치킨집 where 지역 = 서울 -- 매출액 평균 select avg as 평균 from 매출액 정렬 쿼리 정렬을 위한 쿼리다. select 로 데이터를 조회할 때, order by '기준점' 을 통해 정렬이 가능하..
오늘은 어제 과제로 진행했던 내용을 복기해본다. NestJS와 docker 내 MySQL 과의 연동 dto / entity / interface 작성 API 틀 작성 NestJS와 docker 내 MySQL 과의 연동 Docker 를 통해 MongoDB 와 연동을 했던 기억이 있어서 그리 어렵진 않았다. MySQL 을 이용할 것이기 때문에, docker Database 이미지를 mysql 가장 최근 버전으로 설정해주고, MySQL 부팅 시 필요한 데이터 베이스 이름 / 비밀번호를 입력해준다. * mongoDB 가 포트번호를 27017 을 사용했던 것처럼, MySQL 포트번호인 3306 을 입력해준다. 추가적으로 환경변수로 모아놨던 데이터들을 MySQL을 다루기 위한 TypeORM 에 아래와 같이 작성해주..
Generic 제네릭을 사용하면 다양한 방식으로 자신만의 타입을 사용할 수 있다. 제네릭은 Type 을 함수의 파라미터처럼 사용할 수 있는 것을 의미하는데, 기본 타입과 Generic 을 적용한 타입을 비교해보고자 한다. 기본 타입 문자 / 숫자 / 불리언 || any || unknown // 1. 문자/숫자/불린 기본 타입 const getPrimitive = (arg1: string, arg2: number, arg3: boolean): [boolean, number, string] => { return [arg3, arg2, arg1]; // type 으로 정해놓은 값만 반환이 가능하다. }; const result = getPrimitive("철수", 123, true); // // // 2. a..
린터와 포멧터 적용 이유 혼자하는 개발이라면 상관 없지만, 대부분의 개발은 타 개발자와 협업을 통해 진행하게 된다. 허나 각기 코드를 작성하는 방식이나 습관들이 다르기 때문에, 통일성이 떨어질 뿐더러 읽는데도 시간이 오래걸릴 수밖에 없게 된다. 이를 해결하기 위해 등장한 것이 린터와 포멧터. 그리고 린터 중에서는 eslint , 포멧터 중에서는 prettier가 대표적이라 이 둘은 NestJS에도 포함되어 있다. 린터 eslint 는 수많은 린터 중에 하나로, 코드 작성 규칙을 설정할 수 있는 기능을 제공해준다. 예를 들어, import 순서 / 느슨한 동등 연산자 '==' 금지 등이 설정 가능하다. 간단히 얘기하면, 린터는 일관성 있는 코드의 퀄리티를 보장하는 것을 돕는다고 볼 수 있다. eslint ..
decorator 데코레이터는 구조를 수정하지 않고 기존 객체에 새로운 기능을 추가할 수 있도록 하는 디자인 패턴이다. 일반적으로 데코레이터는 함수의 정의 전에 호출되며, 함수를 인수로 얻고 새로운 함수를 돌려주는 구조다. (어찌보면 고차함수 | 콜백함수와 비슷한 느낌이다.) 정리하자면, 데코레이터는 코드를 꾸며주며, 타입스크립트에서는 그 기능을 함수로 나타내는 것. @(골뱅이)로 표현되며, 그 안에는 메소드 / 프로퍼티 / 파라미터 / 클래스가 들어갈 수 있다. 데코레이터 작성 예시 데코레이터 콘솔 결과 CatController 클래스 위에 데코레이터 Controller 가 작성된 모습. CatController 클래스가 함수의 매개변수로 받아져서 함수 Control 내부에서 사용됨으로, Control..