Skip to content

riley909/12-punch-assignment1-AIMMO

Repository files navigation

프로젝트 소개

  • NestJS
  • MongoDB
  • 기타 사용한 라이브러리
  • 이외의 기능 구현 방법

프로젝트 사용법

로컬에서 테스트를 원할 경우

설치

$ npm install

실행 방법

# watch mode
$ npm run start:dev

# build
$ npm run build

# production mode
$ npm run start:prod

배포 서버

http://ec2-3-36-50-211.ap-northeast-2.compute.amazonaws.com:3000/api (swagger로 연결됨)

성능 테스트 조건

  • 1000만여 건의 데이터 추가 후 페이지당 100개씩 pagination을 시도
  • MongoDB에서 흔히 페이지네이션에서 사용하는 skip, limit를 사용하는 경우
  • Bucket Patten을 사용하여 페이지네이션을 사용하는 경우

성능 테스트 의도

주어진 테스트 조건이 1000만건의 데이터를 저장하는 경우이기 때문에 하나의 문서에 방대한 데이터가 몰리거나 많은양의 데이터를 페이지네이션을 해야하는 경우가 언제든지 발생 할 수 있다고 판단했습니다.

하나의 문서에 많은 양의 데이터가 몰리는 경우

  • 첫째로 당연히 많은 메모리를 차지합니다. 이것은 문서를 가져오기 위해 서버와 문서가 수신될 때 클라이언트에 할당되어야 하는 메모리입니다.
  • 둘째, 대용량 문서는 네트워크를 통해 이동하는 속도가 느립니다.
  • 셋째, MongoDB는 (상당히 의도적인) 16MB 문서 크기 제한을 부과합니다.

많은양의 문서가 있는 경우

  • 결국 더 높은 번호의 페이지를 볼수록 페이지 사이를 이동하는 속도가 느려지게 됩니다.

우리는 위에 나열 된 테스트 조건을 테스트하기 위해 두가지 방법으로 프로젝트를 구현했습니다. 그리고 결론적으로 버킷 패턴을 사용해 많은 양의 데이터가 몰리는 것과 데이터를 스킵하는 과정을 줄이고자 했습니다.

Skip, limit을 적용한 테스트 결과

1페이지 조회

  • Total 88.94ms

1page

5만 페이지 조회

  • Total 11.66s

5만page

10만 페이지 조회

  • Total 1m 20.40s

10만page

skip, limit이 작동하는 방식으로 인해 발생하는 일반적인 문제입니다. 데이터베이스에서 점프해서 바로 이동하는게 아니라 데이터베이스는 빠르게 skip의 문서를 지나가고 limt에 맞춰 문서를 반환합니다.

Bucket Patten

1페이지 조회

5만 페이지 조회

70만 페이지 조회

skip, limit처럼 문서를 건너뛰는 것은 시간이 많이 걸리지만 반대로 문서를 건너뛰지 않는 것은 시간이 많이 걸리지 않습니다. 데이터 세트를 만들어두고 데이터 세트 단위로 바로 이동 할 수 있기 때문입니다.

API 문서

  • Swagger API Documentation 이용
  • [주소] 접속시 테스트 가능

스웨거에 부족한 설명이 있는 API는 리드미에 예시와 함께 작성 하도록 하겠습니다. 인증이 꼭 필요한 부분을 제외하고는 테스트의 편의를 위해 인증절차를 풀어두었습니다. 테스트는 포스트맨으로 진행해주시면 감사하겠습니다 :)

유저

get users

curl http://ec2-3-36-50-211.ap-northeast-2.compute.amazonaws.com:3000/users

post users

curl -X POST http://ec2-3-36-50-211.ap-northeast-2.compute.amazonaws.com:3000/users -d '{"email": "wanted", "password": "1234"}' -H "Content-Type: application/json"

get users/{id}

curl http://ec2-3-36-50-211.ap-northeast-2.compute.amazonaws.com:3000/users/6181ca21a0ce776a269ec81a

로그인

로그인

curl -X POST http://ec2-3-36-50-211.ap-northeast-2.compute.amazonaws.com:3000/auth/login -d '{"username": "wanted", "password": "changeme"}' -H "Content-Type: application/json"

성공시

{"access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImpvaG4xIiwic3ViIjoiNjE4MWNhMjFhMGNlNzc2YTI2OWVjODFhIiwiaWF0IjoxNjM1ODk2ODI3LCJleHAiOjE2MzU5NTY4Mjd9.3bhtU7BzjdcG9LEM9AP3U079AGseRl04zy5TiXuVNeI"}

포스트

포스트 생성

curl -X POST http://ec2-3-36-50-211.ap-northeast-2.compute.amazonaws.com:3000/posts -d '{
	"title": "5sleep5",
	"content": "언제 잘까?",
	"category": "category_5"
}' -H "Content-Type: application/json" -H "Authorization: Bearer {token}"

검색

curl http://localhost:3000/posts/search?limit=5&offset=0 -d '{"search": "category_5"}' -H "Content-Type: application/json"

카테고리

카테고리 생성

curl -X POST http://ec2-3-36-50-211.ap-northeast-2.compute.amazonaws.com:3000/categories -d '{"name": "category_5"}' -H "Content-Type: application/json" -H "Authorization: Bearer {eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IndhbnRlZCIsInN1YiI6IjYxODFkN2Q4NTNmYzM3YmQ0Y2FlNzQ4OCIsImlhdCI6MTYzNTg5OTQwMywiZXhwIjoxNjM1OTU5NDAzfQ.3CyLY0rgA_0bFi4VtP4MGs0ZVYlAoNRQlt-zKEJOeZ4}"

댓글

코멘드 생성

curl -X POST http://ec2-3-36-50-211.ap-northeast-2.compute.amazonaws.com:3000/comments -d '{"content": "내일 잔다", "post": "6181ca4ca0ce776a269ec82a"}' -H "Content-Type: application/json" -H "Authorization: Bearer {eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6IndhbnRlZCIsInN1YiI6IjYxODFkN2Q4NTNmYzM3YmQ0Y2FlNzQ4OCIsImlhdCI6MTYzNTg5OTQwMywiZXhwIjoxNjM1OTU5NDAzfQ.3CyLY0rgA_0bFi4VtP4MGs0ZVYlAoNRQlt-zKEJOeZ4}"

블로그 포스팅

김서경 (팀장님)

김요셉 (팀원님)

김남형 (팀원님)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published