[Nestjs] 인터페이스 - 유저 서비스의 인터페이스

The Dragonite·2023년 11월 30일
0

Nestjs

목록 보기
5/9
post-thumbnail

User Service Interface

인터페이스 구성하는 법

우선 어떤 서비스를 지원할 것인지 간단하게 생각을 정리하면 되는데, 책과 같은 예시로 유저 서비스를 들어보겠다.

다음과 같은 서비스를 지원하자고 해보자.

  • 회원가입
  • 이메일 인증
  • 로그인
  • 회원 정보 조회

각 서비스들에 대해서 어떤 방식으로 엔드포인트를 가질지 설정을 한다.

회원가입의 경우에는 유저 정보를 받아 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-id200 회원 정보

위의 표와 의도와 같게 인터페이스를 컨트롤러에 만들어 보자

우선 컨트롤러를 생성한다.

$ 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;
}

이 포스트는 위 책을 기반으로 작성하고 있습니다...

0개의 댓글

관련 채용 정보