# 게시판(Board) 개발 계획 > FastAPI + Vue 3 + PostgreSQL (외부 설치) --- ## 1. 작업 범위 개요 기존 hello-web 프로젝트에 **게시판(CRUD)** 기능을 추가한다. - **PostgreSQL**은 외부에 설치하여 연결 - **백엔드**: FastAPI + SQLAlchemy(async) + asyncpg - **프론트엔드**: Vue 3 (Options API) 게시판 페이지 추가 --- ## 2. PostgreSQL 준비 (외부) ### 2.1. PostgreSQL 설치 및 DB 생성 ```sql CREATE DATABASE helloboard; CREATE USER hello_user WITH PASSWORD 'your_password'; GRANT ALL PRIVILEGES ON DATABASE helloboard TO hello_user; ``` ### 2.2. 연결 정보 (예시) ``` DB_HOST=localhost DB_PORT=5432 DB_NAME=helloboard DB_USER=hello_user DB_PASSWORD=your_password ``` ### 예상 프롬프트 > macOS에 PostgreSQL이 설치되어 있지 않습니다. Homebrew로 PostgreSQL을 설치하고, `helloboard` 데이터베이스와 `hello_user` 사용자를 생성하는 스크립트를 작성해주세요. --- ## 3. 백엔드 작업 ### Step 1: 의존성 추가 `backend/requirements.txt` 에 패키지 추가: - `sqlalchemy[asyncio]` — ORM - `asyncpg` — PostgreSQL async driver - `psycopg2-binary` — sync driver (마이그레이션 등) - `alembic` — DB 마이그레이션 (선택) ### 예상 프롬프트 > FastAPI 프로젝트에 PostgreSQL을 연결하려고 합니다. `requirements.txt`에 SQLAlchemy(asyncio), asyncpg, alembic을 추가하고, `backend/database.py`에 async DB 세션 설정 코드를 작성해주세요. DB 연결 정보는 환경변수에서 읽도록 해주세요. --- ### Step 2: DB 모델 정의 `backend/models.py` — 게시글 모델 ```python # BoardPost 모델 # - id, title, content, author, created_at, updated_at ``` ### 예상 프롬프트 > 게시판을 위한 SQLAlchemy 모델을 `backend/models.py`에 정의해주세요. 필드는 id(INTEGER PK), title(VARCHAR), content(TEXT), author(VARCHAR), created_at, updated_at을 포함합니다. async 세션을 사용하는 Base를 상속받아주세요. --- ### Step 3: API 엔드포인트 `backend/routers/board.py` — 게시판 CRUD API | 메서드 | 경로 | 설명 | |--------|------|------| | GET | `/api/boards` | 목록 조회 (페이징) | | GET | `/api/boards/{id}` | 상세 조회 | | POST | `/api/boards` | 글 작성 | | PUT | `/api/boards/{id}` | 글 수정 | | DELETE | `/api/boards/{id}` | 글 삭제 | ### 예상 프롬프트 > FastAPI 게시판 CRUD 라우터를 `backend/routers/board.py`에 작성해주세요. Pydantic 스키마는 `backend/schemas.py`에 분리하고, async SQLAlchemy 세션을 사용해주세요. 목록 조회는 페이지네이션(page, per_page)을 지원해야 합니다. `backend/app.py`에 라우터를 include 시켜주세요. --- ### Step 4: CORS 업데이트 (필요시) 외부 PostgreSQL 연결과는 무관하지만, 개발 환경에서 API 호출이 정상 동작하도록 기존 CORS 설정 유지. --- ## 4. 프론트엔드 작업 ### Step 1: 게시판 페이지 생성 | 파일 | 설명 | |------|------| | `BoardListPage.vue` | 게시글 목록 (테이블/카드) | | `BoardDetailPage.vue` | 게시글 상세 + 목록으로 돌아가기 | | `BoardWritePage.vue` | 글 작성/수정 폼 | ### 예상 프롬프트 > Vue 3 Options API 스타일로 게시판 페이지 3개를 `frontend/src/pages/` 아래에 생성해주세요. > - `BoardListPage.vue`: 게시글 목록 (테이블, 페이지네이션 버튼) > - `BoardDetailPage.vue`: 게시글 상세 (제목, 작성자, 내용, 날짜) > - `BoardWritePage.vue`: 글 작성 폼 (제목 input, 내용 textarea, 저장 버튼) > API 호출은 fetch를 사용하고, `/api/boards` 엔드포인트를 호출합니다. --- ### Step 2: 라우터 등록 `frontend/src/router.js` 에 게시판 경로 추가 | 경로 | 페이지 | |------|--------| | `/boards` | BoardListPage | | `/boards/:id` | BoardDetailPage | | `/boards/new` | BoardWritePage | | `/boards/:id/edit` | BoardWritePage (수정 모드) | ### 예상 프롬프트 > `frontend/src/router.js`에 게시판 페이지 4개 경로를 추가해주세요: `/boards`, `/boards/new`, `/boards/:id`, `/boards/:id/edit`. 기존 Home, About 경로는 유지하고, BoardWritePage는 new와 edit을 모두 처리할 수 있도록 props로 구분해주세요. --- ### Step 3: 네비게이션에 링크 추가 `frontend/src/App.vue` 네비게이션에 "게시판" 링크 추가 ### 예상 프롬프트 > `frontend/src/App.vue`의 네비게이션 메뉴에 `게시판`를 추가해주세요. 기존 홈, 소개 링크 스타일과 동일하게 적용합니다. --- ## 5. 실행 순서 ``` 1. PostgreSQL 설치 및 DB/사용자 생성 (외부) 2. requirements.txt 업데이트 + pip install 3. database.py, models.py, schemas.py 작성 4. board.py 라우터 작성 + app.py에 등록 5. 프론트엔드 페이지 3개 생성 6. router.js에 경로 등록 7. App.vue 네비게이션 업데이트 8. 서버 실행 후 테스트 ``` --- ## 6. 검증 방법 | 항목 | 방법 | |------|------| | DB 연결 | `GET /api/boards` → 빈 배열 `[]` | | 글 작성 | POST `/api/boards` → 201 + 생성된 글 | | 목록 조회 | GET `/api/boards?page=1&per_page=10` | | 상세 조회 | GET `/api/boards/1` → 단일 글 객체 | | 글 수정 | PUT `/api/boards/1` → 수정된 글 | | 글 삭제 | DELETE `/api/boards/1` → 204 No Content | | 프론트 렌더링 | localhost:5173/boards 접속 → 목록 표시 | ### 예상 프롬프트 > 게시판 API를 curl로 간단히 테스트하는 스크립트를 작성해주세요. 글 작성, 목록 조회, 상세 조회, 수정, 삭제를 순서대로 테스트합니다.