๐ Backend21 [Database] CAP ์ด๋ก (CAP Theorem) ๋ถ์ฐ ์์คํ ์์ Consistency, Availability, Partition tolerance ์ด ์ธ ๊ฐ์ง๋ฅผ ๋ชจ๋ ๋ง์กฑํ๋ ๊ฑด ๋ถ๊ฐ๋ฅ1. CAP ์ด๋ก ์ด๋?CAP = Consistency / Availability / Partition Tolerance์ธ ๊ฐ์ง ์ค ๋ ๊ฐ์ง๋ง ๋ณด์ฅ ๊ฐ๋ฅ 2. CAP ํญ๋ชฉ 1. Consistency์ฌ์ฉ์๊ฐ ์ด๋ค ๋ ธ๋์ ์ ๊ทผํ๋ , ํญ์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ผ ํจ. ์ฆ, ์ฐ๊ธฐ ์์ ์ด ๋ฐ์ํ ํ ๋ชจ๋ ๋ณต์ ๋ณธ์ด ์ฆ์ ์ ๋ฐ์ดํธ๋์ด์ผ ํจ.2. Availability์์คํ ์ ํญ์ ์์ฒญ์ ์๋ตํด์ผ ํจ. ์ฑ๊ณตํ๋ ์คํจํ๋ ์๋ต์ด ์์ด์ผ ํ๋ฉฐ, ์ ๋ ์์คํ ์ด ์ค๋จ๋๋ฉด ์ ๋จ.3. Partition Tolerance์์คํ ๋ด ๋ ธ๋ ๊ฐ ๋คํธ์ํฌ๊ฐ ๋๊ฒจ๋, ์ ์ฒด ์์คํ ์ ์ ์ ์๋ํด์ผ ํจ. 3.. 2025. 5. 12. [FastAPI] N+1 Problem 1. N+1 ProblemORM์ผ๋ก ๊ด๊ณํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋, ํ๋ฒ์ ์ฟผ๋ฆฌ(N) ๋ก ๊ฐ์ ธ์จ ๊ฐ ํญ๋ชฉ์ ๋ํด ์ถ๊ฐ์ ์ธ ์ฟผ๋ฆฌ (+1)๊ฐ ๋ฐ๋ณต ์คํ๋๋ ๋ฌธ์ ์์๋ธ๋ก๊ทธ ๊ธ(Post) 10๊ฐ๋ฅผ ๊ฐ์ ธ์ค๋ฉด (SELECT * FROM post)๊ฐ ๊ธ์ ์์ฑ์(User)๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์ถ๊ฐ๋ก 10๊ฐ์ ์ฟผ๋ฆฌ (SELECT * FROM user WHERE id = ?) ์คํ๋จ 2. FastAPI + SQLAlchemy ์์ ๋ชจ๋ธ ์ ์# models.pyfrom sqlalchemy import Column, Integer, String, ForeignKeyfrom sqlalchemy.orm import relationshipfrom app.database import Baseclass User(Base): __tab.. 2025. 5. 7. [Swift + Supabase] OAuth - Sign in with Apple Swift์์ Supabase ๋ฅผ ํ์ฉํด์ Apple OAuth ๊ตฌํ ๋ฐฉ๋ฒ(์ฝ์ง ํ๊ธฐ) 1. Apple Developer Console ์ค์ Service ID ์์ฑApple Developer -> Certificates, Identifiers & ProfilesSign in with Apple ํ์ฑํKey ์์ฑ Certificates -> Key + ๋ฒํผ"Sign in with Apple" .p8 ํ์ผ ๋ค์ด๋ก๋Redirect URI ๋ฑ๋ก2.Supabase ์์ ๋ง๋ค์ด์ง redirect URL ์ถ๊ฐ .p8 ํ์ผ์์ Secret Key ๋ฝ๊ธฐsecret Key ๋ฅผ ๋ด๊ฐ ๋ฝ์์ผํ๋ค# Pythonimport jwtimport datetimeTEAM_ID = ''CLIENT_ID = ''KEY_ID = ''with.. 2025. 4. 28. [FastAPI] Middleware ๋ฏธ๋ค์จ์ด (CORS, Logging) 1. ๋ฏธ๋ค์จ์ด๋?FastAPI์ ๋ฏธ๋ค์จ์ด๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ(Request)์ ์๋ต(Response) ์ฌ์ด์ ์คํ๋๋ ๊ฐ๋ก์ฑ๊ธฐ ํจ์์ฃผ๋ก ์ธ์ฆ, ๋ก๊น , ์ฑ๋ฅ ์ธก์ , ์๋ฌ ์ฒ๋ฆฌ, ๋ณด์ ๋ฑ ๊ณตํต ๊ธฐ๋ฅ์ ๊ตฌํํ๋๋ฐ ์ฌ์ฉ ๊ฐ๋ฅ๋น์ฆ๋์ค & ๋๋ฉ์ธ ๋ก์ง์ ๋ถ๋ฆฌํ ์ ์์ด, ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ ํฅ์ 2. FastAPI ์์import timefrom fastapi import FastAPI, Requestapp = FastAPI()@app.middleware("http")async def add_process_time_header(request: Request, call_next): start_time = time.perf_counter() # ์ค์ ๋ผ์ฐํฐ ํจ์ ํธ์ถ ์ response = await ca.. 2025. 4. 20. [FastAPI] SSE (Server-Sent Events) 1. Server-Sent EventsSSE(Server-Sent Events) ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์ฐ๊ฒฐ์ ์ ์งํ ์ฑ, ์๋ฒ์์ ๋ฐ์ํ๋ ์ค์๊ฐ ์ด๋ฒคํธ๋ฅผ ์ง์์ ์ผ๋ก ์ ๋ฌ๋ฐ๋ ๋ฐฉ์๐ “์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ํ ๋ฒ ์ฐ๊ฒฐ๋ก ์ฌ๋ฌ ๋ฒ ์๋ต์ ๋ณด๋ผ ์ ์๋ HTTP ๊ธฐ๋ฐ ๊ธฐ์ ” 2. SSE ๊ตฌ์กฐํด๋ผ์ด์ธํธ๋ EventSource ๊ฐ์ฒด๋ฅผ ํตํด ์๋ฒ์ ์์ฒญ์ ๋ณด๋ ๋๋ค.์๋ฒ๋ text/event-stream ํ์ ์ผ๋ก ์๋ต์ ๋ณด๋ด๊ณ ์ฐ๊ฒฐ์ ์ ์งํ ์ฑ ์ฌ๋ฌ ๋ฉ์์ง๋ฅผ ์ ์กํฉ๋๋ค.ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ๊ฐ ๋ฉ์์ง๋ฅผ ์ค์๊ฐ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค.# ClientGET /stream HTTP/1.1Accept: text/event-stream # Responseevent: datadata: Hello, world!event: fin.. 2025. 4. 16. [FastAPI] SQLModel 1. SQLModel์ด๋?๊ธฐ์กด Python SQL ORM ๊ตฌํ์ฒด์ธ SQLAlchemy์ ๊ฒ์ฆ ํจํค์ง Pydantic์ ๊ฒฐํฉํ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ๋ณด๋ค ๊ฐ๊ฒฐํ๊ณ ์ง๊ด์ ์ผ๋ก ์ํํ ์ ์๋ค.SQLAlchemy์ ORM ๊ธฐ๋ฅ์ ์ ์งํ๋ฉด์๋ Pydantic์ ๋ฐ์ดํฐ ๊ฒ์ฆ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒ์ด ํน์ง์ด๋ค. 2. SQLAlchemy vs SQLModelSQLAlchemy๋ ๋ ๊ฐ์ง ์ฃผ์ API ์คํ์ผ์ ์ ๊ณตํ๋ค.SQLAlchemy Core: ์ ์์ค SQL ํํ์ ์ฌ์ฉํ์ฌ SQL์ ์ง์ ๋ค๋ฃฐ ์ ์๋๋ก ์ค๊ณ๋จSQLAlchemy ORM: ๊ฐ์ฒด-๊ด๊ณ ๋งคํ(Object-Relational Mapping)์ ํตํด Python ํด๋์ค๋ก DB ๋ชจ๋ธ์ ๋ค๋ฃฐ ์ ์์SQLModel์ SQLAlchemy .. 2025. 3. 14. ์ด์ 1 2 3 4 ๋ค์