๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿš€ 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.