리눅스 간단한 서버 구축하기 - RestAPI(1)

범수·2024년 7월 8일

LinuxServer

목록 보기
4/7
post-thumbnail

>> 알아보기 <<

RestAPI란?

  • RestAPI는 클라이언트와 서버 간의 상호작용을 간단하고 유연하게 만들어주는 웹 서비스 아키텍처 스타일 중 하나

주요 개념

  1. 자원
    • REST API에서 모든 것은 자원으로 간주
    • 각 자원은 고유한 URI를 통해 식별된다. 즉, 특정 사용자의 자원 URI는 http://api.example.com/users/123와 같을 수 있음
  2. HTTP 메서드
    • REST API는 HTTP 메서드를 사용하여 자원에 대한 CRUD(생성, 읽기, 갱신, 삭제) 작업을 수행
	GET: 자원 조회
	POST: 새로운 자원 생성
	PUT: 기존 자원 갱신
	DELETE: 자원 삭제
	PATCH: 자원의 일부를 수정 
  1. 표현
    • 클라이언트와 서버 간의 데이터 교환은 자원의 표현을 통해 발생
    • 표현은 일반적으로 JSON 또는 XML 형식으로 전송
  2. 상태 없는 통신(Stateless Communication)
    • 각 요청은 클라이언트의 상태나 이전 요청의 문맥을 서버가 기억하지 않고 독립적으로 처리
      - 모든 필요한 정보는 요청 내에 포함되어야 함
  3. 계층화된 시스템
    • 클라이언트는 중간 서버를 통하거나 직접 서버와 통신할 수 있음
      - 중간 서버는 로드 밸런싱, 캐싱, 보안 정책 등 다양한 기능을 제공가능
  4. 캐싱
    • 서버는 응답에 캐시 가능한 정보를 포함시킬 수 있으며, 클라이언트는 이를 이용해 불필요한 서버 요청을 줄일 수 있음

REST API 설계 방법

  1. 명확하고 일관된 자원 URI 설계
    • 자원의 URI는 직관적이고 일관성 있게 설계되어야 함
  2. 적절한 HTTP 상태 코드 사용
    • 각 요청에 대해 적절한 HTTP 상태 코드를 반환하여 클라이언트가 요청의 성공 여부를 쉽게 이해할 수 있어야 함
	200 OK: 요청 성공
	201 Created: 새로운 자원 생성
	400 Bad Request: 잘못된 요청
	404 Not Found: 자원 찾을 수 없음
	500 Internal Server Error: 서버 오류
  1. HATEOAS(Hypermedia As The Engine Of Application State)
    • 클라이언트가 서버의 응답을 통해 다음 가능한 행동에 대한 정보를 얻을 수 있어야 함
    • 응답에 관련 링크를 포함하여 클라이언트가 쉽게 탐색할 수 있어야 함
  2. 보안
    • 인증(Authentication)과 권한 부여(Authorization)를 통해 자원에 대한 접근을 제어
    • HTTPS를 사용하여 데이터 전송 중 보안을 강화

>> 준비하기 <<

  • Python 중 Flask, Django, FastAPI 등 다양한 프레임워크 중에서 FastAPI를 사용해 제작보았습니다.

패키지 설치

콘솔 창 입력

----------------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중에서 상황에 맞는 패키지 설치하기

FastAPI

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": 서버가 모든 네트워크 인터페이스에서 접속을 허용

app.py 실행하기

  • Postman 설치 후 실행(API를 디자인, 빌드, 테스트하기 위한 API 플랫폼)

GET

콘솔 창 입력

uvicorn app:app --host 0.0.0.0 --port 8000

>http://your_server_ip:8000 접속

전체 notes값 조회

POST

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값 조회

PUT

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

DELETE

전체 notes값 조회

profile
범수의 개발 놀이터😋

0개의 댓글