
일기를 작성하며 자신의 생각 정리 명언과 자기성찰 질문을 랜덤으로 제공하는 개인 일기 관리 서비스
github - organizations - 브랜치 나누기
DB / 환경변수 설정
회원가입
일기 CRUD
명언/자기성찰 질문 랜덤 제공
| 개념 | 역할 |
|---|---|
| Access Token / Refresh Token | 짧은 만료시간 + 자동 재발급 |
| CSRF | 브라우저 환경 보호 (JWT 쿠키 보관 시) |
| OAuth2 Social Login | Google, Kakao 등 외부 로그인 |
| Dependency Override | 테스트 시 가짜 사용자 주입 |
fastapi_mini_project/
├── app/
│ ├── api/ # FastAPI 라우터 (엔드포인트)
│ ├── core/ # 공통 설정, 보안, 의존성 (Config, JWT, Password 등)
│ ├── models/ # Tortoise ORM 모델 (DB 테이블 정의)
│ ├── schemas/ # Pydantic 스키마 (요청/응답 데이터 검증)
│ ├── services/ # 비즈니스 로직 (회원가입, 로그인, CRUD 처리)
│ ├── repositories/ # DB 접근 로직 (CRUD 메서드)
│ ├── db/ # DB 연결 및 마이그레이션 설정
│ ├── scraping/ # 스크래핑 기능 (명언/질문 수집용)
│ ├── main.py # FastAPI 진입점 (앱 실행 및 라우터 등록)
│ └── __init__.py
├── tests/ # 테스트 코드
├── .env / .env.dev # 환경변수
├── pyproject.toml # Poetry 설정
└── README.md # 프로젝트 설명
| 폴더 | 주요 역할 | 예시 파일 |
|---|---|---|
| api/ | 실제로 클라이언트 요청이 들어오는 엔드포인트 정의 | auth.py, diary.py |
| core/ | 앱의 핵심 설정 (DB URL, JWT, 암호화 등) | config.py, security.py, dependencies.py |
| models/ | 데이터베이스 테이블 정의 (Tortoise ORM 모델) | user.py, diary.py |
| schemas/ | 요청(Request) / 응답(Response) 검증용 모델 (Pydantic) | user.py |
| services/ | 핵심 비즈니스 로직 (회원가입, 로그인 등) | auth_service.py |
| repositories/ | DB 조작 담당 (CRUD 기능 구현) | user_repo.py |
| db/ | DB 연결 및 마이그레이션 관련 | base.py, session.py |
| scraping/ | 외부 웹 데이터 수집 기능 | quote_scraper.py |
| tests/ | pytest 등으로 테스트 실행 | test_auth.py |
| main.py | FastAPI 앱 실행, 라우터 등록, DB 초기화 |
fastapi_mini_project/
├── app/
│ ├── api/
│ │ └── v1/
│ │ ├── auth.py
│ │ ├── diary.py
│ │ ├── quote.py
│ │ ├── question.py
│ │ └── __init__.py
│ │
│ ├── core/
│ │ ├── config.py
│ │ ├── security.py
│ │ ├── dependencies.py
│ │ └── __init__.py
│ │
│ ├── models/
│ │ ├── user.py
│ │ ├── diary.py
│ │ ├── quote.py
│ │ ├── question.py
│ │ ├── bookmark.py
│ │ ├── token_blacklist.py
│ │ ├── user_question.py
│ │ └── __init__.py
│ │
│ ├── schemas/
│ │ ├── user.py
│ │ ├── diary.py
│ │ ├── quote.py
│ │ ├── question.py
│ │ └── __init__.py
│ │
│ ├── services/
│ │ ├── auth_service.py
│ │ ├── diary_service.py
│ │ ├── quote_service.py
│ │ ├── question_service.py
│ │ └── __init__.py
│ │
│ ├── repositories/
│ │ ├── user_repo.py
│ │ ├── diary_repo.py
│ │ ├── quote_repo.py
│ │ ├── question_repo.py
│ │ ├── token_repo.py
│ │ └── __init__.py
│ │
│ ├── db/
│ │ ├── base.py
│ │ ├── session.py
│ │ ├── migrations/
│ │ └── __init__.py
│ │
│ ├── scraping/
│ │ ├── quote_scraper.py
│ │ ├── question_scraper.py
│ │ └── __init__.py
│ │
│ ├── main.py
│ └── __init__.py
│
├── tests/
│ ├── test_auth.py
│ ├── test_diary.py
│ ├── test_quote.py
│ └── test_question.py
│
├── .env
├── .env.dev
├── .gitignore
├── pyproject.toml
├── poetry.lock
└── README.md
psycopg2-binary poetry add email-validatorpoetry add pydantic-settingspoetry add passlib[bcrypt]passlib[bcrypt]를 “파일 패턴”으로 착각하고 오류 발생poetry add 'passlib[bcrypt]' 따옴표로 감싸면 문제 해결postgres://[사용자이름]:[비밀번호]@[호스트주소]:[포트번호]/[데이터베이스이름]DATABASE_URL=postgres://postgres:1111@localhost:5432/fastapi_dbDB_USER=hello_admin
DB_PASSWORD= (비밀번호를 여기 입력)
DB_HOST=000.000.00.000
DB_PORT=5432
DB_NAME=hellolist
DB_SCHEME=asyncpg
SECRET_KEY="mysecret"
ALGORITHM="HS256"
ps aux | grep postgres 


from app.core.config import settings
print(settings.DB_USER)
print(settings.SECRET_KEY)
DATABASE_URL = (
f"asyncpg://{settings.DB_USER}:{settings.DB_PASSWORD}"
f"@{settings.DB_HOST}:{settings.DB_PORT}/{settings.DB_NAME}"
)
login → JWT 발급 → Authorization 헤더로 전달 → Depends(oauth2_scheme)
→ get_current_user → 보호된 API 실행
Authorization: Bearer <token> get_current_user() 에서 디코딩