7.1 ์ ํ์ํ๊ฐ
์ฐ๋ฆฌ๋ ACID์ ๋ชจ๋ ์์ฑ, ๋ชฉ์ ๋ฐ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ์์ธํ ๋ ผ์ํ์ต๋๋ค. ๋ณด์๋ค์ํผ ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ACID ๋ณด์ฅ์ ์ ๊ณตํ๋ ๊ฒ์ ์๋๋ฉฐ ๋ ๋์ ์ฑ๋ฅ์ ์ํด ํฌ์ํฉ๋๋ค. ๋ฐ๋ผ์ ACID๋ฅผ ์ ๊ณตํ์ง ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ํ๋ก์ ํธ์์ ์ ํ๋ ์ ์์ผ๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ์ธก์์ ํ์ํ ACID ๊ธฐ๋ฅ ์ค ์ผ๋ถ๋ฅผ ๊ตฌํํด์ผ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์คํ ์ด ๋ง์ดํฌ๋ก์๋น์ค ๋๋ ๋ค๋ฅธ ์ข ๋ฅ์ ๋ถ์ฐ ์์ฉ ํ๋ก๊ทธ๋จ์ผ๋ก ์ค๊ณ๋ ๊ฒฝ์ฐ ํ ์๋น์ค์ ์ ์์ ์ธ ๋ก์ปฌ ํธ๋์ญ์ ์ ์ด์ ๋ถ์ฐ ํธ๋์ญ์ ์ด ๋๋ฉฐ ๋ฌผ๋ก ACID ํน์ฑ์ ์๊ฒ ๋ฉ๋๋ค. ๊ฐ ๊ฐ๋ณ ๋ง์ดํฌ๋ก์๋น์ค๋ ACID๊ฐ ๋ฉ๋๋ค.
๋๋ฌด ํฌ๊ณ ๋ณต์กํ๊ธฐ ๋๋ฌธ์ ํธ๋์ญ์ ๊ด๋ฆฌ์๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ฒ ์ ํ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํ๊ณ ์ถ์ง ์์ผ๋ฉฐ ๋ช ๊ฐ์ง ๊ธฐ๋ณธ ๊ธฐ์ ๋ง ๋ค๋ฃจ๊ณ ์ ํฉ๋๋ค. ๋ถ์ฐ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํด ์ด์ผ๊ธฐํ๋ ๊ฒ์ด ์๋๋ผ๋ฉด ACID ๋ณด์ฅ์ด ํ์ํ ๊ฒฝ์ฐ ์์ฉ ํ๋ก๊ทธ๋จ ์ธก์์ ACID๋ฅผ ์์ ํ ๊ตฌํํ๋ ค๊ณ ํ ์ด์ ๊ฐ ์์ต๋๋ค. ๊ฒฐ๊ตญ ๊ธฐ์ฑ ์๋ฃจ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ชจ๋ ๋ฉด์์ ๋ ์ฝ๊ณ ์ ๋ ดํ ๊ฒ์ ๋๋ค. ์ฆ, ACID๊ฐ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค).
ํ์ง๋ง ์์ฉ ํ๋ก๊ทธ๋จ ์ธก์์ ํธ๋์ญ์ ์ ์ํํ๋ ๋ฐ ๋์์ด ๋๋ ๋ช ๊ฐ์ง ๊ธฐ์ ์ ๋ณด์ฌ ๋๋ฆฌ๊ณ ์ถ์ต๋๋ค. ๊ฒฐ๊ตญ ์ด๋ฌํ ๊ธฐ์ ์ ์๋ฉด ๋ค์ํ ์๋๋ฆฌ์ค์์ ๋์์ด ๋ ์ ์์ผ๋ฉฐ ํธ๋์ญ์ ์ด ๋ฐ๋์ ํฌํจ๋์ง ์๋ ๊ฒฝ์ฐ์๋ ๋์์ด ๋ ์ ์์ผ๋ฉฐ ๋ ๋์ ๊ฐ๋ฐ์๊ฐ ๋ ์ ์์ต๋๋ค(๊ทธ๋ ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค).
7.2 ๊ฑฐ๋ ์ ํธ๊ฐ๋ฅผ ์ํ ๊ธฐ๋ณธ ๋๊ตฌ
๋๊ด์ ๋ฐ ๋น๊ด์ ์ฐจ๋จ. ์ด๋ ๋์์ ์ก์ธ์คํ ์ ์๋ ์ผ๋ถ ๋ฐ์ดํฐ์ ๋ํ ๋ ๊ฐ์ง ์ ํ์ ์ ๊ธ์ ๋๋ค.
๋์ฒ์ฃผ์์๋์ ์ก์ธ์ค ๊ฐ๋ฅ์ฑ์ด ๊ทธ๋ค์ง ํฌ์ง ์๋ค๊ณ ๊ฐ์ ํ๋ฏ๋ก ๋ค์์ ์ํํฉ๋๋ค. ์ํ๋ ๋ผ์ธ์ ์ฝ๊ณ ํด๋น ๋ฒ์ ๋ฒํธ๋ฅผ ๊ธฐ์ตํฉ๋๋ค(๋๋ ํ์์คํฌํ ๋๋ ์ฒดํฌ์ฌ/ํด์ - ๋ฐ์ดํฐ ๊ตฌ์ฑํ๋ฅผ ๋ณ๊ฒฝํ๊ณ ๋ฒ์ ์ ๋ํ ์ด์ ์ถ๊ฐํ ์ ์๋ ๊ฒฝ์ฐ). ๋๋ ํ์์คํฌํ), ์ด ๋ฐ์ดํฐ์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ธฐ ์ ์ ์ด ๋ฐ์ดํฐ์ ๋ฒ์ ์ด ๋ณ๊ฒฝ๋์๋์ง ํ์ธํฉ๋๋ค. ๋ฒ์ ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ์์ฑ๋ ์ถฉ๋์ ์ด๋ป๊ฒ๋ ํด๊ฒฐํ๊ณ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธ("์ปค๋ฐ")ํ๊ฑฐ๋ ํธ๋์ญ์ ์ ๋กค๋ฐฑ("๋กค๋ฐฑ")ํด์ผ ํฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ๋จ์ ์ "time-of-check to time-of-use"๋ผ๋ ๊ธด ์ด๋ฆ(TOCTOU๋ก ์ถ์ฝ๋จ)์ด ์๋ ๋ฒ๊ทธ์ ์ ๋ฆฌํ ์กฐ๊ฑด์ ์์ฑํ๋ค๋ ๊ฒ์ ๋๋ค. ์ํ๋ ํ์ธ๊ณผ ์ฐ๊ธฐ ์ฌ์ด์ ๊ธฐ๊ฐ์ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ๋๊ด์ ์ ๊ธ์ ๋ํ ๊ฒฝํ์ด ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ๋๊ด์ ์ ๊ธ๊ณผ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์์ ์ผ์ ์ํ์์ HTTP ํ๋กํ ์ฝ์ด๋ผ๋ ๊ธฐ์ ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ด๊ธฐ HTTP GET ์์ฒญ์ ๋ํ ์๋ต์๋ ํด๋ผ์ด์ธํธ๊ฐ If-Match ํค๋์์ ์ฌ์ฉํ ์ ์๋ ํด๋ผ์ด์ธํธ์ ํ์ PUT ์์ฒญ์ ๋ํ ETag ํค๋๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค(MAY). GET ๋ฐ HEAD ๋ฉ์๋์ ๊ฒฝ์ฐ ์๋ฒ๋ ์๊ณ ์๋ ETag ์ค ํ๋์ ์ผ์นํ๋ ๊ฒฝ์ฐ์๋ง ์์ฒญ๋ ๋ฆฌ์์ค๋ฅผ ๋ค์ ๋ณด๋ ๋๋ค. PUT ๋ฐ ๊ธฐํ ์์ ํ์ง ์์ ๋ฉ์๋์ ๊ฒฝ์ฐ ์ด ๊ฒฝ์ฐ์๋ ๋ฆฌ์์ค๋ง ๋ก๋ํฉ๋๋ค. ETag์ ์๋ ๋ฐฉ์์ ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ RSS ๋ฐ ๊ธฐํ ํผ๋๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋ฐ ๋์์ด ๋๋ "feedparser" ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ์ข์ ์๊ฐ ์์ต๋๋ค.
>>> import feedparser
>>> d = feedparser.parse('http://feedparser.org/docs/examples/atom10.xml')
>>> d.etag
'"6c132-941-ad7e3080"'
>>> d2 = feedparser.parse('http://feedparser.org/docs/examples/atom10.xml', etag=d.etag)
>>> d2.feed
{}
>>> d2.debug_message
'The feed has not changed since you last checked, so the server sent no data. This is a feature, not a bug!'
๋ฐ๋ฉด์ ๋น๊ด์ฃผ์์๋ ๊ฑฐ๋๊ฐ ์ข ์ข ๋์ผํ ๋ฐ์ดํฐ์์ "๋ง๋๋ค"๋ ์ฌ์ค์์ ์์ํ์ฌ ๊ทธ์ ์ถ์ ๋จ์ํํ๊ณ ๋ถํ์ํ ๊ฒฝ์ ์กฐ๊ฑด์ ํผํ๊ธฐ ์ํด ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฐจ๋จํฉ๋๋ค . ์ ๊ธ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ๋ ค๋ฉด ์ธ์ ์ ๋ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์ ์งํ๊ฑฐ๋(ํ์์ ์ฐ๊ฒฐ์ ๊ฐ์ ธ์ค๋ ๋์ - ์ด ๊ฒฝ์ฐ ๋๊ด์ ์ ๊ธ์ผ๋ก ์์ ํด์ผ ํ ๊ฐ๋ฅ์ฑ์ด ๋์) ํธ๋์ญ์ ์ ID๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. , ์ฐ๊ฒฐ์ ๊ด๊ณ์์ด ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋น๊ด์ ์ ๊ธ์ ๋จ์ ์ ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ผ๋ฐ์ ์ผ๋ก ํธ๋์ญ์ ์ฒ๋ฆฌ ์๋๊ฐ ๋๋ ค์ง์ง๋ง ๋ฐ์ดํฐ์ ๋ํด ์นจ์ฐฉํ๊ณ ์ง์ ํ ๊ฒฉ๋ฆฌ๋ฅผ ์ป์ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ถ๊ฐ์ ์ธ ์ํ์ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ์๋ก ์ ๊ธด ๋ฆฌ์์ค๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๊ฐ๋ฅํ ๊ต์ฐฉ ์ํ์ ๋์ฌ๋ฆฌ๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ํธ๋์ญ์ ์๋ ๋ฆฌ์์ค A์ B๊ฐ ํ์ํฉ๋๋ค. ํ๋ก์ธ์ค 1์ ๋ฆฌ์์ค A๋ฅผ ์ ์ ํ๊ณ ํ๋ก์ธ์ค 2๋ ๋ฆฌ์์ค B๋ฅผ ์ ์ ํ์ต๋๋ค. ๋ ํ๋ก์ธ์ค ์ค ์ด๋ ๊ฒ๋ ์คํ์ ๊ณ์ํ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค. ์ง๊ธ ์์ธํ ์ค๋ช ํ๊ณ ์ถ์ง ์์ผ๋ฏ๋ก Wikipedia๋ฅผ ๋จผ์ ์ฝ์ผ์ญ์์ค. ๊ฐ๋จํ ๋งํด์ ์ ๊ธ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ์ด ๊ฐ๋ ์ ๋ ์์ธํ ์๊ณ ์ถ๋ค๋ฉด "Dinning Philosophers Problem"("์์ฌํ๋ ์ฒ ํ์ ๋ฌธ์ ")์ ๋จธ๋ฆฌ๋ฅผ ์์ด๋๋ก ์ด๋ํฉ๋๋ค.
๋ค์์ ๋์ผํ ์๋๋ฆฌ์ค์์ ๋ ์ ๊ธ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๋ํ ์ข์ ์์ ๋๋ค.
์ ๊ธ ๊ตฌํ์ ๋ํด. ์์ธํ ์ค๋ช ํ๊ณ ์ถ์ง๋ ์์ง๋ง ๋ถ์ฐ ์์คํ ์ฉ ์ ๊ธ ๊ด๋ฆฌ์๊ฐ ์์ต๋๋ค(์: ZooKeeper, Redis, etcd, Consul).
7.3 ์ฐ์ฐ์ ๋ฉฑ๋ฑ์ฑ
Idempotent ์ฝ๋๋ ์ผ๋ฐ์ ์ผ๋ก ์ข์ ๋ฐฉ๋ฒ์ด๋ฉฐ ํธ๋์ญ์ ์ ์ฌ์ฉํ๋์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ๊ฐ๋ฐ์๊ฐ ์ด ์์ ์ ์ํํ ์ ์๋ ๊ฒ์ด ์ข์ ๊ฒฝ์ฐ์ ๋๋ค. Idempotency๋ ํด๋น ์์ ์ ๊ฐ์ฒด์ ๋ค์ ์ ์ฉํ ๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋ ์์ ์ ์์ฑ์ ๋๋ค. ํจ์๊ฐ ํธ์ถ๋์์ต๋๋ค - ๊ฒฐ๊ณผ๋ฅผ ์ ๊ณตํ์ต๋๋ค. 1~5์ด ํ์ ๋ค์ ํธ์ถํ๋ฉด ๋์ผํ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ฉ๋๋ค. ๋ฌผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋๋ค. ์ธ ๋ฒ์งธ ์์คํ ์ ๋ฐ์ดํฐ๋ ํจ์์ ์์กดํ์ง ์์ ์ ์์ง๋ง ํจ์์ ์์กดํ๋ ๋ชจ๋ ๊ฒ์ ์์ธก ๊ฐ๋ฅํด์ผ ํฉ๋๋ค.
๋ฉฑ๋ฑ์ฑ์ ์ฌ๋ฌ ๊ฐ์ง๋ก ๋ํ๋ ์ ์์ต๋๋ค. ๊ทธ์ค ํ๋๋ ์ฝ๋ ์์ฑ ๋ฐฉ๋ฒ์ ๋ํ ๊ถ์ฅ ์ฌํญ์ผ ๋ฟ์ ๋๋ค. ์ต๊ณ ์ ๊ธฐ๋ฅ์ ํ ๊ฐ์ง ์ผ์ ํ๋ ๊ธฐ๋ฅ์ด๋ผ๋ ๊ฒ์ ๊ธฐ์ตํ์ญ๋๊น? ๊ทธ๋ฆฌ๊ณ ์ด ํจ์์ ๋ํ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ข์ ์ ์ ๋ฌด์์ ๋๊น? ์ด ๋ ๊ฐ์ง ๊ท์น์ ์ค์ํ๋ฉด ํจ์๊ฐ ๋ฉฑ๋ฑ์ฑ์ด ๋ ๊ฐ๋ฅ์ฑ์ด ์ด๋ฏธ ๋์์ง๋๋ค. ํผ๋์ ํผํ๊ธฐ ์ํด ๋ฉฑ๋ฑ ํจ์๊ฐ ๋ฐ๋์ "์์"("ํจ์ ์์์ฑ"์ด๋ผ๋ ์๋ฏธ์์)๋ ์๋์ ๋ถ๋ช ํ ํ๊ฒ ์ต๋๋ค. ์์ ํจ์๋ ์ด๋ค ์์ผ๋ก๋ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง ์๊ณ ์ ๋ ฅ์์ ๋ฐ์ ๋ฐ์ดํฐ์์๋ง ์๋ํ๋ ํจ์์ ๋๋ค. ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ฅํ ์ ์๋ ํจ์์ ๋๋ค. ์ผ๋ฐ์ ์ธ ๋ฐ์ดํฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ฅ์ด ์์ํ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์ต๋๋ค.
์ด๊ฒ์ ์์ํ ํจ์์ ๋๋ค.
def square(num: int) -> int:
return num * num
๊ทธ๋ฌ๋ ์ด ํจ์๋ ์์ํ์ง ์๊ณ ๋ฉฑ๋ฑ์ ์ ๋๋ค(์ด ๋ถ๋ถ์์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ฒฐ๋ก ์ ๋ด๋ฆฌ์ง ๋ง์ญ์์ค).
def insert_data(insert_query: str, db_connection: DbConnectionType) -> int:
db_connection.execute(insert_query)
return True
๋ง์ ๋จ์ด ๋์ ๋ฉฑ๋ฑ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๋๋ก ๊ฐ์๋ฐ์ ๋ฐฉ๋ฒ์ ๋ํด ์ด์ผ๊ธฐํ ์ ์์ต๋๋ค. ๋ณด์๋ค์ํผ ์ ๋ AWS๋ก ๋ง์ ์์ ์ ํ๊ณ ์์ผ๋ฉฐ AWS Lambda๋ผ๋ ์๋น์ค๊ฐ ์์ต๋๋ค. Lambda๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒ๋ฅผ ๊ด๋ฆฌํ์ง ์๊ณ ์ผ์ ์ ๋ฐ๋ผ ๋๋ ์ผ๋ถ ์ด๋ฒคํธ์ ๋ํ ์๋ต์ผ๋ก ์คํํ ์ฝ๋๋ฅผ ๋ก๋ํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ์ด๋ฒคํธ๋ ๋ฉ์์ง ๋ธ๋ก์ปค๊ฐ ์ ๋ฌํ๋ ๋ฉ์์ง์ผ ์ ์์ต๋๋ค. AWS์์ ์ด ๋ธ๋ก์ปค๋ AWS SNS์ ๋๋ค. AWS์ ํจ๊ป ์ผํ์ง ์๋ ์ฌ๋๋ค์๊ฒ๋ ์ด ์ ์ ๋ถ๋ช ํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฑ๋("์ฃผ์ ")์ ํตํด ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ๋ธ๋ก์ปค๊ฐ ์๊ณ ์ด๋ฌํ ์ฑ๋์ ๊ตฌ๋ ํ๋ ๋ง์ดํฌ๋ก ์๋น์ค๊ฐ ๋ฉ์์ง๋ฅผ ์์ ํ๊ณ ์ด๋ป๊ฒ๋ ๋ฐ์ํฉ๋๋ค.
๋ฌธ์ ๋ SNS๊ฐ "์ ์ด๋ ํ ๋ฒ์" ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ค๋ ์ ์ด๋ค("์ต์ 1ํ ์ ๋ฌ"). ๋ฌด์จ ๋ป์ด์์? ์กฐ๋ง๊ฐ Lambda ์ฝ๋๊ฐ ๋ ๋ฒ ํธ์ถ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ ๋ง๋ก ์ผ์ด๋ฉ๋๋ค. ํจ์๊ฐ ๋ฉฑ๋ฑ์ ์ด์ด์ผ ํ๋ ์ฌ๋ฌ ๊ฐ์ง ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๊ณ์ ์์ ๋์ด ์ธ์ถ๋ ๋ ๋๊ตฐ๊ฐ๊ฐ ๊ฐ์ ๊ธ์ก์ ๋ ๋ฒ ์ธ์ถํ ๊ฒ์ผ๋ก ์์ํ ์ ์์ง๋ง ์ด๊ฒ์ด ์ค์ ๋ก 2๋ฒ์ ๋ ๋ฆฝ์ ์ธ ์๊ฐ์ธ์ง ํ์ธํด์ผ ํฉ๋๋ค. ์ฆ, ์ด๋ค์ ํ๋์ ๋ฐ๋ณต์ด ์๋๋ผ 2๊ฐ์ ๋ค๋ฅธ ํธ๋์ญ์ ์ ๋๋ค.
๋ณ๊ฒฝ์ ์ํด API์ ๋ํ ์์ฒญ ๋น๋๋ฅผ ์ ํ("์๋ ์ ํ")ํ๋ ๋ ๋ค๋ฅธ ์๋ฅผ ๋ค๊ฒ ์ต๋๋ค. Lambda๋ ํน์ user_id๊ฐ ์๋ ์ด๋ฒคํธ๋ฅผ ์์ ํ๋ฉฐ ํด๋น ID๋ฅผ ๊ฐ์ง ์ฌ์ฉ์๊ฐ ์ผ๋ถ API์ ๋ํ ๊ฐ๋ฅํ ์์ฒญ ์๋ฅผ ์์งํ๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ํธ์ถ ๊ฐ์ AWS์์ DynamoDB์ ์ ์ฅํ๊ณ ํจ์๋ฅผ ํธ์ถํ ๋๋ง๋ค ๊ฐ์ 1์ฉ ๋๋ฆด ์ ์์ต๋๋ค.
ํ์ง๋ง ์ด Lambda ํจ์๊ฐ ๋์ผํ ์ด๋ฒคํธ์ ์ํด ๋ ๋ฒ ํธ์ถ๋๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ๊ทธ๋ฐ๋ฐ lambda_handler() ํจ์์ ์ธ์์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์์ต๋๊น? ๋ ๋ฒ์งธ ์ธ์์ธ AWS Lambda์ ์ปจํ ์คํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ฉฐ ๊ฐ ๊ณ ์ ํธ์ถ์ ๋ํด ์์ฑ๋๋ request_id๋ฅผ ๋น๋กฏํ ๋ค์ํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํฌํจํฉ๋๋ค. ์ฆ, ์ด์ ํ ์ด๋ธ์ ์ํ๋ ํธ์ถ ์๋ฅผ ์ ์ฅํ๋ ๋์ request_id ๋ชฉ๋ก์ ์ ์ฅํ ์ ์์ผ๋ฉฐ ํธ์ถํ ๋๋ง๋ค Lambda๊ฐ ์ฃผ์ด์ง ์์ฒญ์ด ์ด๋ฏธ ์ฒ๋ฆฌ๋์๋์ง ํ์ธํฉ๋๋ค.
import json
import os
from typing import Any, Dict
from aws_lambda_powertools.utilities.typing import LambdaContext # needed only for argument type annotation
import boto3
limit = os.getenv('LIMIT')
def handler_name(event: Dict[str: Any], context: LambdaContext):
request_id = context.aws_request_id
# We find user_id in incoming event
user_id = event["user_id"]
# Our table for DynamoDB
table = boto3.resource('dynamodb').Table('my_table')
# Doing update
table.update_item(
Key={'pkey': user_id},
UpdateExpression='ADD requests :request_id',
ConditionExpression='attribute_not_exists (requests) OR (size(requests) < :limit AND NOT contains(requests, :request_id))',
ExpressionAttributeValues={
':request_id': {'S': request_id},
':requests': {'SS': [request_id]},
':limit': {'N': limit}
}
)
# TODO: write further logic
return {
"statusCode": 200,
"headers": {
"Content-Type": "application/json"
},
"body": json.dumps({
"status ": "success"
})
}
๋ด ์๋ ์ค์ ๋ก ์ธํฐ๋ท์์ ๊ฐ์ ธ์จ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํนํ ์กฐ๊ธ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ฏ๋ก ์๋ณธ ์์ค์ ๋ํ ๋งํฌ๋ฅผ ๋จ๊ฒจ ๋ ๊ฒ์ ๋๋ค.
๊ณ ์ ํ ํธ๋์ญ์ ID์ ๊ฐ์ ๊ฒ์ ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทธ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ค๊ณ ์์ ์ธ๊ธํ ๊ฒ์ ๊ธฐ์ตํ์ญ๋๊น? ์ด์ ์์ ์ ๋ฉฑ๋ฑ์ฑ์ผ๋ก ๋ง๋๋ ๋ฐ์๋ ์ฌ์ฉํ ์ ์์์ ๋ฐฐ์ ์ต๋๋ค. ์ด๋ฌํ ID๋ฅผ ์ง์ ์์ฑํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ธ์ง ์์๋ณด๊ฒ ์ต๋๋ค.
GO TO FULL VERSION