캡스톤 설계 [건물별 소통 플랫폼 BBC] 23

댓글 기능 구현

0. 댓글 엔티티 생성 및 존재 하는 게시물인지 확인하는 미들웨어 @Entity() export class CommentsModel extends BaseModel { @ManyToOne(() => UsersModel, (user) => user.postComments) author: UsersModel; @ManyToOne(() => PostModel, (post) => post.comments) post: PostModel; @Column() @IsString() comment: string; @Column({ default: 0, }) @IsNumber() likeCount: number; } 댓글 엔티티 생성 post-exists.middleware.ts @Injectable() export cl..

채팅 기능 구현하기

npm i @nestjs/common @nestjs/core @nestjs/jwt @nestjs/platform-express @nestjs/platform-socket.io @nestjs/typeorm @nestjs/websockets Socket.io는 패키지간 의존성이 잘 맞지 않는 경우가 많아 주요한 라이브러리들을 다시 설치해서 의존성을 맞혀준다. 1. 채팅방과 메세지 엔티티 생성 chats.entity.ts @Entity() export class ChatsModel extends BaseModel { @ManyToMany(() => UsersModel, (user) => user.chats) users: UsersModel[]; @OneToMany(() => MessagesModel, (mes..

인터셉터과 트랜잭션을 활용한 게시물 작성 [파일 업로드]

이미지 업로드 방식에는 크게 두가지 방법이 있다. 첫번쨰 방식 - 제목,내용, 이미지를 모두 선택한 다음 모든 정보를 한번에 서버로 업로드 - 파일은 업로드가 오래걸려 사용자는 프로그램이 느리다는 인상을 받을 수 있다. 두번째 방식 - 한번에 텍스트와 파일을 업로드하는게 아니라 이미지를 선택할 때마다 이미즈는 먼저 업로드를 한다. - 업로드된 이미지들은 '임시폴더'에 이미지 경로만 잠시 저장해 둔다.(/public/temp) - 이후 포스트를 업로드 할 때 이미지의 경로만 추가한다.(/public/temp 에서 public/posts로 이동) -> AWS S3의 Presigned URL 을 사용하는 방식의 일부이다. 각각의 방식에는 아래와 같은 장단점이 있다. 결론적으로 사용자의 체감 시간에 더욱 중점을..

페이지네이션 일반화 하기

이후 댓글과 채팅 등등에서도 페이지 네이션을 사용하기 위해 객체지향 적으로 코드를 고도화 시켜 일반화 해보고자 한다. basePaginationdto.ts export class BasePaginationDto { @IsNumber() @IsOptional() page?: number; @IsNumber() @IsOptional() where__id__less_than?: number; // 이전 마지막 데이터의 ID // 이 프로퍼티에 입력된 ID 보다 높은 ID 부터 값을 가져오기 @IsNumber() @IsOptional() where__id__more_than?: number; // 정렬 // createdAt -> 생성된 시간의 내림차/오름차 순으로 정렬 // Ascending / Descend..

게시물 페이지 네이션

https://softmoca.tistory.com/315 페이지네이션[Pagination] 페이지네이션[Pagination] 이란 ? 많은 데이터를 부분적으로 나눠서 불러오는 기술. 특징 - 쿼리에 해당되는 모든 데이터를 한번에 다 불러오지 않고 부분적으로 나눠서 불러온다 예) 한번에 20개씩 softmoca.tistory.com 페이지 네이션 전반적인 내용은 위 게시물을 참조 ! 1) 커서 기반 페이지 네이션 게시물 20개의 오름차순 정렬된 게시물 가져오기 오름 차순 페이지네이션을 위한 기본 dto생성 export class PaginatePostDto { // 이전 마지막 데이터의 ID // 이 프로퍼티에 입력된 ID 보다 높은 ID 부터 값을 가져오기 @IsNumber() @IsOptional()..

유효성 체크 [DTO && Class Validator/Transformer] + 게시물 수정+비밀번호 안보이게하기

DTO(Data Transfer Object) - 데이터 유효성 검사 : class-validator/transformer을 사용해서 손쉽게 유효성 검사를 할 수 있다. 그로 인해 백엔드 개발자가 허용한 값만 DB에 들어올수 있게 한다.(SQL Injection으로 부터 보호) - NestJs와 typeorm으로 엔티티와 dto들을 상속과 같은 OOP 테크닉들을 사용해 중복 코드를 줄일 수 있다. 유효성 검사를 손쉽게 처리하기 위한 라이브러리 npm i class-validator class-transformer 게시물 생성 게시물 생성을 위한 dto export class CreatePostDto extends PickType(PostModel, [ "postTitle", "postContent", ]..

포스트맨 기능활용[환경변수,토큰 삽입 자동화]

환경 변수 등록 Collections의 모든 API url 앞 부분 위와 같이 변경 API 또한 이상없이 잘 작동한다. 토큰 환경변수로 자동으로 주입하기 환경 변수로 사용할 토큰 키 값들 저장. 로그인을 할 때 반환받은 토큰들을 환경변수로 저장하려고 한다. 매 권한(가드)이 필요한 API 요청마다 토큰을 복사 붙여넣기로 넣는건 상당히 귀찮은 일이다. pm.test('Store access token',function(){ pm.environment.set('accessToken',pm.response.json().accessToken); }); pm.test('Store refresh token',function(){ pm.environment.set('refreshToken',pm.response.js..

[백엔드] 회원가입,로그인(JWT토큰&리프레시 토큰&가드&커스텀데코레이터) [2]

https://softmoca.tistory.com/309 [백엔드] 회원가입,로그인(JWT토큰&리프레시 토큰) [1] https://softmoca.tistory.com/294 세션, 쿠키, JWT 토큰 및 인증과 인가 개념 정리 로그인기능을 구현한는 것도 어렵지만 무엇보다 로그인 상태를 '유지'하는거도 만만치 않게 어려운 일이다. 예로 들어 nav softmoca.tistory.com 해당 포스팅의 연장 내용입니다 ~ 1) 요청객체 (request)를 불러오고 authorization header로부터 토큰을 가져온다. 2) authService.extractTokenFromHeader를 이용해서 사용할 수 있는 형태의 토큰을 추출한다. 3) authService.decodeBasicToken을 실행..

게시판 엔티티 생성 및 게시물 작성 API

Post엔티티 생성 및 유저와 관계 설정 post.entity.ts import { Column, Entity, ManyToOne, OneToMany } from "typeorm"; import { BaseModel } from "./base.entity"; import { UsersModel } from "./user.entity"; @Entity() export class PostModel extends BaseModel { @Column() postTitle: string; @Column() postContent: string; @Column("int", { default: 0 }) postLike: number; @ManyToOne(() => UsersModel, (user) => user.pos..

[백엔드] 회원가입,로그인(JWT토큰&리프레시 토큰) [1]

https://softmoca.tistory.com/294 세션, 쿠키, JWT 토큰 및 인증과 인가 개념 정리 로그인기능을 구현한는 것도 어렵지만 무엇보다 로그인 상태를 '유지'하는거도 만만치 않게 어려운 일이다. 예로 들어 naver에 로그인을 했을 때 메일함을 들어가고 나올때, 보낸 메일함과 받은 softmoca.tistory.com 전반적인 플로우를 정리한 포스트이니 참조하세요 ~ 기본 부모 엔티티 및 유저 엔티티 생성 Base.entity.ts import { CreateDateColumn, PrimaryGeneratedColumn, UpdateDateColumn, } from "typeorm"; export abstract class BaseModel { @PrimaryGeneratedColu..