๐ Backend21 [Database] CAP ์ด๋ก (CAP Theorem) 1. CAP ์ด๋ก ๐ฏ ํต์ฌ ํ ์ค ์์ฝ๋ถ์ฐ ์์คํ ์์ ์ผ๊ด์ฑ, ๊ฐ์ฉ์ฑ, ๋ถํ ํ์ฉ์ฑ ์ค 2๊ฐ๋ง ์ ํ ๊ฐ๋ฅ๐ ๊ธฐ๋ณธ ๊ฐ๋ CAP๋?C: Consistency (์ผ๊ด์ฑ) - ๋ชจ๋ ๋ ธ๋๊ฐ ๊ฐ์ ๋ฐ์ดํฐA: Availability (๊ฐ์ฉ์ฑ) - ํญ์ ์๋ต ๊ฐ๋ฅP: Partition Tolerance (๋ถํ ํ์ฉ์ฑ) - ๋คํธ์ํฌ ๋์ด์ ธ๋ ๋์์ 3๊ฐ ๋ค ์ ๋๋?๋คํธ์ํฌ ๋ถํ ์ → ์ผ๊ด์ฑ vs ๊ฐ์ฉ์ฑ ์ค ์ ํํด์ผ ํจ โ๏ธ 3๊ฐ์ง ์กฐํฉ์ ํ์๋ฏธ์ฌ์ฉ ์ฉ๋์์CP์ ํ์ฑ ์ฐ์ ์๋น์ค ์ค๋จ ํ์ฉ๋, ์๋ฃMongoDB, RedisAP์๋ ์ฐ์ ๋ฐ์ดํฐ ์ฐจ์ด ํ์ฉSNS, ์์Cassandra, DynamoDBCA์ด๋ก ์๋ง ์กด์ฌ ๋ถ์ฐํ๊ฒฝ ๋ถ๊ฐ๋จ์ผ์๋ฒMySQL, PostgreSQL ๐ก ์ค๋ฌด ์ ํ๋ฒCP ์ ํ → ์ ํํด์ผ ํ๋ ๊ฒ์ํ (.. 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 ๋ค์