Post

2025-07-17 ํ•™์Šต ๋…ธํŠธ

2025-07-17 ํ•™์Šต ๋…ธํŠธ

๐Ÿ“š ๋„์ปค, ํŒŒ์ด์ฌ, ๋ฆฌ์•กํŠธ ํ•ต์‹ฌ ์š”์•ฝ

๐Ÿณ Docker

๋‹ค๋ฅธ ํ™˜๊ฒฝ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์‰ฝ๊ฒŒ ์ด์‹ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ธฐ์ˆ 

  • ์„ค์น˜์™€ ์‹คํ–‰์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์คŒ
  • โ€œ๋‚ด ์ปดํ“จํ„ฐ์—์„œ๋Š” ์ž˜ ๋˜๋Š”๋ฐโ€ฆโ€ ๋ฌธ์ œ ํ•ด๊ฒฐ
  • ๊ฐ€์ƒ๋จธ์‹ ๋ณด๋‹ค ๊ฐ€๋ณ๊ณ  ๋น ๋ฆ„ (OS ์ปค๋„ ๊ณต์œ )

Docker Compose ํ™œ์šฉ ์ „๋žต

  • ๊ฐœ๋ฐœ ๋‹จ๊ณ„: Docker Compose ์‚ฌ์šฉ (docker compose up -d, docker compose down๋งŒ์œผ๋กœ ๊ฐ„ํŽธ ๊ด€๋ฆฌ)
  • ๋ฐฐํฌ ๋‹จ๊ณ„: Compose ์—†์ด ๊ฐœ๋ณ„ ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ฐฐํฌ (ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ)
  • ๊ฐœ๋ฐœ ์‹œ ๋งค๋ฒˆ ์ปจํ…Œ์ด๋„ˆ์— ๋“ค์–ด๊ฐ€๋Š” ๋ถˆํŽธํ•จ์„ Compose๊ฐ€ ํ•ด๊ฒฐ

๐Ÿ”— API Endpoints

API์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ์ ‘์  URL

  • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ํ†ต์‹  ์ง€์ 
  • RESTful API์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ์š”์†Œ
  • HTTP ๋ฉ”์„œ๋“œ(GET, POST, PUT, DELETE)์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ

โฐ APScheduler

ํŒŒ์ด์ฌ์—์„œ ์ฃผ๊ธฐ์  ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • ํฌ๋ก ์žก ๊ฐ™์€ ์Šค์ผ€์ค„๋ง ์ž‘์—…์„ ํŒŒ์ด์ฌ์œผ๋กœ
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—… ์ž๋™ํ™”์— ์œ ์šฉ
  • ์ธํ„ฐ๋ฒŒ, ํฌ๋ก , ๋‚ ์งœ ๊ธฐ๋ฐ˜ ์Šค์ผ€์ค„๋ง ์ง€์›

๐ŸŽจ ์ฝ”๋“œ ํ’ˆ์งˆ ๋„๊ตฌ๋“ค

Ruff (์ถ”์ฒœ)

  • Black + Flake8 + isort๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ์˜ฌ์ธ์› ํˆด
  • Rust๋กœ ์ž‘์„ฑ๋˜์–ด ๋งค์šฐ ๋น ๋ฅธ ์„ฑ๋Šฅ
  • ํฌ๋งคํŒ…๊ณผ ๋ฆฐํŒ…์„ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌ
  • ์„ค์ • ํŒŒ์ผ ํ•˜๋‚˜๋กœ ๋ชจ๋“  ๊ทœ์น™ ๊ด€๋ฆฌ
  • isort: ํŒŒ์ด์ฌ import ๋ฌธ์„ ์ž๋™์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ํˆด

Black

  • ํŒŒ์ด์ฌ ์ฝ”๋“œ ํฌ๋งคํ„ฐ
  • ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ์ž๋™์œผ๋กœ ํ†ต์ผ
  • โ€œํƒ€ํ˜‘ ์—†๋Š”โ€ ํฌ๋งคํŒ…์œผ๋กœ ์œ ๋ช…

Flake8

  • ํŒŒ์ด์ฌ ๋ฆฐํ„ฐ(Linter)
  • ๋ฌธ๋ฒ• ์˜ค๋ฅ˜, ์Šคํƒ€์ผ ๋ฌธ์ œ, ์ฝ”๋“œ ์Šค๋ฉœ ํƒ์ง€
  • PEP 8 ์ค€์ˆ˜ ํ™•์ธ

๐ŸŒ SPA (Single Page Application)

ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด JavaScript๊ฐ€ ํ™”๋ฉด์„ ๋™์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜๋Š” ์›น์•ฑ ๊ตฌ์กฐ

SPA์˜ ์žฅ๋‹จ์ 

์žฅ์ :

  • ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ํ–ฅ์ƒ (๋น ๋ฅธ ํŽ˜์ด์ง€ ์ „ํ™˜)
  • ์•ฑ ๊ฐ™์€ ๋ถ€๋“œ๋Ÿฌ์šด ์ธํ„ฐ๋ž™์…˜
  • ์„œ๋ฒ„ ๋ถ€ํ•˜ ๊ฐ์†Œ (์ดˆ๊ธฐ ๋กœ๋”ฉ ํ›„ ๋ฐ์ดํ„ฐ๋งŒ ์ฃผ๊ณ ๋ฐ›์Œ)

๋‹จ์ :

  • ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ๊ฐ„ ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ์Œ
  • SEO(๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”) ์–ด๋ ค์›€ - JavaScript ์‹คํ–‰ ์ „์—” ๋นˆ ํŽ˜์ด์ง€

SPA SEO ๋ฌธ์ œ ํ•ด๊ฒฐ๋ฒ•

  • SSR (Server-Side Rendering): ์„œ๋ฒ„์—์„œ HTML์„ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด์„œ ์ „์†ก
  • SSG (Static Site Generation): ๋นŒ๋“œ ์‹œ์ ์— ์ •์  HTML ํŒŒ์ผ๋“ค์„ ๋ฏธ๋ฆฌ ์ƒ์„ฑ
  • React, Vue, Angular ๋“ฑ ์ฃผ์š” ํ”„๋ ˆ์ž„์›Œํฌ ๋ชจ๋‘ SSR/SSG ์ง€์›

๐Ÿ”„ HTTP ํด๋ผ์ด์–ธํŠธ ๋น„๊ต

Python: httpx vs aiohttp

์ƒํ™ฉ์ถ”์ฒœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด์œ 
FastAPI + ๋น„๋™๊ธฐ API ํด๋ผ์ด์–ธํŠธhttpxrequests์™€ ์œ ์‚ฌํ•œ API, ๋™๊ธฐ/๋น„๋™๊ธฐ ๋ชจ๋‘ ์ง€์›
์ €์ˆ˜์ค€ ํผํฌ๋จผ์Šค ๊ทนํ•œ ์ตœ์ ํ™”aiohttp์„ธ๋ฐ€ํ•œ ์ œ์–ด ๊ฐ€๋Šฅ, ์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ ๋ชจ๋‘ ์ง€์›

JavaScript: Axios vs Fetch (์‹ค์ „ ๊ด€์ )

์ƒํ™ฉ์ถ”์ฒœ์ด์œ 
Next.js ํ”„๋กœ์ ํŠธFetchNext.js ๋‚ด์žฅ ์บ์‹ฑ ์ง€์›, ๊ณต์‹ ๊ถŒ์žฅ
์™„์ „ ์ƒ JS + ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €AxiosIE11 ๋“ฑ ๋„ค์ดํ‹ฐ๋ธŒ ์ง€์› (ํด๋ฆฌํ•„ ๋ถˆํ•„์š”)
React/Vue + ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €Fetch๋นŒ๋“œ ๋„๊ตฌ๊ฐ€ ์ž๋™์œผ๋กœ ํด๋ฆฌํ•„ ์ถ”๊ฐ€
๋ณต์žกํ•œ ์š”์ฒญ/์‘๋‹ต ์ฒ˜๋ฆฌAxios์ธํ„ฐ์…‰ํ„ฐ, ์ž๋™ JSON ๋ณ€ํ™˜, ํƒ€์ž„์•„์›ƒ ๋“ฑ
๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ดํ•‘Axios์„ค์ • ๊ฐ„ํŽธ, ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์ž๋™ํ™”

ํด๋ฆฌํ•„ (Polyfill)

๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ตœ์‹  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์ฝ”๋“œ

  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์„ JavaScript๋กœ ๊ตฌํ˜„
  • ์˜ˆ: IE์—์„œ fetch API ์‚ฌ์šฉํ•˜๋ ค๋ฉด fetch ํด๋ฆฌํ•„ ํ•„์š”

๐Ÿ”ง TypeScript

๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ๋งŒ ํƒ€์ž… ์ฒดํฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋…€์„

  • ์‹ค์ œ ์‹คํ–‰์€ JavaScript๋กœ ๋ณ€ํ™˜(ํŠธ๋žœ์ŠคํŒŒ์ผ) ํ›„ ์ง„ํ–‰
  • ์ปดํŒŒ์ผ ํƒ€์ž„์— ํƒ€์ž… ์˜ค๋ฅ˜๋ฅผ ๋ฏธ๋ฆฌ ๋ฐœ๊ฒฌ

โš›๏ธ React ํŠœํ† ๋ฆฌ์–ผ

ํ‹ฑํƒํ†  ๊ฒŒ์ž„ ๊ตฌํ˜„์„ ํ†ตํ•ด ํ•™์Šตํ•œ React ๊ธฐ์ดˆ

๋ถˆ๋ณ€์„ฑ (Immutability)

  • ์›๋ณธ state๋ฅผ ์ง์ ‘ ๋ณ€ํ˜•ํ•˜์ง€ ์•Š๊ณ  ๋ณต์‚ฌ๋ณธ ์ƒ์„ฑ
  • squares.slice()๋กœ ๋ฐฐ์—ด ๋ณต์‚ฌ ํ›„ ์ˆ˜์ •
  • ๋ถˆํ•„์š”ํ•œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€๋กœ ์„ฑ๋Šฅ ์ตœ์ ํ™”
  • ์‹œ๊ฐ„ ์—ฌํ–‰ ๋””๋ฒ„๊น…๊ณผ ์ƒํƒœ ์ถ”์ ์—๋„ ๋„์›€

Key Props

  • React๊ฐ€ ๊ฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ณ ์œ  ์‹๋ณ„์ž
  • ๋™์  ๋ฆฌ์ŠคํŠธ ๋ Œ๋”๋ง ์‹œ ํ•„์ˆ˜ (๊ณต์‹ ๊ถŒ์žฅ)

๐Ÿ“ Markdown ์ž‘์„ฑ ํŒ

ํ‘œ(Table) ์ž‘์„ฑ ๊ทœ์น™

ํ‘œ ๋ฐ”๋กœ ์œ„์•„๋ž˜์— ํ…์ŠคํŠธ๊ฐ€ ์žˆ์œผ๋ฉด ํ‘œ๊ฐ€ ์ธ์‹๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
โŒ ์ž˜๋ชป๋œ ์˜ˆ:
์ด ํ…์ŠคํŠธ ๋ฐ”๋กœ ์•„๋ž˜์— ํ‘œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
| ์ปฌ๋Ÿผ1 | ์ปฌ๋Ÿผ2 |
|-------|-------|
| ๊ฐ’1   | ๊ฐ’2   |
์ด ํ…์ŠคํŠธ ๋ฐ”๋กœ ์œ„์— ํ‘œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ:
์ด ํ…์ŠคํŠธ ์•„๋ž˜์— ๋นˆ ์ค„์„ ๋„ฃ๊ณ  ํ‘œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

| ์ปฌ๋Ÿผ1 | ์ปฌ๋Ÿผ2 |
|-------|-------|
| ๊ฐ’1   | ๊ฐ’2   |

์ด ํ…์ŠคํŠธ ์œ„์— ๋นˆ ์ค„์ด ์žˆ๊ณ  ๊ทธ ์œ„์— ํ‘œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
This post is licensed under CC BY 4.0 by the author.