
- 자원
- REST API에서 모든 것은 자원으로 간주
- 각 자원은 고유한 URI를 통해 식별된다. 즉, 특정 사용자의 자원 URI는 http://api.example.com/users/123와 같을 수 있음
- HTTP 메서드
- REST API는 HTTP 메서드를 사용하여 자원에 대한 CRUD(생성, 읽기, 갱신, 삭제) 작업을 수행
GET: 자원 조회 POST: 새로운 자원 생성 PUT: 기존 자원 갱신 DELETE: 자원 삭제 PATCH: 자원의 일부를 수정
- 표현
- 클라이언트와 서버 간의 데이터 교환은 자원의 표현을 통해 발생
- 표현은 일반적으로 JSON 또는 XML 형식으로 전송
- 상태 없는 통신(Stateless Communication)
- 각 요청은 클라이언트의 상태나 이전 요청의 문맥을 서버가 기억하지 않고 독립적으로 처리
- 모든 필요한 정보는 요청 내에 포함되어야 함- 계층화된 시스템
- 클라이언트는 중간 서버를 통하거나 직접 서버와 통신할 수 있음
- 중간 서버는 로드 밸런싱, 캐싱, 보안 정책 등 다양한 기능을 제공가능- 캐싱
- 서버는 응답에 캐시 가능한 정보를 포함시킬 수 있으며, 클라이언트는 이를 이용해 불필요한 서버 요청을 줄일 수 있음
- 명확하고 일관된 자원 URI 설계
- 자원의 URI는 직관적이고 일관성 있게 설계되어야 함
- 적절한 HTTP 상태 코드 사용
- 각 요청에 대해 적절한 HTTP 상태 코드를 반환하여 클라이언트가 요청의 성공 여부를 쉽게 이해할 수 있어야 함
200 OK: 요청 성공 201 Created: 새로운 자원 생성 400 Bad Request: 잘못된 요청 404 Not Found: 자원 찾을 수 없음 500 Internal Server Error: 서버 오류
- HATEOAS(Hypermedia As The Engine Of Application State)
- 클라이언트가 서버의 응답을 통해 다음 가능한 행동에 대한 정보를 얻을 수 있어야 함
- 응답에 관련 링크를 포함하여 클라이언트가 쉽게 탐색할 수 있어야 함
- 보안
- 인증(Authentication)과 권한 부여(Authorization)를 통해 자원에 대한 접근을 제어
- HTTPS를 사용하여 데이터 전송 중 보안을 강화
콘솔 창 입력
----------------FastAPI, Uvicorn 설치[1]------------------ ssh your_username@your_server_ip // Ubuntu 서버에 SSH로 접속 sudo apt update sudo apt install python3 python3-pip // 파이썬 설치 pip3 install fastapi uvicorn // FastAPI, Uvicorn 설치 ----------------FastAPI, Uvicorn 등 설치 실패 시[2](가상 환경)----------------- sudo apt install python3-venv // 가상 환경 설치 mkdir my_fastapi_app // 디렉터리 생성 및 이동 cd my_fastapi_app python3 -m venv venv // 프로젝트 디렉토리에서 가상 환경을 생성 source venv/bin/activate // 가상 환경 활성화 pip3 install fastapi uvicorn // FastAPI, Uvicorn 설치> 1, 2중에서 상황에 맞는 패키지 설치하기
my_fastapi_app/app.py
from fastapi import FastAPI, HTTPException from pydantic import BaseModel app = FastAPI() # 데이터 모델 class Note(BaseModel): id: int title: str content: str # 임시 데이터베이스 notes = [] # notes값 전체 조회 @app.get("/notes", response_model=list[Note]) def get_notes(): return notes # id별 notes 조회 @app.get("/notes/{note_id}", response_model=Note) def get_note(note_id: int): note = next((note for note in notes if note.id == note_id), None) if note is None: raise HTTPException(status_code=404, detail="Note not found") return note # notes 생성(id 자동으로 생성) @app.post("/notes", response_model=Note, status_code=201) def create_note(note: Note): notes.append(note) return note # id별 notes 수정 @app.put("/notes/{note_id}", response_model=Note) def update_note(note_id: int, updated_note: Note): note = next((note for note in notes if note.id == note_id), None) if note is None: raise HTTPException(status_code=404, detail="Note not found") note.title = updated_note.title note.content = updated_note.content return note #id별 notes 삭제 @app.delete("/notes/{note_id}", status_code=204) def delete_note(note_id: int): global notes notes = [note for note in notes if note.id != note_id] return None # 현재 스크립트가 직접 실행될 때만 코드 블록 안의 내용 실행 if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000)> 메모리에 저장되는 CRUD 기능이 포함된 app.py 제작
- 임시로 데이터베이스 역할을 표현하기 위해 배열로 저장
- host="0.0.0.0": 서버가 모든 네트워크 인터페이스에서 접속을 허용
콘솔 창 입력
uvicorn app:app --host 0.0.0.0 --port 8000>http://your_server_ip:8000 접속
전체 notes값 조회
Postman -> body탭 입력
{ "id": 1, "title": "Sample Note", "content": "This is a sample note." }
- 메서드를 POST로 설정
- URL을 http://your_server_ip:8000/notes 로 설정
- Body 탭에서 raw와 JSON을 선택하고, 위의 JSON 데이터를 입력
- Send 버튼을 클릭
POST
전체 notes값 조회
Postman -> body 탭 입력
{ "id": 1, "title": "Updated Sample Note", "content": "This is a Updated sample" }
- 메서드를 PUT으로 설정
- URL을 http://your_server_ip:8000/notes/1 로 설정
- Body 탭에서 raw와 JSON을 선택하고, 위의 JSON 데이터를 입력
- Send 버튼을 클릭
PUT
전체 notes값 조회
- 메서드를 DELETE으로 설정
- URL을 http://your_server_ip:8000/notes/1 로 설정
- Send 버튼을 클릭
DELETE
전체 notes값 조회