티스토리 뷰

사용자를 생성하는 함수를 작성하기 전에 유저의 id로 유저정보를 GET하는 함수를 작성했다.

async getUserById(id: number): Promise<User> {
    const user = await this.userRepository.findOne({ where: { id: id } });
    if (!user) throw new NotFoundException('user not found with the id ${id}');
    return user;
  }

이렇게 작성하면 된다.

다음 유저를 create하는 함수이다.

createUser(userData: createUserDto) {
    this.userRepository.save(userData);
  }

이제 컨트롤러를 다음과 같이 수정해주자.

@Get(':id')
  getUserById(@Param('id') id: string) {
    return this.userService.getUserById(id)
  }

  @Post()
  createUser(@Body() userData: createUserDto) {
    return this.userService.createUser(userData)
  }

이렇게 하면 될 것같지만 문제가 있다.

지금 id값을 string으로 받고있는데 실제로 처리될때는 number로 처리되어야 한다.

그래서 service에서는 id를 number로 받고있다.

이때는 class-transformer 를 사용하면 된다. 또한 우리가 앞서 설정했던 dto의 class-validator 를 활성화 하기 위해 main.ts 를 다음과 같이 수정하자.

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(
    new ValidationPipe({
      transform: true,
      whitelist: true,
      forbidNonWhitelisted: true,
    }),
  );
  await app.listen(3000);
}

GlobalPipe를 통해 Validation Pipe를 추가했다.

옵션을 하나씩 살펴보면 transform 옵션은 위에 설명했던대로 만약 Param을 통해 어떠한 값을 받을때 우리가 원하는 자료형으로 변형시켜준다.

Param을 통해 받는 값은 기본적으로 string이지만, transform을 활성화하고 type을 number로 명시하면 자동적으로 number로 변환하여 값을 받아준다. 매우 편리한 기능이다

다음 whitelist 는 validation을 위한 decorator가 붙어 있지 않은 속성들은 제거하는 기능이다.

예를들어 post요청을 보낼때 엉뚱한 컬럼을 추가하여 보내는 경우가 있을 수 있다. 이런 경우에 dto에 존재하지 않는 컬럼은 생성되지 않는다.

다음 forbidNonWhitelisted 은 validation에 일치하지 않으면 아예 접근을 막아버리는 기능이다.

보안이 필요할때 사용하면 된다.

이제 id를 특정하여 get요청을 해보자.

http localhost:3000/user/1
HTTP/1.1 404 Not Found
Connection: keep-alive
Content-Length: 79
Content-Type: application/json; charset=utf-8
Date: Thu, 29 Jul 2021 13:26:38 GMT
ETag: W/"4f-l6ro+C7oNRREoKi8XZbR74GiT+I"
Keep-Alive: timeout=5
X-Powered-By: Express

{
    "error": "Not Found",
    "message": "user not found with the id 1",
    "statusCode": 404
}

코딩한 대로 에러를 내뿜는 것을 알 수 있다.

이제 데이터 생성을 위해 POST요청을 보내보자.

나는 insomnia 라는 프로그램을 이용했다.

{
    "name" : "jonyo",
    "gender" : "Male",
    "age" : 26
}

body를 다음과 같이 작성하여 포스트요청을 보냈다.

그 다음 /user 로 접속하여 전체 유저에 대한 GET요청을 했더니

http localhost:3000/user
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 128
Content-Type: application/json; charset=utf-8
Date: Thu, 29 Jul 2021 13:30:40 GMT
ETag: W/"80-QZt7LQV5YMxX06ZB1Mtg+EHDHMw"
Keep-Alive: timeout=5
X-Powered-By: Express

[
    {
        "age": 26,
        "createdAt": "2021-07-29T13:28:26.514Z",
        "gender": "Male",
        "id": 1,
        "name": "jonyo",
        "updatedAt": "2021-07-29T13:28:26.514Z"
    }
]

결과가 올바르게 나왔다.

유저를 여러개 추가한 다음에도

http localhost:3000/user
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 388
Content-Type: application/json; charset=utf-8
Date: Thu, 29 Jul 2021 13:31:18 GMT
ETag: W/"184-75/vlc9RApTQ29EtQ/FtsTq7qBs"
Keep-Alive: timeout=5
X-Powered-By: Express

[
    {
        "age": 26,
        "createdAt": "2021-07-29T13:28:26.514Z",
        "gender": "Male",
        "id": 1,
        "name": "jonyo",
        "updatedAt": "2021-07-29T13:28:26.514Z"
    },
    {
        "age": 22,
        "createdAt": "2021-07-29T13:31:08.349Z",
        "gender": "Female",
        "id": 2,
        "name": "jonyo1",
        "updatedAt": "2021-07-29T13:31:08.349Z"
    },
    {
        "age": 24,
        "createdAt": "2021-07-29T13:31:12.216Z",
        "gender": "Female",
        "id": 3,
        "name": "jonyo2",
        "updatedAt": "2021-07-29T13:31:12.216Z"
    }
]

결과가 잘 나왔다.

특정 id를 통한 검색도 잘 수행되었다.

http localhost:3000/user/2
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 129
Content-Type: application/json; charset=utf-8
Date: Thu, 29 Jul 2021 13:31:43 GMT
ETag: W/"81-w99xpzkLctLWCyPAf4RYa9sw6Tk"
Keep-Alive: timeout=5
X-Powered-By: Express

{
    "age": 22,
    "createdAt": "2021-07-29T13:31:08.349Z",
    "gender": "Female",
    "id": 2,
    "name": "jonyo1",
    "updatedAt": "2021-07-29T13:31:08.349Z"
}

이어서 유저를 삭제하는 함수도 만들었다.

//user.service.ts
deleteUser(id: number) {
    this.userRepository.delete(id);
  }

//user.controller.ts
@Delete(':id')
  deleteUserById(@Param('id') id: number) {
    this.userService.deleteUser(id);
  }

다음엔 마찬가지로 Car에 대한 CRUD를 작성하고 User의 정보 중 Car의 정보를 업데이트 하는 것을 해보겠다. 그리고 이 정보를 가지고 join연산을 통해 원하는 결과를 출력해보도록 하겠다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함