본문 바로가기

모카 스터디/Nest

slack_nest_study_zerocho

 

Slack 클론 코딩 [백엔드 with NestJS + TypeORM]

에러질문법

 

 

Express와의 비교 

 

mysql2는 node와 mysql을 연결시켜주는 드라이버이지 그 자체가 데이터베이스가인다.

 

 

nest는 알아서 해주는 마법이 많다.

NestJS 세팅하기

 

express보다 fastiy가 더 빠르지만 nest와 express를 사용하면 그 속도가 약간 극복되니 큰 문제가 없다.

 

핫 리로딩 설정

nodemon 과 같은 기능을 하는 핫리로딩,
파일의 이름수정 또는 생성 삭제시에는 다시 켜는것을 추

 

 

 

 

Controller 기본

 

서비스를 분리하는 이유, 컨트롤러 장점

 

 

서비스는 요청과 응답에 대해서 모르게 구성하는게 좋다.

테스트가 편해진다.

nest에서는 인터셉터만 만들면 저런 응답 함수나 로직을 따로 구성하지 않아도 된다.

아래와 같이 json으로 변환안해도 자동으로 json형식으로 반환해준다.

 

 

ConfigModule사용하기 (dotenv진화판)

 

 

기본적으로 모듈은 그냥 import해주면 되지만

설정이 필요한 모듈들은 forRoot나 register같은 함수가 붙는다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

process.env도 객체이지만 nest와는 관련이 없는 객체이다 

그래서 nest에서 제공해주는 configService와 같이 nest에서 제공해주는걸 사용하여 nest가 관리하게 하는걸 추천

 

test를 위해 !

 

 

 

 

 

loggerMiddleware로 mogran처럼 로깅하기

 

미들웨어는 라우트보다 먼저 실행이 된다.

 

연결하기

 

 

HTTP와같은 context를 보고 서로 관련있는 log를 추려낼 수 있다.

 

 

 

implements, injectable(DI) 알아보기

 

 

 

 

 

Q&A

 

typeorm이 repository를 대신한다.

 

 

 

 

섹션 1 API 설계하기

Http 요청 리스트(ajax)

WebSocket api

 

 

 

 

 

모듈, 컨트롤러 생성하기

 

nest는 컨트롤러를 만들기 이전에 모듈을 먼저 만든다고 생각을 해야한다.

컨트롤러에서는 req를 안쓰는게 좋다.===< 커스텀 데코레이터

 

 

 

 

 

Body,Query,Param

 

nest에서 다른걸 가져다 쓰려면 nest에게 의존선 주입을 해주어야 한다.

 

 

나머지 API설계하기

변수명은 길게 짓는게 좋은 습관이다.

 

 

 

API문서만들기(swagger)

데코레이터 몇개를 붙히면 swagger를 만들 수 있다.

 

main.ts

 

이 모듈에서 만든걸 다른 모둘에서 사용하고 싶으면 exports를 사용하면 된다.

 

커스텀 데코레이터 만들기

차후 테스트 등등에서 생각해보면 @Req는 없는게 좋다.

그래서 이런걸 해결해 줄 수 있는 방법으로 커스텀 데코레이터가 있다.

 

 

User라는 데코레이터를 만들었고 그럼 request.user를 그냥 사용할 수 있다.

 

 

 

 

 

 

http와 websocket이 같이 돌아갈때 .switch뒤에를 변경해서 수정 가능 

 

 

 

인터셉터 사용하기

 

단순히 컨트롤러 실행전과 실행 후에만 넣어주는 미들웨어와 다르게

인터셉터는 컨틀롤러 실행전,후에 넣어줄 수 있다.

 

즉, 세로로 공통된 상황을 처리 

 

 

주로 컨트롤러 다음에 실행할거에 인터셉터를 사용한다.

EX) 응답을 보낸후 마지막으로 한번더 조작을 하고싶을떄.

 

 

 

 

에러를 처리하는대도 활용 될 수 있다.

하지만 대부분의 에러 처리는 expectionfipter에서 한다.

 

 

 

 

 

 

 

Q&A(AOP설명)

 

 

 

 

 

 

섹션2  TypeORM 사용하기

Typeorm entity(자동생성하는법)

typeorm-model-generator를 사용하여  데이터 베이스를 javascript 클래스로 만든다.

 

 
npx typeorm-model-generator -h imm(호스)zonaws.com -d immersion_DB -p 3306 -u admin -x   (비밀번호_! -e mysql -o ./mymodel

                                                                                        (호스트)                  (db이름)           (사용자명)       ((비밀번호)     

이런게 생긴

 

 

 


  @Column('varchar', { name: 'email', unique: true, length: 30 })
  email: string;

에서 name은 db 컬럼이다.

그리고 name을 Name으로 변경도 된다. DB에서는 name이지만  TS상에서는 다름 이름으로 개발 할 수 있다.

 

 

typeorm 관계 설정하기

many to many가 버그가 많이 생기는데 그럴 경우 on to many 두개로 나누는 방법이 있다.

 

 

이부분 공부가 많이 필요한

 

erdcloud.com에서 erd만들어 볼수 있다.  따로 erdcloude 공부를 해보

 

 

typeorm커넥션 맺기

공식문서에 잘 나와있어서 그대로 진행하면 굿 

appmodule에 모듈과 설정을 한다.

 

 

 

 

 

 

sychronize true, false 잘 체크 하기.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

typeorm seeding, migration

seeding즉 초기 데이터 서정을 위헤서는 위의 패키지를 다운받아야한다.

 

 

 "db:create": "ts-node ./node_modules/typeorm-extension/dist/cli/index.js db:create -d ./dataSource.ts",
    "db:drop": "ts-node ./node_modules/typeorm-extension/dist/cli/index.js db:drop -d ./dataSource.ts",
    "seed": "ts-node ./node_modules/typeorm-extension/dist/cli/index.js seed -d ./dataSource.ts",
    "schema:drop": "ts-node ./node_modules/typeorm/cli.js schema:drop",
    "schema:sync": "ts-node ./node_modules/typeorm/cli.js schema:sync",
    "db:migrate": "npm run typeorm migration:run -- -d ./dataSource.ts",
    "db:migrate:revert": "npm run typeorm migration:revert -- -d ./dataSource.ts",
    "db:create-migration": "npm run typeorm migration:create -- ./src/migrations/",
    "db:generate-migration": "npm run typeorm migration:generate -- ./src/migrations -d ./dataSource.ts"

그리고 packge.json에 script도 추가해 준다 

 

 

seeding을 위해 작성 

 

 

테이블을 수정할 떄는 sql로 db에서 변경후 코드의 entity도 변경해야한다.

 

 

migration ==> 

 

 

 

 

회원가입 만들기

 

service에서 벨리데이션 처리를 dto단에서 처리 가능한다.

 

 

 

 

 

 

 

 

 

 

usermoduel에서 레퍼지토리 인젝션 하는법

 

 

 

 

 

Exception Fiter

 

미들웨어도 익셉션 필터에서 에러처리 된다.

 

class-vaildator