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

์ „์ฒด ๊ธ€116

Asyncio - ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ฃผ์š” ๊ฐœ๋…ํŒŒ์ด์ฌ์˜ asyncio ๋ชจ๋“ˆ์€ ๋น„๋™๊ธฐ I/O, ์ด๋ฒคํŠธ ๋ฃจํ”„, coroutines ๋ฐ ํƒœ์Šคํฌ(task) ๊ด€๋ฆฌ ๋“ฑ์„ ํ†ตํ•ด ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. asyncio๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋„คํŠธ์›Œํฌ ๋ฐ ์›น ์†Œ์ผ“, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ํŒŒ์ผ I/O ๋“ฑ์˜ ์ž‘์—…์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.์ด๋ฒคํŠธ ๋ฃจํ”„ (Event Loop):์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ์ฝ”๋ฃจํ‹ด๊ณผ ์ฝœ๋ฐฑ์„ ๊ด€๋ฆฌํ•˜๊ณ , I/O ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.asyncio.run() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.์ฝ”๋ฃจํ‹ด (Coroutine):async def๋กœ ์ •์˜๋œ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์ฝ”๋ฃจํ‹ด์ด๋‚˜ ๋น„๋™๊ธฐ ์ž‘์—…์„ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.ํƒœ์Šคํฌ (Task):์ฝ”๋ฃจํ‹ด์„ ์ด๋ฒคํŠธ ๋ฃจํ”„์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์œ„๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค... 2024. 6. 23.
์ฝ”๋ฃจํ‹ด ์ฝ”๋ฃจํ‹ด์˜ ๊ธฐ๋ณธ ๊ฐœ๋…ํŒŒ์ด์ฌ์˜ ์ฝ”๋ฃจํ‹ด(coroutine)์€ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ฝ”๋ฃจํ‹ด์€ ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์‹คํ–‰ ์ค‘์— ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  ๋‚˜์ค‘์— ๋‹ค์‹œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋™์‹œ์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ณ  I/O ์ž‘์—…์„ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ด์ฌ์˜ ์ฝ”๋ฃจํ‹ด์€ async ๋ฐ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜ํ•˜๊ณ  ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.์ •์˜: ์ฝ”๋ฃจํ‹ด ํ•จ์ˆ˜๋Š” async def ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜๋ฉ๋‹ˆ๋‹ค.ํ˜ธ์ถœ: ์ฝ”๋ฃจํ‹ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ์ฝ”๋ฃจํ‹ด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.์ผ์‹œ ์ค‘์ง€์™€ ์žฌ๊ฐœ: ์ฝ”๋ฃจํ‹ด ๋‚ด๋ถ€์—์„œ await ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์ฝ”๋ฃจํ‹ด์„ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์ด๋•Œ ์ฝ”๋ฃจํ‹ด์€ ์ผ์‹œ ์ค‘์ง€๋˜๋ฉฐ, ํ•ด๋‹น ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ๋‹ค์‹œ ์‹คํ–‰์„ ์žฌ๊ฐœํ•ฉ๋‹ˆ๋‹ค.  ์ฝ”๋ฃจํ‹ด์˜ ์˜ˆ์ œ๋‹ค.. 2024. 6. 23.
ํŒŒ์ด์ฌ ๊นŠ์€ ๋ณต์‚ฌ์™€ ์–•์€ ๋ณต์‚ฌ ๊ฐ์ฒด ์ฐธ์กฐ ํ™•์ธr1 = [1,2,3]r2 = r1r1 is r2 # True(r1๊ณผ r2๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด๋Š” ๋™์ผํ•œ๊ฐ€?)r1 == r2 # True(r1๊ณผ r2์˜ ๊ฐ’์ด ๊ฐ™์€๊ฐ€?)r1 = [1,2,3]r2 = list(r1)r1 is r2 # False(r1๊ณผ r2๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด๋Š” ๋™์ผํ•œ๊ฐ€?)r1 == r2 # True(r1๊ณผ r2์˜ ๊ฐ’์ด ๊ฐ™์€๊ฐ€?)์–•์€ ๋ณต์‚ฌ์˜ ๋ฌธ์ œ์ ์„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.r1 = ['John', ('man', 'USA'), [175, 23]]r2 = list(r1)r2[2][1] += 1 # John์˜ ๋‚˜์ด ํ•œ์‚ด ๋” ๋จน์Œprint(r1)print(r2)# ['John', ('man', 'USA'), [175, 24]]# ['John', ('man', 'USA'), [175.. 2024. 4. 29.
Mutable๊ณผ Immutable ๊ฐ์ฒด ํŒŒ์ด์ฌ์—์„œ ๋ณ€์ˆ˜๋Š” ๋‘ ๊ฐ€์ง€ ํƒ€์ž…์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค: mutable(๊ฐ€๋ณ€)๊ณผ immutable(๋ถˆ๋ณ€)์ž…๋‹ˆ๋‹ค. ์ด ๋‘˜์€ ๋ณ€์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.Immutable ๊ฐ์ฒดImmutable ๊ฐ์ฒด๋Š” ํ•œ ๋ฒˆ ์ƒ์„ฑ๋˜๋ฉด ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ณ€์ˆ˜๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋œ ํ›„์—๋Š” ๊ทธ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.์ฃผ์š” immutable ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ๋Š” int(์ •์ˆ˜), float(๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆ˜), str(๋ฌธ์ž์—ด), tuple(ํŠœํ”Œ) ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.x = 5 # int ๋ณ€์ˆ˜๋Š” immutabley = "Hello" # str ๋ณ€์ˆ˜๋„ immutable# ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.x = x + 1 # x ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ƒˆ๋กœ์šด ๊ฐ’์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.y[0] = 'h' # ๋ฌธ์ž์—ด์€ ๋ณ€๊ฒฝํ• .. 2024. 4. 29.
[ํฌ์ผ“๋ฒ ์ด์Šค(PocketBase)] ๋ฐฑ์—”๋“œ ์ž๋™ ๊ตฌ์ถ• ์„œ๋น„์Šค ํฌ์ผ“๋ฒ ์ด์Šค ์†Œ๊ฐœ ์ตœ๊ทผ ํฌ์ผ“๋ฒ ์ด์Šค(PocketBase)๊ฐ€ ๋ฒ ํƒ€๋ฒ„์ „(v0.8)์œผ๋กœ ์ถœ์‹œ๋์Šต๋‹ˆ๋‹ค. ํฌ์ผ“๋ฒ ์ด์Šค๋Š” ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๋œ ์ž‘์€ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ณต์žกํ•œ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค(DB๊ด€๋ฆฌ, ์›น์„œ๋ฒ„, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, API ๋“ฑ)์„ ์Šค์Šค๋กœ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•„๋„ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ํฌ์ผ“๋ฒ ์ด์Šค๋Š” ๊ธฐ์กด์˜ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋กœ ์ž˜ ์•Œ๋ ค์ง„ ํŒŒ์ด์–ด๋ฒ ์ด์Šค, ์Šˆํผ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ๊ฐ•๋ ฅํ•œ ๋Œ€์ฒด์žฌ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ตฌ์กฐ ์ž์ฒด๊ฐ€ ์‹ฌํ”Œํ•˜๋‹ค๋ณด๋‹ˆ ๋น ๋ฅด๋ฉด์„œ ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํฌ์ผ“๋ฒ ์ด์Šค๋Š” ์˜คํ”ˆ ์†Œ์Šค ๊ธฐ๋ฐ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด๋ฃŒ์ž…๋‹ˆ๋‹ค. Go๋กœ ๋งŒ๋“ค์–ด์กŒ์œผ๋ฉฐ ํŒŒ์ผ DB์ธ SqliteDB๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํฐ ๊ทœ๋ชจ๋Š” ์•„๋‹ˆ์—ฌ๋„ ์ ๋‹นํ•œ ๊ทœ๋ชจ์˜ ์„œ๋น„์Šค๋Š” ์ด์ œ ํฌ์ผ“๋ฒ ์ด์Šค ๋งŒ์œผ๋กœ ๋ฐฑ์—”๋“œ ๊ณผ์ •์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. API ํด๋ผ์ด์–ธํŠธ ๋ถ€๋ถ„๋„ React, VueJ.. 2024. 1. 25.
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค isolation level(๊ฒฉ๋ฆฌ ์ˆ˜์ค€) isolation level(๊ฒฉ๋ฆฌ ์ˆ˜์ค€) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค isolation level(๊ฒฉ๋ฆฌ ์ˆ˜์ค€)์€ ํŠธ๋žœ์žญ์…˜ ๊ฐ„์— ์–ผ๋งˆ๋‚˜ ๊ฒฉ๋ฆฌ๋˜์–ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์€ ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์ด ๋™์‹œ์— ์‹คํ–‰๋  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ข… ๋ฌธ์ œ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, ACID(์›์ž์„ฑ, ์ผ๊ด€์„ฑ, ๊ณ ๋ฆฝ์„ฑ, ์ง€์†์„ฑ) ํŠน์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด, '์ฒ ์ˆ˜๊ฐ€ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์žˆ๋Š” ์ค‘์— ์˜ํฌ๊ฐ€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ฒƒ์ธ๊ฐ€'์— ๋Œ€ํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ๋„ค ๊ฐ€์ง€ ํ‘œ์ค€ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด ์žˆ์Šต๋‹ˆ๋‹ค. 1. Read Uncommitted (๋ฏธ์™„๋ฃŒ ์ฝ๊ธฐ) - ๊ฐ€์žฅ ๋‚ฎ์€ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€์ด๋ฉฐ, ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ด ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - ์ด๋กœ ์ธํ•ด Dirty Read(๋”ํ‹ฐ ๋ฆฌ๋“œ), Non-Repe.. 2024. 1. 5.