과제💡
👉 Express에서 배운 mvc 패턴을 사용하여 /players 의 CRUD를 구현.
players는 축구선수로 정의 하겠습니다. (차범근, 메시, 호날두, 박지성, 손흥민 등)
mvc패턴이 어려우면 routes, controller만 구현
DB(Model)는 인메모리 사용 (코드에서 배열, 객체 사용 - 이것인 인메모리 입니다.)
인메모리 예시
const players = [
{name:"차범근", speed: 100, shouting:100, grade: "s"},
{name:"메시", speed: 100, shouting:100, grade: "s"}
{name:"호날두", speed: 100, shouting:100, grade: "s"}
]
RESTful API 규칙을 준수하여 API 작성(router)
코드 : https://github.com/BlueStrobus/Node.Js_7_basic/tree/main/week-04-homework
1. 환경조성
Express를 사용해 RESTful API와 MVC 패턴 기반의 구조를 구현합니다. 인메모리 데이터베이스를 사용하기 때문에 별도의 DB 설정 없이 배열을 통해 데이터를 관리합니다.
# 프로젝트 초기화, yarn설치
yarn init -y
# express, dev 설치
yarn add express
# devDependencies 설치 (nodemon 사용)
yarn add nodemon --dev
package.json에 모듈, nodemon 실행 스크립트 추가
// package.json 파일에 추가
"type": "module",
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js"
}
파일 정리
mvc패턴
controller : ./controllers/playerController.js
model : ./models/players.js
view : Insomnia
2. API
CRUD : Create, Read, Update, Delete의 앞글자를 따서 만든 약자로, 데이터를 처리하는 기본적인 네 가지 작업을 의미
API 명세서: Player Management
Base URL
http://localhost:3000/api/players
CRUD | HTTP verbs | Route |
선수 생성 | pos | / |
선수 조회 | get | / |
선수 갱신 | petch | /:name |
선수 삭제 | delete | /:name |
1. GET /api/players
설명
모든 플레이어의 정보를 조회합니다.
요청
- Method: GET
- Headers: 없음
- Body: 없음
응답
- 200 OK
[ { "name": "손흥민", "speed": 200, "shooting": 150, "grade": "S" }, ... ]
- 500 Internal Server Error
{ "message": "Internal server error" }
테스트
2. POST /api/players
설명
새로운 플레이어를 추가합니다.
요청
- Method: POST
- Headers: Content-Type: application/json
- Body:
{ "name": "박지성", "speed": 95, "shooting": 88, "grade": "A" }
응답
- 201 Created
{ "name": "박지성", "speed": 95, "shooting": 88, "grade": "A" }
- 400 Bad Request
{ "message": "All fields (name, speed, shooting, grade) are required." }
- 409 Conflict
{ "message": "Player with this name already exists." }
- 500 Internal Server Error
{ "message": "Failed to add player" }
테스트
3. PUT /api/players/:name
설명
특정 플레이어의 정보를 업데이트합니다.
요청
- Method: PUT
- Headers: Content-Type: application/json
- Body:
{ "speed": 98, "shooting": 90, "grade": "S" }
- URL Parameter:
- name (string): 업데이트할 플레이어 이름.
응답
- 200 OK
{ "name": "박지성", "speed": 98, "shooting": 90, "grade": "S" }
- 400 Bad Request
{ "message": "Player name is required." }
- 404 Not Found
{ "message": "Player not found" }
- 500 Internal Server Error
{ "message": "Failed to update player" }
테스트
4. DELETE /api/players/:name
설명
특정 플레이어를 삭제합니다.
요청
- Method: DELETE
- Headers: 없음
- URL Parameter:
- name (string): 삭제할 플레이어 이름.
응답
- 204 No Content
- 응답 본문 없음.
- 400 Bad Request
{ "message": "Player name is required." }
- 404 Not Found
{ "message": "Player not found" }
- 500 Internal Server Error
{ "message": "Failed to delete player" }
테스트
사용할 에러 상태 코드
코드 | 설명 |
200 | 요청 성공 및 데이터를 반환함. |
201 | 자원이 성공적으로 생성됨. |
204 | 요청 성공 및 응답 본문 없음. |
400 | 잘못된 요청 데이터. |
404 | 자원을 찾을 수 없음. |
409 | 중복된 자원으로 인해 요청 거절. |
500 | 서버 내부 오류. |
REST API 설계 규칙
1. 소문자를 사용한다.
대문자는 문제를 일으키는 경우가 있기 때문에 URI를 작성할 때는 소문자를 사용합니다.
❌ | http://dev-cool.tistory.com/users/Post-Comments |
⭕ | http://cocoon1787.tistory.com/users/post-comments |
2. 언더바(_) 대신 하이픈(-)을 사용한다.
가독성을 위해 긴 Path를 표현하는 단어는 하이픈(-)으로 구분합니다.
프로그램의 글자 폰트에 따라 언더바 문자는 부분적으로 가려지거나 숨겨질수 있기에 언더바(_)는 지양합니다.
❌ | http://dev-cool.tistory.com/users/post_comments |
⭕ | http://dev-cool.tistory.com/users/post-comments |
3. 마지막에 슬래시(/)를 포함하지 않는다.
후행 슬래시(/)는 의미가 전혀 없고 혼란을 야기할 수 있다.
URI내의 모든 문자는 리소스의 고유 ID에 포함되기에 명확한 URI를 생성해야한다.
❌ | http://dev-cool.tistory.com/users/ |
⭕ | http://dev-cool.tistory.com/users |
4. 행위를 포함하지 않는다.
행위는 URI 대신 Method를 사용하여 전달한다.
❌ | POST http://dev-cool.tistory.com/users/post/1 |
⭕ | PUT http://dev-cool.tistory.com/users/1 |
5. 파일 확장자는 URL에 포함시키지 않는다.
URI는 리소스를 고유하게 식별하는 주소 역할만 해야 하며, 그 리소스가 어떻게 표현되는지(데이터 형식. 예: JSON, XML, 이미지 등)는 HTTP 헤더를 통해 전달해야 합니다.
클라이언트는 요청 시 원하는 형식을 Accept 헤더에 명시하며, 서버는 그에 맞게 데이터를 반환합니다.
예시
- 클라이언트가 Accept: image/jpg를 보내면 서버는 JPG 형식으로 응답합니다.
- 클라이언트가 Accept: application/json을 보내면 서버는 JSON 형식으로 응답합니다.
❌ | http://dev-cool.tistory.com/users/photo.jpg |
⭕ | GET http://dev-cool.tistory.com/users/photo HTTP/1.1 Host: dev-cool.tistory.com Accept: image/jpg |
6. 전달하고자 하는 명사를 사용하되, 컨트롤 자원을 의미하는 경우 예외적으로 동사를 사용한다.
❌ | http://dev-cool.tistory.com/course/writing |
⭕ | http://dev-cool.tistory.com/course/write |
7. URI에 작성되는 영어를 복수형으로 작성한다.
하나의 인스턴스를 복수형으로 표시하는게 문법적으로 맞지 않겠다고 생각할수 있지만 URI의 형식을 복수형으로 사용하는 것이 실무에서 많이 사용되고 있다.
❌ | http://api.college.com/student/3248234/course |
⭕ | http://api.college.com/students/3248234/courses |
참고 :
https://m.blog.naver.com/jhc9639/220967034588
[개념 콕] Restful한 API 설계 규칙 : https://nbcamp.spartacodingclub.kr/blog/%EA%B0%9C%EB%85%90-%EC%BD%95-%EC%9B%B9-%EA%B0%9C%EB%B0%9C-%EC%A7%80%EC%8B%9D-%ED%8E%B8-restful%ED%95%9C-api-%EC%84%A4%EA%B3%84%EB%B2%95-21182
'내일배움캠프_게임서버(202410) > 분반 수업 Basic-A' 카테고리의 다른 글
교육과정 틀기 (0) | 2024.12.19 |
---|---|
베이직 강의 24.12.12 - 5주차 Database와 ORM(Prisma) (1) | 2024.12.12 |
4주차 Express, Restful API - 숙제중 (2) | 2024.12.05 |
베이직 241203 화 - 숙제 해설 (0) | 2024.12.03 |
과제하기 24.11.28.목 Class / Promise 이해하고 활용하기 (0) | 2024.11.28 |