|
1 | | -# CRUD_API_fastAPI |
| 1 | +# CRUD API FastAPI |
| 2 | +학습용 비동기 통신을 위한 CRUD 프로젝트입니다. |
| 3 | +웹에서 fetch를 통해 비동기 통신을 연습할 수 있도록 CRUD API 서비스를 제공합니다. |
2 | 4 |
|
3 | | -학습용 비동기 통신을 위한 CRUD 프로젝트 |
| 5 | +## 0. 배포 URL |
| 6 | +배포된 API 서버를 통해 바로 테스트해볼 수 있습니다. |
4 | 7 |
|
5 | | -## 목적 |
6 | | - |
7 | | -- 학생들이 웹으로 fetch를 통해 비동기 통신을 연습할 수 있도록 CRUD API 서비스를 제공 |
8 | | - |
9 | | -## 동작 |
| 8 | +## 1. 기술 스택 |
| 9 | +- FastAPI |
| 10 | +- SQLAlchemy |
| 11 | +- Uvicorn |
| 12 | +- SQLite |
| 13 | +- Pydantic |
10 | 14 |
|
| 15 | +## 2. 설치 및 실행방법 |
| 16 | +### 1. 저장소 클론 |
| 17 | +```bash |
| 18 | +git clone https://github.com/weniv/CRUD_API_fastAPI.git |
| 19 | +cd CRUD_API_fastAPI |
11 | 20 | ``` |
| 21 | +### 2. 가상환경 생성 및 활성화 |
| 22 | +```bash |
| 23 | +python -m venv venv |
| 24 | +source venv/bin/activate # Windows: venv\Scripts\activate |
| 25 | +``` |
| 26 | + |
| 27 | +### 3. 의존성 설치 |
| 28 | +```bash |
12 | 29 | pip install -r requirements.txt |
| 30 | +``` |
| 31 | +### 4. (로컬에서)서버 실행 |
| 32 | +```bash |
13 | 33 | uvicorn main:app --reload |
14 | 34 | ``` |
| 35 | +서버가 실행되면 http://127.0.0.1:8000 에서 API에 접근할 수 있습니다. |
| 36 | + |
| 37 | +### 5. Docker 실행 |
| 38 | +Docker 이미지 빌드 및 실행 |
| 39 | +```bash |
| 40 | +docker compose up -d --build |
| 41 | +``` |
| 42 | + |
| 43 | +## 3. API 문서 |
| 44 | +### 자동 생성 문서 |
| 45 | +- Swagger UI: /docs |
| 46 | +- ReDoc: /redoc |
| 47 | + |
| 48 | + |
| 49 | +### API 엔드포인트 |
| 50 | +#### 기본 엔드포인트 |
| 51 | +- `GET /` - API 안내 및 사용 가능한 모든 엔드포인트 목록 |
| 52 | +- `GET /healthcheck` - 서버 상태 확인 |
| 53 | + |
| 54 | +#### 인증 관련 |
| 55 | +- `POST /{api_id}/signup` - 회원가입 |
| 56 | +- `POST /{api_id}/login` - 로그인 (JWT 토큰 발급) |
| 57 | +- `GET /{api_id}/login_user_info` - 로그인한 유저 정보 조회 |
| 58 | +- `POST /login_confirm` - JWT 토큰 유효성 검증 |
| 59 | + |
| 60 | +#### 블로그 CRUD |
| 61 | +- `GET /{api_id}/blog` - 블로그 목록 조회 |
| 62 | +- `GET /{api_id}/blog/{blog_id}` - 블로그 상세 조회 |
| 63 | +- `POST /{api_id}/blog` - 블로그 생성 |
| 64 | +- `PUT /{api_id}/blog/{blog_id}` - 블로그 수정 |
| 65 | +- `DELETE /{api_id}/blog/{blog_id}` - 블로그 삭제 |
| 66 | + |
| 67 | +#### 상품 CRUD |
| 68 | +- `GET /{api_id}/product` - 상품 목록 조회 |
| 69 | +- `GET /{api_id}/product/{product_id}` - 상품 상세 조회 |
| 70 | +- `POST /{api_id}/product` - 상품 생성 |
| 71 | +- `PUT /{api_id}/product/{product_id}` - 상품 수정 |
| 72 | +- `DELETE /{api_id}/product/{product_id}` - 상품 삭제 |
| 73 | +- `GET /{api_id}/product/search?keyword={search_key}` - 상품 검색 |
| 74 | + |
| 75 | +#### 유저 CRUD |
| 76 | +- `GET /{api_id}/user` - 유저 목록 조회 |
| 77 | +- `GET /{api_id}/user/{user_id}` - 유저 상세 조회 |
| 78 | +- `POST /{api_id}/user` - 유저 생성 |
| 79 | +- `PUT /{api_id}/user/{user_id}` - 유저 수정 |
| 80 | +- `DELETE /{api_id}/user/{user_id}` - 유저 삭제 |
| 81 | + |
| 82 | +#### 코스 CRUD |
| 83 | +- `GET /{api_id}/course` - 코스 목록 조회 |
| 84 | +- `GET /{api_id}/course/{course_id}` - 코스 상세 조회 |
| 85 | +- `POST /{api_id}/course` - 코스 생성 |
| 86 | +- `PUT /{api_id}/course/{course_id}` - 코스 수정 |
| 87 | +- `DELETE /{api_id}/course/{course_id}` - 코스 삭제 |
| 88 | + |
| 89 | +#### 기타 |
| 90 | +- `GET /markdownblog` - 마크다운 블로그 조회 |
| 91 | +- `GET /asset/*` - 정적 파일 접근 (이미지 등) |
| 92 | + |
| 93 | +**참고**: `{api_id}`는 1-1000 사이의 숫자입니다. 각 API ID별로 독립적인 데이터 공간을 제공합니다. |
| 94 | + |
| 95 | + |
| 96 | +## 4. 사용 예시 |
| 97 | +JavaScript fetch를 사용한 API 호출 |
| 98 | +```javascript |
| 99 | +// 1. 회원가입 |
| 100 | +fetch('https://dev.wenivops.co.kr/services/fastapi-crud/100/signup', { |
| 101 | + method: 'POST', |
| 102 | + headers: { |
| 103 | + 'Content-Type': 'application/json', |
| 104 | + }, |
| 105 | + body: JSON.stringify({ |
| 106 | + username: 'testuser', |
| 107 | + password: 'testpass123' |
| 108 | + }) |
| 109 | +}) |
| 110 | +.then(response => response.json()) |
| 111 | +.then(data => console.log(data)); |
| 112 | + |
| 113 | +// 2. 로그인 |
| 114 | +fetch('https://dev.wenivops.co.kr/services/fastapi-crud/100/login', { |
| 115 | + method: 'POST', |
| 116 | + headers: { |
| 117 | + 'Content-Type': 'application/json', |
| 118 | + }, |
| 119 | + body: JSON.stringify({ |
| 120 | + username: 'testuser', |
| 121 | + password: 'testpass123' |
| 122 | + }) |
| 123 | +}) |
| 124 | +.then(response => response.json()) |
| 125 | +.then(data => { |
| 126 | + console.log(data); |
| 127 | + // JWT 토큰 저장 |
| 128 | + const token = data.access_token; |
| 129 | +}); |
| 130 | + |
| 131 | +// 3. 블로그 목록 조회 |
| 132 | +fetch('https://dev.wenivops.co.kr/services/fastapi-crud/100/blog') |
| 133 | + .then(response => response.json()) |
| 134 | + .then(data => console.log(data)); |
| 135 | + |
| 136 | +// 4. 블로그 생성 |
| 137 | +fetch('https://dev.wenivops.co.kr/services/fastapi-crud/100/blog', { |
| 138 | + method: 'POST', |
| 139 | + headers: { |
| 140 | + 'Content-Type': 'application/json', |
| 141 | + }, |
| 142 | + body: JSON.stringify({ |
| 143 | + title: '새로운 블로그 글', |
| 144 | + content: '블로그 내용입니다.', |
| 145 | + author: 'test_user' |
| 146 | + }) |
| 147 | +}) |
| 148 | +.then(response => response.json()) |
| 149 | +.then(data => console.log(data)); |
| 150 | + |
| 151 | +// 5. 상품 검색 |
| 152 | +fetch('https://dev.wenivops.co.kr/services/fastapi-crud/100/product/search?keyword=developer') |
| 153 | + .then(response => response.json()) |
| 154 | + .then(data => console.log(data)); |
| 155 | + |
| 156 | +// 6. JWT 토큰 인증 |
| 157 | +fetch('https://dev.wenivops.co.kr/services/fastapi-crud/login_confirm', { |
| 158 | + method: 'POST', |
| 159 | + headers: { |
| 160 | + 'Authorization': 'Bearer eyJhbGciOi.weniv.h8t7NJKEiWCh7G3' |
| 161 | + } |
| 162 | +}) |
| 163 | +.then(response => response.json()) |
| 164 | +.then(data => console.log(data)); |
| 165 | +``` |
| 166 | + |
| 167 | +## 5. 학습 목표 |
| 168 | +이 프로젝트를 통해 다음을 학습할 수 있습니다: |
| 169 | + |
| 170 | +- 비동기 통신: JavaScript fetch API 사용법 |
| 171 | +- RESTful API: HTTP 메서드(GET, POST, PUT, DELETE) 이해 |
| 172 | +- JSON 데이터: JSON 형태의 데이터 송수신 |
| 173 | +- API 테스팅: Swagger UI를 통한 API 테스트 |
| 174 | +- CORS 처리: 브라우저에서 API 호출 시 발생하는 CORS 이슈 해결 |
| 175 | + |
| 176 | +## 6. 프로젝트 구조 |
| 177 | +``` |
| 178 | +CRUD_API_fastAPI/ |
| 179 | +├── main.py # FastAPI 애플리케이션 메인 파일 |
| 180 | +├── requirements.txt # Python 의존성 목록 |
| 181 | +├── database.db # SQLite 데이터베이스 파일 (자동 생성) |
| 182 | +└── README.md # 프로젝트 설명서 |
| 183 | +``` |
| 184 | +## 7. 개발 가이드 |
| 185 | +### 새로운 엔드포인트 추가 |
| 186 | +main.py 파일에 새로운 라우터 함수를 추가하여 API 엔드포인트를 확장할 수 있습니다. |
| 187 | +### 데이터 모델 수정 |
| 188 | +SQLAlchemy 모델을 수정하여 데이터베이스 스키마를 변경할 수 있습니다. |
| 189 | +### 프론트엔드 연동 |
| 190 | +이 API는 순수 JavaScript, React, Vue.js 등 다양한 프론트엔드 프레임워크와 연동하여 사용할 수 있습니다. |
| 191 | + |
| 192 | +## 8. 문제 해결 |
| 193 | +### CORS 오류 발생 시 |
| 194 | +브라우저에서 API 호출 시 CORS 오류가 발생하면, FastAPI 애플리케이션에 CORS 미들웨어가 추가되어 있는지 확인하세요. |
| 195 | +### 데이터베이스 초기화 |
| 196 | +데이터베이스를 초기화하려면 database.db 파일을 삭제하고 서버를 재시작하면 됩니다. |
| 197 | + |
| 198 | +## 9. 라이선스 |
| 199 | +이 프로젝트는 학습 목적으로 제공됩니다. |
0 commit comments