250x250
Notice
Recent Posts
Recent Comments
Link
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

devlog_owen

240103 [TIL] nest.js로 공연예매사이트 만들기 본문

TIL

240103 [TIL] nest.js로 공연예매사이트 만들기

developer_owen 2024. 1. 4. 02:39
728x90

개발과정

 

1. 과제 요구사항 분석 및 설계

 

타입스크립트 과제 | Built with Notion

타입스크립트 기반으로 온라인 공연 예매 서비스를 만들어봐요!

teamsparta.notion.site

이번 과제에서는 필수기능만 구현하기로 했다. nest.js도 typescript도 처음이라 기본만 하자라는 마인드였다.

 

2. 프로젝트 및 패키지 설정

이번 기술스택은 nest.js, typescript, typeORM,mysql 등 필요 패키지를 설치했다.

 

3. 데이터베이스 모델 설정

설계한 데이터베이스 스키마에 따라 데이터베이스 모델을 생성하는데 여기서는 typeORM entity를 정의한다.

 

4. 모듈설정

각 기능에 맞는 모듈을 설정하고 app.module에 임포트해주어야 한다.

 

5. DTO 생성

클라이언트와 서버간의 데이터를 전송하는데 사용하는 dto를 생성한다.

 

6. 컨트롤러, 서비스 로직 구현

각 기능에 맞는 컨트롤러, 서비스 로직을 구현한다.

 

 


오류 해결

 

240102 [TIL] nest.js,typescript 개인프로젝트 과제 오류정리

1. findOne 메서드에 잘못된 인자가 전달되었을때 "[nestjs/typeorm] Object literal may only specify known properties, and 'id' does not exist in type 'FindOneOptions'" 이 오류는 findOne 메서드에 잘못된 인자가 전달되었을 때

devlogowen.tistory.com

 

위에 게시글에서 이번 과제하면서 자주 뜬 오류들을 정리했다. 

 

또, 공연 생성기능 개발 중 유저가 아닌 관리자만 공연을 생성할 수 있게 해야했는데 어쩐일인지 둘다 생성이 안됐었다.

import { Role } from 'src/user/types/userRole.type';

import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { AuthGuard } from '@nestjs/passport';

@Injectable()
export class RolesGuard extends AuthGuard('jwt') implements CanActivate {
  constructor(private reflector: Reflector) {
    super();
  }

  async canActivate(context: ExecutionContext) {
    const authenticated = await super.canActivate(context);
    if (!authenticated) {
      return false;
    }

    const requiredRoles = this.reflector.getAllAndOverride<Role[]>('roles', [
      context.getHandler(),
      context.getClass(),
    ]);
    if (!requiredRoles) {
      return true;
    }

    const { user } = context.switchToHttp().getRequest();
    return requiredRoles.some((role) => user.role === role);
  }
}

 

 

맨 밑의 user.role이 문제였다. user entity에는 role이 아닌 usertype으로 정의되어있었다.

const { user } = context.switchToHttp().getRequest();
    return requiredRoles.some((role) => user.userType === role);

 

이렇게 수정해주니 정상적으로 기능이 작동됐다.


어려웠던 점 & 공부해야하는 것들

 

코드를 짜면서 헷갈렸던 개념들을 정리해봤다.

 

 
데코레이터(Decorators):

역할: 데코레이터는 TypeScript에서 클래스, 메서드, 속성 등에 메타데이터를 추가하거나 변형할 수 있도록 도와주는 기능입니다. NestJS에서는 @ 기호로 시작하는 데코레이터를 사용하여 클래스나 메서드 등에 기능을 추가하거나 주석을 달아줍니다.
예시: @Controller(), @Injectable(), @Get(), @Post() 등의 데코레이터가 있습니다. @Controller() 데코레이터는 컨트롤러 클래스를 정의하고, @Get(), @Post() 등은 라우팅 엔드포인트를 정의하는 데 사용됩니다.


가드(Guards):

역할: 가드는 요청이 라우터 핸들러로 전달되기 전에 요청을 검사하거나 변형하는 데 사용됩니다. 요청의 권한 확인, 요청의 유효성 검사 등을 수행하여 요청의 흐름을 제어합니다.
예시: AuthGuard, RolesGuard 등의 가드가 있습니다. AuthGuard는 요청이 인증되었는지 확인하고, RolesGuard는 특정 권한이 있는지 확인하여 엔드포인트에 접근을 허용하거나 막습니다.


모듈(Modules):

역할: 모듈은 관련된 기능들을 그룹화하고 조직화하는 데 사용됩니다. NestJS에서 애플리케이션을 구성하는 기본 구성 요소로, 서비스 제공, 컨트롤러, 가드, 미들웨어 등을 하나로 묶어주는 역할을 합니다.
예시: @Module() 데코레이터를 사용하여 모듈을 정의합니다. 각각의 모듈은 providers, controllers, imports, exports 등을 포함하여 애플리케이션을 구성합니다.


 

728x90