BackEnd Enginner그림 추가NodeJS그림추가누구나(오픈 소스)여러OS(cross-flatform) -> cross-flatform이란 MacOS, Linux, Window 의미javascript를 실행 가능(JS runtime) -> Typescript 기
세팅 기본 nodeJS 서버 만들고 Path별로 다른 응답 변환 1_server.js E
모듈단위로 관리를 하기 때문에 Appcontroller는 사용하지 않는다.위코드를 이용해서 각각의 모듈별로 관리를 한다.
GET http://localhost:3000/posts (Query)다수의 PostGET http://localhost:3000/posts/11 (Query)11이라는 ID를 갖고 있는 Post 하나를 가져옴POST http://localh
결론 : Module에 Controller와 Service Model을 넣어주면 SpringBoot의 DI와 IoC 처럼 관리를 해줘서 주입을 해줌, 동작원리는 SpringBoot와 비슷
일반적인 인스턴스화DI어디선가 B를 A에게 주입이때 A에서 B를 인스턴스화 하는 것이 아님IoC제어역전, 즉 B를 NestJS가 알아서 A와 C에 주입을 하는 것A와 C 입장에서는 본인 의지로 B를 받는 게 아니고 B가 주입되는 것제어역전 의미 이해 필요IoC and
Ram은 영구 저장 불가능, 따라서 HDD/SSD에 데이터를 저장프로그램 재실행을 하면 Ram은 Reset그럼에도 Ram을 사용하는 이유는 빠르기 때문에HDD/SSD에 영구저장하는 방법SQLdocker를 작성하면 어떤 OS에서든 동일하게 작성할 수 있음장점인 이유 :
app.module.tsentitiesposts.controller.ts + serviceposts.module.tsusers.controller.ts + serviceusers.module.tslaunch.json 추가 클릭 (Node.js)디버깅 하면됨
즉, DB에 들어갈 때 Computer인지 Airplane인지 구분을 하기 위해서 type를 넣는 것어디다가 FK를 들고 있을거야?!! @JoinColumn()user 조회시 profile도 같이 조회user에 posts들이 연결되어서 나온다tag의 posts를 볼수
디버거 추가 launch.json 추가 클릭 (Node.js) 디버깅 버튼 누르고 시작
session JWT session 생성 방식 session 사용 방식 JWT 생성 방
auth.const.tsmodulecontroller service
https://docs.nestjs.com/pipesauth/pipe/password.pipe.tsauth/auth.controller.ts사용할일 거의 없음new DefaultValuePipe인 경우는 매번 새롭게 생성을 하는 것이고 ParseIntPipe경
이제 createdAt과 updatedAt을 추가해봅시다.포스트맨으로 테스트를 해봅시다. 새로운 회원가입을 실행하고 쿼리를 실행합시다. 그러면 다음과 같이 잘 들어있는 것을 알 수 있습니다.참고로 시간이 다릅니다. 왜냐하면 createdAt과 updatedAt은 UTC
basictokenguards bearertokenguards
이전에 Guard를 구현할 때 AccessTokenGuard에는 사용자 정보를 받는 코드가 있었다.AccessTokenGuard는 BearerTokenGuard를 상속하기 때문에 request에는 사용자의 담는 부분이 있다. req.user = user;따라서 post
오른쪽 상단 NestJS Environment 바꾸기기존에 있던 모든 url 주소 {{host}}로 바꾸기testaccessToken과 refreshToken을 empty하게 만든 이유: 로그인시 발급되는 토큰을 넣기 위해서/auth/register/email 에도 동
yarn add class-validator(검증) class-transformer(변환)posts/dto/create-post.dto.tscontrollermain.tsgithub.com/typestack/class-validator -> validator-decor
이전장에서는 class-validator를 배웠습니다. 말 그래도 검증을 하는 것입니다. class-validator을 개발한 똑같은 개발자가 class-transformer을 만들었습니다. 이것은 변형을 하는 것입니다. 우리는 가장 많이 사용하는 expose와 exc
Pagination 이론 데이터를 한번에 전부 주면 성능이 느려지고 메모리가 터지는 문제를 해결하기 위해 Pagination 사용 Page based pagination 가장 기본적인 형태 요청시 데이터 개수, 몇 번째 페이지인지 명시가 필요 단점으로는
이번에는 좀 더 간단한 page 기반의 pagination을 알아보겠습니다.먼저 paginatePosts()의 내부 코드를 전부 잘라내기 합니다. 그리고 아래와 같은 상태로 만들어 줍니다.posts.service.tsDTO를 받을 때 DTO의 값을 보고 page 기반의
지금부터는 pagination 코드를 변경해보겠습니다. 왜냐하면 Cursor 페이지네이션 코드만 봐도 대략 30줄이 넘는 코드를 매번 작성해야 합니다. 만약 다른 review같은 부분에서도 페이지네이션이 필요한 경우, 마찬가지로 30줄을 적을 수 없기 때문입니다. 따라
auth/const/auth.const.ts지금 우리는 환경변수를 다음과 같이 작성을 했습니다. 매우 중요한 정보이기 때문에 노출이 안되어야 합니다. 따라서 깃허브와 같은 곳에서는 깃허브에 올릴 때, gitignore를 해줘야 합니다.그리고 nest.js에서는 이런 환
자바스크립트 진영에서는 이미지를 Multer를 이용해서 쉽게 풀어나갑니다. 따라서 Nest.js에서도 Multer 라이브러리를 사용해서 파일 업로드를 구현하겠습니다. 먼재 4개의 페키지multer @types/multer uuid @types/uuid 를 설치하겠습니다
파일이 잘 올라갔지만, 이 파일을 볼 수 있어야합니다. 따라서 Static File을 이용해서 볼 수 있도록 만들겠습니다. Static File은 이미지를 의미합니다. 이후에 경로를 외부에서도 볼 수 있도록 바꾸는 것입니다. nest.js에서는 이렇게 이미지와 같은 S
🖊️이론 고전적인 방법으로, 제목 내용 이미지를 작성하고 업로드 버튼을 누르면 서버로 전송이 됩니다. 현재 구현돼있는 이미지 업로드 방식 제목, 내용, 이미지를 모두 선택한 다음 모든 정보를 한번에 서버로 업로드 텍스트는 빠르지만 파일은 오래걸릴 수 있음 업로드
TransactionA model, B modelPost API -> A 모델을 저장하고, B 모델을 저장한다.만약에 a를 저장하다가 실패하면 b를 저장하면 안될경우 -> all or nothingimage는 1개보다는 여러개를 올릴 수 있도록 바꿔보겠습니다. 여러개를
인터셉터의 경우 요청, 응답일 때 발생합니다. 즉 요청과 응답을 핸들링 할 수 있다는 것입니다.공식문서여기서 주목할 점은 각각의 interceptor를 따로 핸들링하는 것이 아니라, 한 곳에서 2개 모두 핸들링이 가능합니다.전반적으로 사용할 수 있는 intercepto
Exception Filter는 로직처리가 되고 진행이 됩니다. 그 후에는 interceptor로 이동하게 됩니다. 즉 interceptor에서도 Exception Filter를 핸들링 할 수 있다는 의미입니다.Exception Filter는 예외를 필터링 하는 것입니
공식문서미들웨어는 가장 앞에서 먼저 요청을 받습니다.Middleware functions can perform the following tasks:execute any code.(어떤 코드는 실행가능)make changes to the request and the re
이 HTTP통신의 단점은 단방향이라는 것입니다. client쪽에서 반드시 요청을 보내야 서버에서 응답을 보내주게 됩니다.따라서 웹소켓을 사용하게 되면 요청와 응답의 경계가 사라집니다.웹소켓을 사용하면 파이프가 생기게 됩니다. 이를 통해서 서버에서 어떤일이 발생하면 사용
🖊️Validation pipe 이번에는 Pipe를 사용해보도록 하겠습니다. REST API에서의 pipe와 Gateway에서의 API는 서로 다르지 않습니다. 🖊️Exception Filter 적용 🖊️Guard 적용 🖊️decorator 기반 로직
댓글 기능을 만들도록 하겠습니다. 댓글의 경우 Post 내부에 존재하기 때문에 posts 내부에 생성을 하도록 하겠습니다.=====================
관리자만 Post를 삭제할 수 있도록 RBAC을 사용하겠습니다. 먼저 관리자인지 아닌지를 구분하는 데코레이터를 만들겠습니다.users/decorator/roles.decorator.tsposts.controller.ts메타데이터를 적용했으니까, 관리자가 아니면 아래 d
patchPost의 경우 ADMIN 뿐만 아니라 본인인 경우에도 허용이 되도록 만들어야 합니다. 이것을 guard를 사용해서 만들어보겠습니다.posts/guard/is-post-mine-or-admin.guard.tspost 서비스에서 해당 post가 나의 것인지 확인
🖊️이론 인스타그램 기반의 팔로우 시스템을 적용하겠습니다. Following Many to Many Relation Mnay To Many 관계에서는 중간 테이블을 만들어야 합니다. 하지만 Follow의 경우, User User 형태가 됩니다. 따라서 다음과 같이 만들어야 합니다. User 테이블이
팔로우를 누른 경우, 팔로우 요청 또는 팔로우 삭제 경우에만 count를 조절하도록 하겠습니다.트랜젝션을 사용해서 구현을 해보겠습니다. 먼저 count를 담당할 컬럼을 만들겠습니다.users.entity.tsusers.controller.tsusers.service.t