본문 바로가기
내일배움캠프_게임서버(202410)/분반 수업 Basic-A

basic 4주차 과제

by GREEN나무 2024. 12. 7.
728x90

과제💡

👉 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