낙서장이자 오답 노트이자 컨닝 페이퍼

패스트캠퍼스 환급챌린지 2일차 : 코드팩토리의 백엔드 아카데미 : 한 번에 끝내는 NestJS 패키지 - 기초부터 MSA까지 강의 후기 본문

NestJS

패스트캠퍼스 환급챌린지 2일차 : 코드팩토리의 백엔드 아카데미 : 한 번에 끝내는 NestJS 패키지 - 기초부터 MSA까지 강의 후기

NangIn 2025. 4. 2. 20:36

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

 

강의 내용 정리         

                                                                                                          

NestJS 라이프사이클 오버뷰

 

요청 처리 흐름

 

  • 클라이언트가 요청을 보내면, 요청은 절대적으로 아래 순서대로 처리됨
    • 요청 → 미들웨어 → 가드 → 인터셉터 → 파이프 → 모듈(요청 로직 처리 부분) → 익셉션 필터 → 인터셉터 → 응답
    • 인터셉터는 요청과 응답 양쪽에서 모두 적용되는 유일한 요소

 

선택적 요소

  • 미들웨어, 가드, 인터셉터, 파이프, 익셉션 필터는 선택적으로 사용할 수 있음
  • 하나도 적용하지 않아도 엔드포인트는 작동함

 

필수 요소

  • 모듈은 반드시 필요함
  • 모듈은 컨트롤러 → 서비스 → 레포지토리 순으로 연결됨
    • 컨트롤러: 요청을 받아서 처리 시작 (서비스 실행)
    • 서비스: 비즈니스 로직 실행
    • 레포지토리: 데이터베이스에 저장 처리 (선택사항)

 

컨트롤러

 

첫 요청 보내보기

  • 컨트롤러 클래스
    • app.controller.ts에서 AppController 클래스를 정의
    • @Controller() 애노테이션을 사용하여 HTTP 요청을 처리하는 클래스를 지정
      • 클래스 이름은 파일 이름과 일치해야 함 (예: AppController 클래스는 app.controller.ts 파일에 위치)
    • AppService 주입: constructor(private readonly appService: AppService)를 통해 서비스 로직을 처리하는 AppService를 주입
  • 컨트롤러 메서드
    • @Get()과 같은 애노테이션을 사용하여 HTTP 요청 메서드를 정의
      • @Get() 애노테이션은 HTTP GET 요청을 처리하는 메서드를 의미
      • @Post(), @Put() 등도 마찬가지로 해당 요청 방식에 맞는 메서드를 정의할 수 있음
  • 컨트롤러 역할
    • AppController는 클라이언트의 요청을 처리하는 역할
    • getHello() 메서드는 클라이언트로부터 오는 / 경로의 GET 요청에 응답을 처리
    • 요청이 오면 AppService에서 비즈니스 로직을 처리하고, 결과를 반환
  • 서비스와 관계
    • AppController는 요청을 받은 후 AppService를 호출하여 비즈니스 로직을 수행하고 응답을 반환
  • 서버 실행
    • pnpm start:dev로 서버를 실행한 후, http://localhost:3000에서 GET 요청을 보내어 결과를 확인
    • 요청을 보내면 AppController의 getHello() 메서드가 호출되고, AppService의 로직을 거쳐 최종 응답이 클라이언트로 반환
    • getHello()의 리턴값을 ‘Hello world’로 설정했을 경우, 포스트맨에서 다음과 같은 결과를 확인할 수 있음

 

HTTP 메서드 변경해보기

  • HTTP 메서드의 사용법
    • HTTP 메서드는 각기 다른 목적을 가지고 있으며, NestJS에서는 이를 메서드 애노테이션으로 처리함
      • GET, POST, PUT, PATCH, DELETE
  • 404 오류 및 상태 코드
    • 각 메서드가 올바르게 정의되지 않으면, 해당 HTTP 메서드에 대한 요청은 404 Not Found 오류를 발생시킴
      • 예: GET 메서드가 정의되지 않으면, GET 요청에 대해 404 오류가 발생
    • 404 상태 코드는 서버가 요청한 리소스를 찾지 못했을 때 반환되는 코드
  • 잘못된 설계의 문제점
    • 동일한 URL에서 여러 HTTP 메서드가 동일한 로직을 반환하면, 메서드마다 다른 동작을 기대할 때 로직이 뒤섞여 혼란을 초래할 수 있음
    • 예를 들어, GET, POST, PUT, PATCH가 모두 동일한 응답을 반환하면, API가 각 메서드에 대해 무엇을 해야 하는지 명확하지 않음
  • REST API 설계 원칙
    • RESTful API 설계는 각 HTTP 메서드가 고유한 역할을 담당하도록 해야 함
      • GET: 데이터를 조회
      • POST: 데이터를 생성
      • PUT: 데이터를 전체적으로 업데이트
      • PATCH: 일부 데이터를 업데이트
      • DELETE: 데이터를 삭제
    • 이러한 규칙을 따르지 않으면, API 사용자가 예상한 동작과 실제 동작이 다를 수 있음
  • 향후 개선 방향
    • REST API 설계 시 각 메서드에 맞는 동작을 분명히 정의해야 함
      • 각 HTTP 메서드는 서로 다른 목적을 가지고 있으므로, 이를 구분하여 명확한 역할을 수행하도록 해야 함
    • 이를 통해 API의 일관성을 유지하고, 유지보수성을 높일 수 있음

 

Movie API 설계 및 구현

  • 기본 설계
    • 영화 관련 API는 기본적으로 /movie를 기준으로 설정
      • GET /movie: 영화 목록을 반환
      • GET /movie/:id: 특정 영화 정보 반환
      • POST /movie: 새로운 영화 생성
      • PATCH /movie/:id: 특정 영화 정보 수정
      • DELETE /movie/:id: 특정 영화 삭제
  • 프로젝트 설정 및 시작
    • 프로젝트 생성:
      • nest new netflix 명령어로 새로운 NestJS 프로젝트 생성
      • pmpm start:dev 명령어로 개발 서버 실행
    • 컨트롤러 설정:
      • app.controller.ts에서 각 API 메서드 정의
      • HTTP 메서드와 URL 패스를 활용하여 각 기능을 구현
        • 메서드 애노태이션에 원하는 패스를 넣어줌 → @Get(’movie’)
        • :id → 변수로 사용 가능 (포스트맨에서 path variables에 넣은 값이 치환되어 들어감)
      @Controller('movie')  // 공통 패스 설정
      export class MovieController {
      
        @Get()
        getMovies() {
          return [
            { id: 1, name: 'Harry Potter', characters: ['Harry', 'Hermione'] },
            { id: 2, name: 'Lord of the Rings', characters: ['Frodo', 'Gandalf'] }
          ];
        }
      
        @Get(':id')
        getMovie(@Param('id') id: string) {
          return { id, name: 'Harry Potter', characters: ['Harry', 'Hermione'] };
        }
      
        @Post()
        postMovie() {
          return { id: 3, name: 'Avengers', characters: ['Iron Man', 'Captain America'] };
        }
      
        @Patch(':id')
        patchMovie(@Param('id') id: string) {
          return { id, name: 'Avengers', characters: ['Iron Man', 'Black Widow'] };
        }
      
        @Delete(':id')
        deleteMovie(@Param('id') id: string) {
          return { id }; // 삭제된 영화의 ID 반환
        }
      }
      
      
  • API 테스트
    • Postman을 활용하여 각 API 메서드를 테스트:
      • GET /movie: 여러 영화 목록을 반환
      • GET /movie/:id: 특정 영화 정보를 반환
      • POST /movie: 새 영화를 생성
      • PATCH /movie/:id: 영화 정보를 수정
      • DELETE /movie/:id: 특정 영화를 삭제.
  • 라우팅 처리
    • 각 요청은 적절한 HTTP 메서드와 URL에 맞춰 처리
      • 예: GET /movie는 영화 목록을 반환하고, POST /movie는 영화를 생성
      • @Controller('movie')로 공통된 경로 설정, 메서드별로 세부 URL을 정의하여 중복을 최소화
  • 설계 개선
    • 공통된 경로 설정: @Controller('movie')를 사용하여 각 메서드에서 /movie를 반복적으로 작성할 필요 없이, 공통된 URL을 미리 지정
      • 예: GET /movie는 getMovies() 메서드로 처리되며, @Get() 애노테이션을 사용해 요청을 처리함
  • 결론
    • API 설계를 통해 REST API의 기본 원칙을 준수하며 영화 관련 기능을 구현
    • 중복 최소화: 공통 경로 설정 및 HTTP 메서드에 맞는 요청 처리
    • 유연한 설계: 각 메서드는 고유한 HTTP 동작을 통해 정확한 기능을 수행하도록 설계

 

학습 후기                                                                                                                                       

이번 강의를 통해 NestJS의 구조와 API 설계 방법에 대해 깊이 이해할 수 있었습니다. 특히, RESTful API 설계를 하면서 각 HTTP 메서드(GET, POST, PUT, PATCH, DELETE)가 고유한 역할을 가지고 있다는 점을 강조한 부분이 인상 깊었습니다. 예를 들어, GET은 데이터를 조회하고, POST는 데이터를 생성하는 등의 명확한 역할을 구분함으로써 API의 일관성을 유지할 수 있다는 점은 실무에서 매우 중요한 부분입니다.

 

또한, NestJS의 컨트롤러와 서비스 간의 관계를 이해하는 것이 중요하다는 것을 깨달았습니다. AppController는 클라이언트의 요청을 받아 AppService로 비즈니스 로직을 넘기고, 이를 통해 응답을 반환하는 구조는 깔끔하고 유지보수가 용이한 방식입니다. 특히, 공통된 경로 설정을 위한 @Controller('movie') 사용은 코드 중복을 줄여주고, 확장성 있는 API 설계에 큰 도움이 될 수 있다는 것을 알게 되었습니다.

 

이 강의를 통해 실제 프로젝트에서 REST API를 설계하고 구현하는 방법을 배우면서, 내가 어떤 방식으로 API를 설계해야 할지 명확한 기준을 가질 수 있게 되었습니다. 또한, Postman을 활용해 API 메서드를 테스트하면서 실제로 돌아가는 구조를 경험하니, NestJS를 활용한 백엔드 개발에 대한 자신감이 생겼습니다. 앞으로 실습을 통해 더 많은 기능을 추가하고, 실제 서비스에서 어떻게 API가 잘 동작하는지 확인할 수 있을 것 같아 기대가 됩니다.

 

학습 인증샷                                                                                                                                   

수강 인증 사진

 

공부 시작 시간
공부 종료 시간
학습 인증샷

https://abit.ly/lisbva

 

Abit.ly 다운받기

 

abit.ly