|
1장 우리가 만들 프로젝트와 도구 이해
1.1?프로젝트를 만들고 운영해야 하는 이유? __1.1.1?포트폴리오 목적으로 프로젝트 만들기? __1.1.2?학습 목적으로 프로젝트 만들기? __1.1.3?프로젝트 목표를 출시 후 운영하는 것에 두자!? 1.2?FastAPI를 사용하는 이유 __1.2.1?FastAPI란? __1.2.2?FastAPI 특징 1.3?우리가 만들 프로젝트의 목표와 계획? __1.3.1?목표? __1.3.2?프로젝트 계획? 1.4?약속 잡기 프로젝트에 사용하는 도구? __1.4.1?개발 도구? __1.4.2?운영 도구 2장 셸 기본 기능 익히기 2.1?셸이란? __2.1.1?셸 인터페이스의 종류 2.2?경로와 디렉터리? __2.2.1?경로 __2.2.2?디렉터리 2.3?파일 다루기 3장 실습 환경 준비 3.1?비주얼 스튜디오 코드 설치? __3.1.1?비주얼 스튜디오 코드 내려받기? __3.1.2?맥OS에 설치하기? __3.1.3?윈도우에 설치하기? 3.2?비주얼 스튜디오 코드 화면 구성? 3.3?비주얼 스튜디오 코드 기본 사용법? __3.3.1?작업 디렉터리 지정하기? __3.3.2?명령어 팔레트? __3.3.3?파일 탐색과 상태 표시? 3.4?비주얼 스튜디오 코드 확장 기능? __3.4.1?확장 기능이란? __3.4.2?외양 바꾸기? __3.4.3?파이썬 확장 기능 설치하기? __3.4.4?셸 사용해 보기 3.5?파이썬 가상 환경? __3.5.1?파이썬 가상 환경이란? __3.5.2?가상 환경 다루기? 3.6?FastAPI 설치하고 맛보기 __3.6.1?FastAPI 설치하기? __3.6.2?패키지 관리자, Poetry 사용하기? __3.6.3?웹 애플리케이션 서버: Starlette, Uvicorn? __3.6.4?Hello World 4장 약속 잡기 서비스 기획 4.1?약속 잡기 서비스 기능 기획? __4.1.1?서비스 개요? 4.2?주요 기능? __4.2.1?캘린더 구현: 원하는 일자 선택하기? __4.2.2?부킹 생성: 일정 등록하기 __4.2.3?사용자별 캘린더 구분해서 보기? __4.2.4?구글 캘린더 연동하기? __4.2.5 소셜 로그인 구현하기? 4.3?사용자 인터페이스 요소 기획? __4.3.1?기본 화면? __4.3.2?타임슬롯 영역? __4.3.3?약속 잡을 정보를 입력하는 화면? __4.3.4?약속 신청 완료 화면? __4.3.5?약속 신청할 일자가 없는 경우? 4.4?데이터 설계? __4.4.1?몇 가지 개념 알고 가기? __4.4.2?사용자 개체? __4.4.3?사용자 소셜 계정 개체? __4.4.4?사용자 캘린더 개체? __4.4.5?타임슬롯 개체? __4.4.6?부킹 개체? __4.4.7?약속 잡기 서비스의 개체 관계 다이어그램으로 그려 보기 5장 데이터 모델링 5.1?파이썬에서 데이터베이스를 사용하는 방법: SQLModel? __5.1.1?SQL과 ORM? __5.1.2?SQLAlchemy? __5.1.3?Pydantic? __5.1.4?SQLModel? 5.2?모델링? __5.2.1?사용자 개체: User 모델? __5.2.2?사용자 소셜 계정 개체: OAuthAccount 모델 __5.2.3?사용자 캘린더 개체: Calendar 모델 __5.2.4?타임슬롯 개체: TimeSlot 모델? __5.2.5?부킹 개체: Booking 모델 5.3?데이터베이스 연결 설정? __5.3.1?SQLite란? __5.3.2?SQLAlchemy로 데이터베이스에 연결하는 방법? __5.3.3?SQLAlchemy로 세션을 생성하는 방법? __5.3.4?데이터베이스 연결 설정하기? 5.4?Alembic을 사용하여 데이터베이스 마이그레이션? __5.4.1?Alembic 주요 개념? __5.4.2?Alembic 설치하고 초기화하기? __5.4.3?Alembic 설정하기? __5.4.4?마이그레이션 스크립트 생성하기? __5.4.5?자동 마이그레이션(autogenerate) 설정해 보기? __5.4.6?마이그레이션 스크립트 템플릿 사용하기? __5.4.7?마이그레이션 스크립트 작동 확인하기: 적용 및 되돌리기? 6장 코드 테스트 6.1?테스팅 개요? __6.1.1?테스팅이란? __6.1.2?테스팅 종류? __6.1.3?테스트 더블? __6.1.4?pytest를 사용하여 테스팅하기? 6.2?단위 테스트 실습? __6.2.1?단위 테스트 실습? __6.2.2?문서화 테스트 알아보기? 6.3?통합 테스트 실습? __6.3.1?사용자 정보를 내려받는 API 구현하기? __6.3.2?테스트 클라이언트로 API 테스트하기? __6.3.3?데이터베이스에 사용자 생성하고 테스트하기? 6.4?pytest의 픽스처 기능을 사용한 테스팅? __6.4.1?테스트 코드에 픽스처 사용하기? __6.4.2?구현 코드에도 세션 의존성 주입하기? __6.4.3?테스트 클라이언트도 픽스처로 일원화하기 7장 회원가입 및 사용자 인증 구현 7.1?회원가입 테스트 코드 작성? __7.1.1?(1) 모든 입력 항목을 유효한 값으로 입력하면 계정이 생성된다? __7.1.2?(2) 사용자명이 유효하지 않으면 유효하지 않다는 메시지를 담은 오류를 일으킨다? __7.1.3?(3) 계정 ID(username)가 중복되면 중복 계정 ID 오류를 일으킨다? __7.1.4?(4) 이메일 주소가 중복되면 중복 메시지를 담은 오류를 일으킨다? __7.1.5?(5) 표시명을 입력하지 않으면 무작위 문자열 8글자로 대신한다 7.2?회원가입 API 구현? __7.2.1?(1) Pydantic으로 Formdata 유효성 검증하기 __7.2.2?(2) signup API에 SignupPayload 스키마 적용하기? __7.2.3?(3) 응답 결과에는 username, display_name, is_host만 출력하기? 7.3?로그인 구현? __7.3.1?로그인 구현에 필요한 기술? __7.3.2?로그인 API 구현하기? 7.4?자기 자신의 정보를 가져오는 API 구현? __7.4.1?FastAPI의 의존성 주입이란? __7.4.2?자신의 정보를 가져오는 API 시나리오? __7.4.3?쿠키에서 인증 토큰을 가져와 인증 검사하기? __7.4.4?실패하는 테스트 코드로 구현 검증하기? 7.5?FastAPI 캘린더, 계정 설정 페이지 구현? __7.5.1?계정 정보 변경하기? __7.5.2?로그아웃 구현하기? __7.5.3?회원 탈퇴 구현하기 8장 사용자별 캘린더 및 예약 관리 구현 8.1?호스트별 캘린더 가져오기? __8.1.1?사용자 시나리오? __8.1.2?호스트인 사용자의 username으로 캘린더 정보 가져오기? __8.1.3?존재하지 않는 사용자의 username으로 캘린더 정보를 가져오려고 하면 404 응답 반환하기? __8.1.4?호스트가 아닌 사용자의 username으로 캘린더 정보를 가져오려고 하면 404 응답 반환하기? __8.1.5?host_calendar_detail(?)을 API로 테스트하기 8.2?호스트의 캘린더를 생성하고 변경? __8.2.1 호스트 사용자는 유효한 캘린더 정보를 제출하여 캘린더를 생성할 수 있다? __8.2.2?캘린더가 있는 상황에서 추가 생성하려고 하면 422 응답 반환하기? __8.2.3?게스트 사용자가 캘린더를 생성하려고 하면 403 응답 반환하기 __8.2.4?사용자가 변경하는 항목만 변경되고 나머지는 기존 값 유지하기? 8.3?타임슬롯 관리? __8.3.1?호스트 사용자는 유효한 타임슬롯 정보를 제출하여 타임슬롯을 생성할 수 있다? __8.3.2?유효하지 않은 타임슬롯 정보로 생성하려고 하면 HTTP 422 응답하기? __8.3.3?겹치는 시간대가 있다면 HTTP 422 응답하기? 8.4?예약? __8.4.1?유효한 예약 신청 내용으로 예약 생성을 요청하면 예약 내용을 담아 HTTP 201 응답하기? __8.4.2?호스트가 아닌 사용자에게 예약을 생성하면 HTTP 404 응답하기? __8.4.3?없는 시간대에 예약을 생성하면 HTTP 404 응답하기? 8.5?캘린더 예약 가져오기? __8.5.1?호스트가 자신이 예약받은 내역을 받아 보는 API 구현하기? __8.5.2?게스트는 호스트의 캘린더 예약 내역을 월 단위로 받는다? __8.5.3?게스트는 자신의 캘린더 예약 내역을 페이지 단위로 받는다? __8.5.4?사용자는 특정 예약 내역 데이터를 받는다? 8.6?FastAPI 캘린더, 예약 관리? __8.6.1?호스트는 자신에게 신청한 부킹에 대해 일자, 타임슬롯을 변경할 수 있다? __8.6.2?게스트와 호스트는 다른 호스트의 타임슬롯으로 변경할 수 없다? __8.6.3?게스트는 자신의 부킹에 대해 주제, 설명, 일자, 타임슬롯을 변경할 수 있다? __8.6.4?여러분을 위한 작은 제안? 8.7?부킹에 참석 상태 정보 다루기? __8.7.1?부킹 모델에 참석 상태 필드 추가, Enum 자료형? __8.7.2?데이터베이스 마이그레이션? __8.7.3?호스트는 자신에게 신청한 부킹의 참석 상태를 변경할 수 있다 8.8?파일 업로드? __8.8.1?HTTP 파일 업로드하기? __8.8.2?FastAPI에서 파일 업로드를 처리하는 방식? __8.8.3?게스트는 자신이 신청한 부킹에 파일을 업로드할 수 있다: 연습하기? __8.8.4?fastapi-storages 사용하기? __8.8.5?게스트는 자신이 신청한 부킹에 파일을 업로드할 수 있다: 실제 해 보기? __8.8.6?업로드 관련 마이그레이션 스크립트 생성하기? __8.8.7?SQLAlchemy의 Result 객체를 다룰 때 unique(?) 메서드 사용하기 9장 운영자 페이지에서 데이터 관리 9.1?운영자 페이지와 SQLAdmin? __9.1.1?운영자 페이지? __9.1.2?SQLAdmin이란? __9.1.3?SQLAdmin 설치와 설정? 9.2?SQLAdmin 기본 활용법? __9.2.1?메타데이터? __9.2.2?목록 페이지 __9.2.3?상세 페이지? __9.2.4?페이지네이션 옵션? __9.2.5?일반 옵션? __9.2.6?양식(form) 옵션? __9.2.7?내보내기 옵션? __9.2.8?모델 개별 개체 표시 조정하기? __9.2.9?모델들에 대응하는 어드민 페이지 정의하기? 9.3?메서드 오버라이딩을 활용하여 기능 확장 및 변경? __9.3.1 on_model_change(self, data: dict, model: Any, is_created: bool, request: Request)? __9.3.2?insert_model(self, request: Request, data: dict) __9.3.3?update_model(self, request: Request, pk: str, data: dict)? __9.3.4 after_model_change(self, data: dict, model: Any, is_created: bool, request: Request)? __9.3.5?User 모델에 status 모델 필드 추가하기? __9.3.6?on_model_delete(self, model: Any, request: Request) __9.3.7 after_model_delete(self, model: Any, request: Request)? __9.3.8?delete_model(self, request: Request, pk: Any)? __9.3.9?scaffold_form(?)? __9.3.10?list_query(self, request: Request) __9.3.11?hybrid_property와 expression __9.3.12?search_query(self, stmt: Select, term: str)? 9.4?SQLAdmin 사용자 인증 체계? __9.4.1?인증 백엔드 구현하기? __9.4.2?인증 백엔드 적용하기 10장 약속 잡기 프로젝트에 프런트엔드 연동 10.1?정적 파일? __10.1.1?웹 서버와 웹 애플리케이션 서버? __10.1.2?FastAPI에서 정적 파일 처리? 10.2?구현된 결과물을 파이썬 웹 서버로 구동? 10.3?CORS 처리? 10.4?호스트 목록 API? 10.5?인증 토큰이 없는 경우에 대한 명확한 응답 __10.5.1?인증 토큰이 없는 경우 대응하기? __10.5.2?SQLAdmin에도 명확한 인증 예외 오류 처리하기 10.6?캘린더 흐름? __10.6.1?호스트 목록? __10.6.2?캘린더 표시? __10.6.3?부킹 생성? __10.6.4?게스트의 부킹 내역? __10.6.5?부킹 상세 보기? 10.7?웹 프런트엔드 개발 명세? __10.7.1?사용하는 기술 스택? __10.7.2?디렉터리 구조? __10.7.3?개발 환경 구성 11장 SQLAlchemy 지연 로딩 전략 11.1?지연 로딩이란 11.2?지연 로딩의 종류? __11.2.1?즉시 로딩? __11.2.2?지연 로딩? __11.2.3?지연 로딩 안 함(no load) __11.2.4?차이점? __11.2.5?유의점? 11.3?SQLAlchemy 지연 로딩 적용? __11.3.1?(1) User 모델에 지연 로딩 적용하기? __11.3.2?(2) OAuthAccount 모델에 지연 로딩 적용하기 __11.3.3?(3) Calendar 모델에 지연 로딩 적용하기? __11.3.4?(4) TimeSlot 모델에 지연 로딩 적용하기 __11.3.5?(5) Booking 모델에 지연 로딩 적용하기? __11.3.6?(6) BookingFile 모델에 지연 로딩 적용하기 12장 구글 캘린더 연동 12.1?구글 클라우드 API? __12.1.1?구글 클라우드 API란? __12.1.2?구글 클라우드 API의 주요 요소와 개념? __12.1.3?구글 클라우드 콘솔 준비 __12.1.4?캘린더 공유 및 권한 부여하기? 12.2?구글 캘린더에 이벤트 생성? __12.2.1?구글 클라우드 API 파이썬 클라이언트 설치하기? __12.2.2?구글 캘린더 서비스 정의? __12.2.3?일정(이벤트) 생성하기? __12.2.4?테스트 구현하기 __12.2.5?스키마 정의하기? 12.3?구글 캘린더의 이벤트 관리? __12.3.1?테스트 픽스처 정의하기? __12.3.2?일정 삭제하기? __12.3.3?특정 일정 가져오기? __12.3.4?일정 수정하기? __12.3.5?일정 목록 가져오기? 12.4?약속 잡기 구현체에 구글 캘린더 연동 적용? __12.4.1?구글 캘린더 서비스 의존성 정의하기 __12.4.2?부킹을 생성할 때 구글 캘린더에 등록하기? __12.4.3?부킹을 변경할 때 구글 캘린더에 반영하기 __12.4.4?호스트 부킹 목록에서 구글 캘린더 일정 반영하기? 12.5?FastAPI 백그라운드 작업? __12.5.1?BackgroundTasks? __12.5.2?StreamResponse 13장 오류 기록과 관찰, 관리 13.1?오류 로그 체계? 13.2?Sentry란? 13.3?계정과 프로젝트 생성? 13.4?약속 잡기 프로젝트에 Sentry 반영? __13.4.1?초기화 인자? __13.4.2?통합(integration) 도구 인자 13.5?오류 로그 테스트? 13.6?수동으로 로그 남기기 14장 아마존 웹 서비스에 배포하기 14.1?의존 패키지 관리? __14.1.1?패키지 관리자? __14.1.2?의존 패키지 동결? __14.1.3?uv로 더 빠르게 설치하기? 14.2?AWS Lightsail(라이트세일)로 서버 구성? __14.2.1?AWS Lightsail이란? __14.2.2?Lightsail 서비스? __14.2.3?Lightsail에 서버 구성하기 14.3?인스턴스 서버에 환경 구성? __14.3.1?SSH와 SSH 인증키? __14.3.2?apt 패키지 관리자? __14.3.3?빌드 도구 설치하기? __14.3.4?Nginx? __14.3.5?파이썬 가상 환경 구성하기? __14.3.6?Hello World용 FastAPI 앱 작성하기? __14.3.7?웹 애플리케이션 구동 스크립트 작성하기? __14.3.8?Systemd로 서비스 관리하기? __14.3.9?Nginx에 프록시로 연결하기? __14.3.10?Nginx로 정적 파일 서빙하기 14.4?깃허브 액션을 사용하여 배포 자동화? __14.4.1?깃허브 액션이란 __14.4.2?기본 개념 이해하기 __14.4.3?깃허브 워크플로 작성하기 |