우선 어떤 서비스를 지원할 것인지 간단하게 생각을 정리하면 되는데, 책과 같은 예시로 유저 서비스를 들어보겠다.
다음과 같은 서비스를 지원하자고 해보자.
각 서비스들에 대해서 어떤 방식으로 엔드포인트를 가질지 설정을 한다.
회원가입의 경우에는 유저 정보를 받아 DB에 저장을 해야하므로 POST를 사용하면될 것이다.
이메일 인증의 경우 이메일 정보를 받아 해당 이메일이 사용자 본인의 이메일이 맞는지 확인해야하므로, POST를 사용하면 될 것이다.
로그인의 경우 유저의 아이디와 비밀번호를 받아 DB에서 확인 후 승인을 하는 방식으로 구성할 것이므로, POST를 사용하면 될 것이다.
회원 정보 조희의 경우에는 회원의 내부 아이디를 통해 정보를 요청받아야하는 것이므로 GET요청을 사용하면 될 것이다.
이와 같은 생각들을 정리 하면 아래와 같이 될 것이다.
기능 | 엔드포인트 | 본문 데이터 (JSON) | 패스 매개변수(@Param) | 응답 |
---|---|---|---|---|
회원가입 | POST /users | {"name": ..., "email": ...,} | - | 201 |
이메일 인증 | POST /users/email-verify | {"signupVerifyToken": ...} | - | 201 액세스 토큰 |
로그인 | POST /users/login | {"email": ..., "password": ...,} | - | 201 액세스 토큰 |
회원 정보 조회 | GET /users/:id | - | id | 200 회원 정보 |
위의 표와 의도와 같게 인터페이스를 컨트롤러에 만들어 보자
우선 컨트롤러를 생성한다.
$ nest g co Users
우선 회원가입 인터페이스를 UsersController에 구현하자.
import { Body, Controller, Post } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
@Controller('users')
export class UsersController {
@Post()
async createUser(@Body() dto: CreateUserDto): Promise<void> {...}
}
// ./dto/create-user.dto.ts
export class CreateUserDto {
readonly name: string;
readonly email: string;
readonly password: string;
}
위와 같은 코드에 아래와 같이 요청을 보낼 수 있다.
$ curl -X POST http://localhost:3000/users -H
"Content-Type: application.json" -d '{"name": .. }'
> { name: ... }
나머지 코드를 인터페이스에서 의도한 것과 같이 채우면
import { Body, Controller, Post, Query } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { UsersLoginDto } from './dto/user-login.dto';
import { VerifyEmailDto } from './dto/verify-email.dto';
import { UserInfo } from './UserInfo';
@Controller('users')
export class UsersController {
@Post()
async createUser(@Body() dto: CreateUserDto): Promise<void> {...}
@Post('/email-verify)
async verifyEmail(@Query() dto: VerifyEmailDto): Promise<string> {...}
@Post('/login')
async login(@Body() dto: UsersLoginDto): Promise<string> {...}
@Get('/:id)
async getUserInfo(@Param('id') userId: string): Promise<UserInfo> {...}
}
// ./dto/create-user.dto.ts
export class CreateUserDto {
readonly name: string;
readonly email: string;
readonly password: string;
}
// ./dto/user-login.dto.ts
export class UserLoginDto {
email: string;
password: string;
}
// ./dto/verify-email.dto.ts
export class VerifyEmailDto {
signupVerifyToken: string;
}
// ./UserInfo
export interface UserInfo {
id: string;
name: string;
email: string;
}
이 포스트는 위 책을 기반으로 작성하고 있습니다...