본문 바로가기
개발공부/NestJS

[노마드 코더 NestJS로 API 만들기] 2 service

by bzerome240 2023. 8. 12.

 

 

service 생성

$ nest g s

 

entity 폴더 생성 > 데이터베이스 모델 생성

- 가짜 데이터베이스

export class Movie {
  id: number;
  title: string;
  year: number;
  genres: string[];
}

 


 

service 에 로직 구현

단일 책임의 원칙 - 한개의 요소는 한개의 기능만 책임진다.

@Injectable()
export class MovieService {
  private movies: Movie[] = [];

  getAll(): Movie[] {
    return this.movies;
  }

  getOne(id: string): Movie {
    const movie = this.movies.find((movie) => movie.id === +id);

    if (!movie) {
      throw new NotFoundException('찾을 수 없습니다.');
    }

    return movie;
  }

  deleteOne(id: string) {
    this.getOne(id);
    this.movies = this.movies.filter((movie) => movie.id !== +id);
  }

  create(movieData) {
    this.movies.push({
      id: this.movies.length + 1,
      ...movieData,
    });
  }

  update(id: string, movieData) {
    const movie = this.getOne(id);
    this.deleteOne(id);
    this.movies.push({
      ...movie,
      ...movieData,
    });
  }
}

 

예외처리 핸들러

Nest 에서 제공하는 모든 예외는 HttpException을 상속하고 있다.

  • throw new BadRequestException('잘못된 요청입니다');
  • throw new NotFoundException('찾을 수 없습니다.');
  • UnauthorizedException
  • NotFoundException
  • RequestTimeoutException
  • InternalServerErrorException
  • BadGatewayException
  • ServiceUnavailableException

 


 

생성자 기반 주입

  • Nest에서 제공하는 프로바이더의 핵심은 의존성을 주입할 수 있다는 점이다.
  • 상속 관계가 아닌경우 일반적으로 생성자 기반 주입을 권장한다.
  • 의존성주입DI는 OOP에서 많이 활용하는 기법 -> 객체를 생성하고 사용할 때 관심사 분리할 수 있다. 코드 가독성, 재사용성 증가
  • Service 클래스에 @Inhectable 을 선언하면 다른 컴포넌트에서 주입 가능한 프로바이더가 된다. default로 싱글턴 인스턴스가 된다.

 

 

 controller 생성자에서 service 주입받기 (import 하는 방법X)

@Controller('movie')
export class MovieController {
  constructor(private readonly movieService: MovieService) {}

  @Get()
  getAll(): Movie[] {
    return this.movieService.getAll();
  }

  @Get(':id')
  getOne(@Param('id') id: string): Movie {
    return this.movieService.getOne(id);
  }

  @Post()
  create(@Body() movieData) {
    return this.movieService.create(movieData);
  }

  @Delete()
  remove(@Param('id') id: string) {
    return this.movieService.deleteOne(id);
  }

  @Patch(':id')
  patch(@Param('id') id: string, @Body() movieData) {
    return this.movieService.update(id, movieData);
  }
}

 

 

 

728x90
반응형

댓글