서비스
Coddy Node.js 여정의 TypeScript와 NestJS 섹션에 포함된 레슨. 17개 중 6번째.
컨트롤러가 작업을 직접 보유하므로 앱의 다른 부분에서는 작업에 접근할 수 없습니다. 데이터와 로직은 프로바이더에 두어야 합니다. 프로바이더는 Nest가 생성하고 요청하는 곳에 전달하는 클래스입니다.
@Injectable()
export class BooksService {
private books = [{ title: 'Dune' }];
}
@Controller('books')
export class BooksController {
constructor(private readonly booksService: BooksService) {}
}@Injectable()은 클래스를 표시하고, 모듈은 해당 클래스를 providers에 등록합니다. 클래스는 생성자에 프로바이더의 이름을 지정해 요청합니다. 이것이 의존성 주입입니다. Nest는 매개변수의 타입을 읽습니다. 데코레이터가 적용된 클래스의 타입은 컴파일러가 유지합니다. Nest는 앱 전체에서 사용할 인스턴스 하나를 생성하고, 요청하는 모든 클래스에 동일한 인스턴스를 전달합니다. 데이터가 공유되며, 테스트에서는 대신 가짜 객체를 전달할 수 있습니다.
이 강의는 컨트롤러가 이미 this.tasksService를 호출하는 상태에서 시작합니다.
챌린지
쉬움TasksService를 주입 가능하게 만들고,create(title)과remove(id)를 구현하세요. 이는 5과에서 컨트롤러가 하던 작업입니다. 그리고 이를TasksModule의providers에 등록하세요.TasksController의 생성자에서 이를 요청하세요.{ "title": "Buy milk" }를 사용해POST /tasks를 보내고, 이어서GET /tasks, 그런 다음DELETE /tasks/99를 보내세요.
직접 해보기
import { NotFoundException } from '@nestjs/common';
export interface Task {
id: number;
title: string;
done: boolean;
createdAt?: string;
}
// Nest가 주입할 수 있도록 이 클래스를 프로바이더로 만드세요.
export class TasksService {
private tasks: Task[] = [
{ id: 1, title: 'Write the README', done: true, createdAt: '2026-01-05T09:00:00.000Z' },
{ id: 2, title: 'Fix the login bug', done: false, createdAt: '2026-01-06T14:30:00.000Z' },
{ id: 3, title: 'Plan the sprint', done: false, createdAt: '2026-01-07T08:15:00.000Z' },
];
findAll(done?: string): Task[] {
if (done === undefined) {
return this.tasks;
}
return this.tasks.filter((task) => task.done === (done === 'true'));
}
findOne(id: number): Task {
const task = this.tasks.find((task) => task.id === id);
if (!task) {
throw new NotFoundException(`Task ${id} not found`);
}
return task;
}
// create와 remove 로직을 컨트롤러에서 여기로 옮기세요.
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.