users안에 fakeDB.ts파일을 만들어서 작은 DB를 만들어 보자!
export할 데이터의 이름은 datas라고 하고 안에는 id와 name 객체가 들어있는 배열을 만들자!
TypeScript니깐 그에 맞는 interface도 만들어 보자!
// users/fakeDB.ts
export interface data {
id: number;
name: string;
}
const datas: data[] = [
{ id: 0, name: '홍길동' },
{ id: 1, name: '이순신' },
];
export default datas;
data의 예로 홍길동과 이순신을 넣어 봤다.
우리의 restAPI예상 주소이다.
address | info |
---|---|
/users/all | 모든 유저 출력 |
/users/1 | id가 1번인 유저 출력 |
그럼 구현해 보자
service는 실제로 로직을 실행하는 부분이다.
그래서 getAll이라는 함수와 getOne이라는 함수를 만들어 우리의 예상과 맞게 datas 조리하여 알맞게 return해줘보자!
import { Injectable } from '@nestjs/common';
import datas, { data } from './fakeDB';
@Injectable()
export class UsersService {
getAll(): data[] {
return datas;
}
getOne(id: number): data[] {
return datas.filter((user) => user.id === +id);
}
}
@Injectable()는 공급자로 지정한다는 의존성을 주입한것이다.
getAll은 data라는 타입의 배열이 리턴된다는 것을 알리고 datas를 전부 리턴해준다.
getOne은 해당 id(id는 number타입)를 인자로 받고 그에 맞는 user만 리턴해 줄 수 있게 filter함수를 사용하여 해당 id를 리턴해준다.
// find를 써도 되지만 배열의 형식으로 리턴해주도록 하자
// number타입을 지정해줘도 string으로 나와 +로 형변환을 해줬다.
controller는 라우팅, 즉 주소를 담당하는 부분이다. service를 가져오고 그 함수에 맞게 라우팅을 구성해주자!
import { Controller, Get, Param } from '@nestjs/common';
import { data } from './fakeDB';
import { UsersService } from './users.service';
@Controller('users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@Get('/all')
getAll(): data[] {
return this.usersService.getAll();
}
@Get('/:id')
getOne(@Param('id') id: number): data[] {
console.log(id);
console.log(typeof id);
return this.usersService.getOne(id);
}
}
@Controller('users')는 users의 라우팅이라는 의존성 주입을 해준것이다. users는 모듈은 /users로 시작된다.
그리고 constructor, 생성자에서 userService를 가져오고 내부에서만 확인(private)하고 수정할 수 없게(readonly) 설정해주자
*생성자는 class가 생성되면 무조건 실행되는 함수라고 생각하자.
@Get()은 http method 중 get을 사용한다고 생각하면 된다.
그리고 안에 맞는 주소를 입력해 주자.
// '/'는 생략가능 하지만 나는 습관이 되서 그냥 적어주었다.
함수 이름은 service랑 같이 하는 것이 보기에도 편하고 협업하기에도 편할 것 같다.
getAll()은 전제 데이터를 가져오는 것이니깐 data[]타입을 리턴하는 것으로 설정하고 주소는 /all로 해주었다. => users/all
getOne은 id의 값을 입력받아 그에 맞는 데이터를 리턴해주는 것이어서 parameter를 받아야 한다.
parameter를 받는 방법은 주소에 @Get(/:[parameter_name]) 으로 설정해주면 된다.
@Param은 @nestjs/common에서 가져와 준다.
@Param()안에 들어갈 이름은 우리가 @Get()에서 설정해준 parameter 이름이랑 똑같이 해줘야 한다.
하지만 옆에서 타입을 설정할 때의 이름은 마음대로 해도 좋다. 대신 그 이름을 service함수의 매개변수로 넣어줘야 한다. 난 헷갈릴까봐 똑같이 하려고 한다ㅎㅎ
getOne()은 parameter에 맞는 데이터를 가져오는 것이니깐 data[]타입을 리턴하는 것으로 설정하고 주소는 /:id로 해주었다. => users/id
자 이제 서버를 띄우고 우리가 원하는대로 라우팅이 되고 원하는 값이 나오는지 확인해 보자
npm run start:dev
우리가 생각했던대로 잘 나왔다. bb
이제 create와 update, delete를 구현해 보자!