Service 역할과 생성방법을 배우다.
1. NestJS에서 Service
서비스 안에서는 데이터베이스 관련 로직을 처리한다. 데이터베이스에서 데이터를 가져오거나 데이터베이스 안에 정보를 넣어주는 등의 로직을 처리한다.
nest g service 서비스명 --no-spec
위와 같은 nestjs/cli 명령어를 사용하면 서비스 파일을 생성할 수 있다. 나는 boards 서비스를 cli를 이용해서 Service를 생성했더니 boards.service.ts 파일이 생성됐다. service파일 안에는 @Injectable 데코레이터가 있으며 다른 컴포넌트에서 이 서비스를 사용할 수 있게 만들어준다. cli로 Service 생성 시 module에도 자동으로 providers로 생성한 Service가 추가된다는데 나는 자동으로 추가 안돼서 내가 직접 추가했다.
// boards.module.ts
import { Module } from '@nestjs/common';
import { BoardsController } from './boards.controller';
import { BoardsService } from './boards.service';
@Module({
controllers: [BoardsController],
providers: [BoardsService],
})
export class BoardsModule {}
2. Service를 Controller에서 이용할 수 있게하기
import { Controller } from '@nestjs/common';
import { BoardsService } from './boards.service';
@Controller('boards')
export class BoardsController {
constructor(private boardsService: BoardsService) {}
}
컨트롤러에서 서비스를 사용하게 하려면 Dependency Injection, 종속성 주입을 해줘야 한다. private 같은 접근 제한자는 자바스크립트에서 사용할 수 없지만 지금은 타입스크립트니까 사용 가능하다. broadService 파라미터의 타입을 BoardsService 객체로 지정한다. 접근 제한자(public, protected, private)는 생성자(constructor) 파라미터에 선언하면 접근 제한자가 사용된 생성자 파라미터는 암묵적으로 클래스 프로퍼티로 선언된다.
원래 코드는 다음과 같다.
import { Controller } from '@nestjs/common';
import { BoardsService } from './boards.service';
@Controller('boards')
export class BoardsController {
boardsService: BoardsService;
constructor( boardsService: BoardsService){
this.boardsService = boardsService
}
}
this.boardsService의 boardsService는 클래스 프로퍼티이고 그 오른쪽의 boardsService는 생성자의 파라미터이다. 이 코드를 간단하게 하기 위해서 private 접근 제한자를 사용해서 간단하게 바꾼 것이다.
import { Controller } from '@nestjs/common';
import { BoardsService } from './boards.service';
@Controller('boards')
export class BoardsController {
constructor(private boardsService: BoardsService) {}
}
파라미터에서 프로퍼티로 선언이 되었기 때문에 boardsService는 클래스 안에서 this.boardsService.메서드() 로 사용하면 된다. BoardsService 내의 메서드를 메서드()의 자리에 사용하면 된다.
3. 모든 게시물을 불러오는 서비스 메서드 만들기
// boards.service.ts
import { Injectable } from '@nestjs/common';
@Injectable()
export class BoardsService {
private boards = [];
getAllBoards = () => {
return this.boards;
};
}
서비스 파일에서 게시물을 담을 배열을 선언하고 getAllBoards 메서드를 생성한다.
// boards.controller.ts
import { Controller, Get } from '@nestjs/common';
import { BoardsService } from './boards.service';
@Controller('boards')
export class BoardsController {
constructor(private boardsService: BoardsService) {}
@Get()
getAllBoards() {
return this.boardsService.getAllBoards();
}
}
// 화살표함수는 this가 제대로 참조 되지않아서 일반함수를 사용해야함
컨트롤러에서 서비스의 메서드를 가져와서 사용해준다. getAllBoards 메서드를 화살표 함수로 사용하려 했는데 그렇게 되면 this가 제대로 boardsService를 참조 하지 못해서 일반함수를 사용해야한단다. 나는 화살표 함수 쟁이인데 그냥 일반함수 써라.
이렇게 되면 localhost:3000/boards 경로로 가면 빈 배열이 출력되는 것을 볼 수 있다.
클라이언트에서 요청을 보내면 먼저 컨트롤러로 가고 컨트롤러에서 알맞은 요청 경로에 라우팅해서 해당 핸들러로 간다. 그 후 요청을 처리하기 위해서 서비스로 가고 요청에 맞는 로직을 거친 후 컨트롤러에 리턴값을 보내준 후 컨트롤러에서 클라이언트로 최종적인 리턴값을 보내준다.
'Back-End > NestJS' 카테고리의 다른 글
[NestJS] DTO 만들기 (0) | 2024.01.09 |
---|---|
[NestJS] 게시물 생성하는 Service, Controller 생성 (Request, Response) (0) | 2024.01.08 |
[NestJS] model 생성하기 (게시물) (0) | 2024.01.07 |
[NestJS] NestJS 시작과 아키텍처 구조, 프로바이더와 서비스란 (0) | 2024.01.04 |
[NestJS] NestJS란 무엇일까 (0) | 2024.01.03 |