게시글 생성 API 만들기 - Express Post 메소드
게시글 Model 구현 [게시글 객체형태 지정]
게시글 생성 API를 만들기 위해선,
게시물에 필요한 데이터가 어떤 것이 필요한지를 정의해주기 위해서 게시글의 모델을 만들어준다.
모델을 정의할 때는 2가지 방법이 있다.
# Interface로 정의 & 클래스로 정의
이번에 만들 게시글 생성 API는 게시글 생성 구조만 다뤄볼 것이기에 Interface로 게시글 Model를 만든다.
클래스로 모델을 만드는 것은 NestJS로 API를 여러가지 다뤄본 후 만들예정이다.
아래와 같이 게시글 모델을 파일을 boards 폴더 내에(Controller, Module, Service 파일이 있는 폴더) 생성 후 Interface로 구성한다.
인터페이스는 "명세"로 모델에 생성할 메소드, 필드변수들을 선언한다.
/*
게시글 생성 API를 위한 게시글 모델구성
*/
export interface Board{
id: string;
title: string;
description: string;
status: BoardStatus;
}
// enumeration을 이용해 공개, 비공개 게시글 설정
export enum BoardStatus {
PUBLIC = 'PUBLIC',
PRIVATE = 'PRIVATE'
}
게시글 Service 구현 [게시글 생성로직 | Database]
게시글 생성에 대한 로직을 Service에서 구현한다.
Service 구현코드는 아래와 같다.
/*
게시글 생성 API Part. 1-2
*/
createBoard(title: string, description: string){
const board: Board = {
// uuid 모듈을 불러와 로컬에서 유니크한 id값으로 지정
id: uuid(),
title: title,
description: description,
status: BoardStatus.PUBLIC
}
// 생성된 게시글 정보를 return 한다.
this.boards.push(board);
return board;
}
여기서 구현하는 게시글 생성 API는 데이터베이스 연동없이
로컬 데이터로만 구현하기에 id 값을 임의로 할당해줘야한다. (id 중복성없이 유니크한 변수로)
그래서, uuid 모듈을 불러와서 id 값에 uuid를 적용해 중복되지 않은 id로 지정했다.
uuid 모듈을 불러오는 방법은 다음과 같다. (혹시라도 필요하면, 사용해보자 ㅎㅎ)
// 게시글 Service 파일
import { v1 as uuid } from 'uuid';
여기서 잠깐, 게시글 생성 API를 구현함으로써, 추가된 사항이 있다.
게시글에 대한 타입이 "모델 객체"로 결정되었다는 점이다.
(게시글을 생성할 때, 모델에서 정의한 대로 게시글 객체가 할당되도록 설정해줬다.)
그렇다면, 이전에 구현한 게시글 조회 API를 보충해보면서 더 이해해보자.
# 지난번에 구현한 게시글 조회 API 보충 [게시글 데이터 타입 지정 ]
그럼, 지난번에 구성한 게시글 조회 API에 대해서도 게시글 모델 타입으로 게시글 데이터의 타입을 재지정할 수 있다.
Service에서 받아오는 게시글 데이터의 타입을 게시글 모델 타입으로 지정해줌.
그리고, Service의 게시글 조회 API 메소드의 return값을 게시글 모델 타입으로 지정해줬다.
/*
게시글 조회 API Part.1-1
*/
// 게시글 데이터의 타입은 Board 모델로 선언해준다. - 게시글 모델을 생성했음.
private boards: Board[] = [];
// 메소드의 return 타입을 Board 모델로 설정
getAllBoards(): Board[]{
return this.boards;
}
Controller에서도 Service에서 받아오는 게시글 조회 데이터 값에 대해 받아서 게시글 조회값을 반환해주는
Controller의 게시글 조회 API return 값의 타입을 게시글 모델 타입으로 지정해줬다.
/*
게시글 조회 API Part. 1-1 (로컬 변수에 게시글 저장한 것)
*/
// 엔드포인트 : '/'
@Get()
getAllBoard(): Board[]{
return this.boardsService.getAllBoards();
}
여기서, 잠깐
메소드들의 타입을 정의해주면 좋은 이유는 무엇일까?
타입을 정의해주는 건 선택사항이다.
하지만, 이렇게 타입을 정의해주므로써 원하는 타입과 다른 코드를 사용할 시 에러가 발생한다. - 메소드를 체계적으로 관리가 가능
그리고, 코드를 읽는 입장에서 더 코드를 쉽게 이해하며 읽을 수 있다. - 코드 유지 보수가 편함
게시글 Controller 구현
클라이언트로부터 게시글 생성 Params을 받아서
위에서 구현한 Service로 보낸 뒤 게시글 생성하고 생성된 게시글을 Service로부터 받아서
Return해주는 Controller를 구현한다.
아래와 같이 게시글 Controller를 구현한다.
HTTP 메소드는 @Post 데코레이터를 사용 & 엔드포인트는 '/'
Params는 Express의 Post 메소드 내의 @Body를 통해 클라이언트의 게시글 생성 Params를 받는다.
/*
게시글 생성 API Part. 1-2
*/
// 엔드포인트 : '/'
@Post()
createBoard(@Body('title') title: string,
@Body('decription') description: string,
): Board {
return this.boardsService.createBoard(title, description);
}
정리해서, Express의 Post 메소드 내에 존재하는 @Body를 통해 게시글 정보를 받아온다.
이때, Body는 게시글 정보를 담고있다.
받아온 Body 데이터를 Service에게 넘겨주어 게시글 생성을 한다.
'📚 스터디 > 백엔드' 카테고리의 다른 글
[개인 스터디] NestJS 정복하기 #05 - Pipe { Data Transformation & Validation } (0) | 2022.10.29 |
---|---|
[개인 스터디] NestJS 정복하기 #04 - DTO | Data Transfer Object (0) | 2022.10.29 |
[개인 스터디] NestJS 정복 - CRUD API 구현 (0) | 2022.10.27 |
[개인 스터디] NestJS 정복하기 #02 - NestJS | src 폴더 로직알아보기 (0) | 2022.10.27 |
[개인 스터디] NestJS 정복하기 #01 - NestJS 템플릿의 이해 (0) | 2022.10.27 |