[FastAPI] 5. pyyaml์ ์ด์ฉํ FastAPI ํ๊ฒฝ ๋๋๊ธฐ
FastAPI๋ก ๊ธฐ๋ณธ์ ์ธ API์ ๋ฌธ์๋ฅผ ๋ง๋๋ ์์ ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๋ํ๋ ๊ฒ๊น์ง ํด๋ดค๋ค๋ฉด ์ด์ ๋ ๋ณธ๊ฒฉ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ๋ฅผ ์ํด ํ๊ฒฝ์ ๋๋์ด์ผ ํฉ๋๋ค.
์ฌ๊ธฐ์ ํ๊ฒฝ์ด๋ผ๋ ๊ฒ์ ๋ฌด์์ผ๊น์? ๊ฐ๋ฐ ํ๊ฒฝ? ๊ฐ๋ฐ ํ๊ฒฝ์ด๋ผ๋ฉด ์ฐ๋ฆฌ๋ PyCharm์ ์ฌ์ฉํ๊ณ Python์ ์ค์นํ๊ณ ์ด๋ฏธ ๋ค ์์ ํ ๊ฒ์ด ์๋๊ฐ์?
์ฐ๋ฆฌ๋ ์ง๋ ํฌ์คํธ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ค๋ฃจ์๊ณ , ํ๊ฒฝ์ด ๋๋์ด์ง ์ํ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ด๋ป๊ฒ ํจ์จ์ ์ผ๋ก ํ ์ ์๋์ง์ ๋ํด ์์๋ดค์ต๋๋ค.
์ด๋ฐ ํ๊ฒฝ์ ๋๋ ์ผํ๋ ์ด์ ๋ ์๋น์ค๊ฐ ์ด์๋์ด ์๋ ๊ณณ์์ ์๋ก์ด ๊ธฐ๋ฅ์ ํ ์คํธํ๊ฑฐ๋ ๋ฒ๊ทธ ํจ์น ๋ฑ์ ์์ ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ฏธ ์ด์ ์ค์ธ ์๋น์ค์์ ์ฝ๋๋ฅผ ๊ณ ์น๊ณ ๋ฐฐํฌํ๋ฉด ์ค์ ์๋น์คํ๋ ๊ณณ์ ์ํฅ์ ๋ฐ์ผ๋ฉด์ ์ฌ์ฉ์๋ค์ ๋ถํธํจ์ด ๊ฐ์ค๋๊ฑฐ๋ ๋ ๋ค๋ฅธ ์ฅ์ ๋ก ์ด๋ค์ง ์๋ ์๊ธฐ ๋๋ฌธ์ ํ๊ฒฝ์ ๋๋๋ ๊ฒ์ด์ฃ .
YAML
์คํ๋ง์ ๋ค๋ฃฌ ์ ์ ์ ์ฅ์์ YAML์ ์์ฃผ ์ต์ํ๋ค๊ณ ํ ์ ์์ต๋๋ค. Spring boot๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๊ฒฝ ์ค์ ์ properties๋ก ์์ ํ๊ฒ ๋์ง๋ง ๊ทธ์ ๋น์ทํ๊ฒ YAML ํ์ผ๋ก๋ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์๊ธฐ ๋๋ฌธ์ด์ฃ .
FastAPI ๋ํ ๋ง์ฐฌ๊ฐ์ง๋ก ํ์ด์ฌ ์ฝ๋๋ฅผ ์ด์ฉํด์ ์๋ก์ ํ๊ฒฝ ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ ์ ์์ง๋ง pyyaml ํจํค์ง๋ฅผ ์ด์ฉํ๋ฉด YAML ํ์ผ์ ์ด์ฉํ์ฌ ํ๊ฒฝ ์ค์ ์ ๋๋ ์ ์์ต๋๋ค. ๋ค๋ง ๊ณต๊ต๋กญ๊ฒ๋ ๋ชจ๋ ํ๊ฒฝ ์ค์ ์ Spring boot์ฒ๋ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ ์์ํฌ์์ ์ ๊ณตํด์ฃผ๋ ๊ฒ์ ๊ฑฐ์ ์๊ณ ๋๋ถ๋ถ ๋ง๋ค์ด ์จ์ผํ๋ค๋ ๊ฒ์ ๋๋ค.
YAML์ ์ด๋ ๊ฒ KEY-VALUE ํํ๋ก ์ ๊ณตํ๋ ํ์ผ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉด์ ๋์์ ๋ฐฐ์ด, ๋ฌธ์์ด, ์ซ์ํ ๋ฑ์ ์๋ฃํ์ ์ฌ์ฉํ์ฌ ํ์ผ์ ๊ตฌ์ฑํ๋ ํฌ๋งท์ ๋๋ค.
PyYAML
Python์์๋ YAML ํ์ผ์ ์ฝ์ ์ ์๋ ํ์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ pyyaml์ ์ ๊ณตํฉ๋๋ค. ๋ด๊ฐ ์ง์ YAML ํ์ผ์ ์์ฑํด์ ์ค์ ํ์ผ์ ๊ตฌ์ฑํ๊ณ ์ด๋ฅผ Python์์ ๋ณ์๋ก ๋ถ๋ฅผ ์ ์์ต๋๋ค.
๊ฐ๋จํ ์ฌ์ฉ๋ฒ์ ๋ํด ์์๋ณด๋๋ก ํ์ฃ .
$ poetry add pyyaml
๋ํ๋์ ๋งค๋์ ๋ฅผ ํตํด pyyaml์ ์ถ๊ฐ/์ค์นํฉ๋๋ค.
๊ทธ๋ฌ๊ณ ๋๋ฉด import yaml ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค. pyyaml์ ์ค์นํ ๋ค yaml์ importํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
yaml์์ load ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ์ ์ฝ์ด๋ค์ผ ์ ์์ง๋ง safe_load ํจ์๋ฅผ ์ฌ์ฉํ ์ด์ ๋ ๋ง์ฝ ํ์ผ์ด ์กด์ฌํ์ง ์๋ ๋ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด Exception์ด ๋ฐ์ํ์ง ์๊ณ , None์ ๋ฐํ์ํค๋๋ก ํ๊ธฐ ์ํจ์ ๋๋ค. ๋ฌผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ด๋ป๊ฒ ํ๋์ ๋ฐ๋ผ์ ์ด๋ค ํจ์๋ฅผ ์ฌ์ฉํ ์ง๋ ์ฌ๋ฌ๋ถ๋ค์ด ๊ฒฐ์ ํ์๋ฉด ๋ฉ๋๋ค.
๋ํ ๋ชจ๋ Config๋ ํ์ผ ์ธ์์ ์ ์ ์ผ๋ก ์์ ํ๋ ๊ฒ ์ธ์ ํ์ด์ฌ ์ฝ๋์์ ๋ณ์๋ฅผ ์์๋ก ๊ณ ์น์ง ์๋๋ก open ํจ์์ ๋ ๋ฒ์งธ ์ธ์์ read only ์ต์ ์ธ 'r'์ ๋ฃ์ด์ฃผ๋๋ก ํฉ์๋ค.
๋ถ๋ฌ์ง ํ์ผ์ dict ํํ๋ก ๋ถ๋ฌ๋ค์ด๊ฒ ๋๋ฉฐ 'conf['${key_name}']' ์ผ๋ก ๋ฐ์ ์ ์์ต๋๋ค.
Dev, Prod, Test ํ๊ฒฝ ๋๋๊ธฐ
์ฐ๋ฆฌ๊ฐ ์์์ ์์ฑํ pyyaml ์ฝ๋๋ฅผ ํ ๋๋ก OS ํ๊ฒฝ ๋ณ์๋ฅผ ๊ฒธํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๊ฒฝ์ ๋๋์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๋จผ์ ์์์ ์์ฑํ ์ฝ๋๋ฅผ ์ผ๋ถ ์์ ํด๋ณด๋๋ก ํ์ฃ .
Python์์ ์ ๊ณตํ๋ os ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ํ๊ฒฝ ๋ณ์์ ์ ๊ทผํ๋ ํจ์๋ฅผ ์ด์ฉํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. OS ํ๊ฒฝ ๋ณ์์์ APP_ENV์ prod, dev, test๋ฅผ ๋ถ์ฌ์ฃผ๋ ๊ฒ์ผ๋ก ํ์ฌ๊ธ ํ๊ฒฝ์ ๋ค๋ฅด๊ฒ ์คํํ๋ ๊ฒ์ผ๋ก ๊ตฌํํด์ค๋๋ค.
์ด๋ฅผ ํ ๋๋ก YAML ํ์ผ ์ญ์ ๋ฉ์ธ KEY์ ๊ฐ ํ๊ฒฝ์ ํด๋นํ๋ ์ด๋ฆ์ ๋ถ์ฌ์ฃผ๊ณ ์ค์ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด OS ํ๊ฒฝ ๋ณ์์ ๋ณ๋์ ๋ฐ๋ผ DB ์ ์ ์ฃผ์ ๋ฑ์ ๋ณ์๊ฐ ๋ฐ๋๊ฒ ๋ฉ๋๋ค.
Test
๊ทธ๋ฌ๋ฉด ์ ์ฝ๋๊ฐ ์ ๋์๋๊ณ ์๋์ง๋ฅผ ํ์ธํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
main.py์ ๊ฐ๋จํ๊ฒ print ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ด๋ป๊ฒ ๋ถ๋ฌ์ค๊ณ ์๋์ง๋ฅผ ํ์ธํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ํ๊ฒฝ ๋ณ์๊ฐ ์ค์ ๋์ด ์์ง ์์ ๊ฒฝ์ฐ 'dev'๋ก ๋ถ๋ฌ์ค๋๋ก ์ค์ ๋์๊ธฐ ๋๋ฌธ์ dev ํ๊ฒฝ์ ์ค์ ๊ฐ์ด ์ถ๋ ฅ๋๊ณ ์์์ ํ์ธํ ์ ์์ต๋๋ค.
$ export APP_ENV=prod
๋ณดํต export ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ ์ ์์ง๋ง...
PyCharm์ ์ด์ฉํ๊ณ ์๋ค๋ฉด Run Edit Configurations์์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํด์ผํฉ๋๋ค. ์์ ๊ฐ์ด ํ๊ฒฝ ๋ณ์๋ฅผ prod๋ก ๋ณ๊ฒฝํ๊ฒ ๋๋ฉด...
์์ ๊ฐ์ด ๋ค๋ฅธ ๋ณ์๋ช ์ด ๋ถ๋ฌ์ง๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์ด์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ ์ฝ๋์์ ์ญํ ์ ๋ง๋ ๋ณ์๋ฅผ ์ค์ ํ๊ณ , ์ด๋ฅผ ํ๋ผ๋ฏธํฐ์ ์ค์ ํ๋ฉด ํ๊ฒฝ ๋ณ์์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ค์ ํ ์ ์์ต๋๋ค. ์ด๋ฐ ๋ฐฉ๋ฒ์ CI/CD ํตํฉ ์์ ์ ์ฌ๋ฌ๋ชจ๋ก ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ๊ตฐ์.
๋ง์น๋ฉฐ...
Pure Python ์ฝ๋๋ง์ ์ด์ฉํด์๋ Config ํ์ผ์ ์์ฑํ ์ ์์ง๋ง Spring์์ ์ฌ์ฉํ๋ application.yml ํ์ผ์ ์ค์ ๋ฐฉ๋ฒ์ด ์๋ ์ต์ํ๋ค๋ณด๋ FastAPI์์๋ ์ด๋ฌํ ๋ฐฉ๋ฒ์ ์ฑํํ๊ฒ ๋์์ต๋๋ค.
ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์๋ ๋จ์ ์ด ์กด์ฌํฉ๋๋ค. ์ค ์๋น์ค๋ก ์ด์ํ๊ณ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ผ๋ฉด DB์ ๊ฐ์ ๋ฏธ๋ค์จ์ด์ ์ ๋ณด ๋์ถ์ ๊ต์ฅํ ๋ฏผ๊ฐํ๊ฒ ์์ฉ๋ ์ ์์ต๋๋ค. ๋ฌผ๋ก Git๊ณผ ๊ฐ์ ํ์ ๊ด๋ฆฌ ์์คํ ์ Private ๋ชจ๋๋ก ์ฌ์ฉํ๋ค๋ฉด ํฐ ๋ฌธ์ ๊ฐ ๋์ง ์๊ฒ ์ง๋ง ์ธ๋ถ์ ๋ฐ์ถ๋๋ ์์ค ์ฝ๋์ ๊ฒฝ์ฐ ์ด๋ฌํ ๋ฐฉ๋ฒ์ ๊ถ์ฅํ์ง ์์ต๋๋ค. ํจ์ค์๋ ๋ฑ์ ํ๋ฌธ ๊ทธ๋๋ก ์ค์ ํด์ ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ์ํํธ์จ์ด์ ์์ค ์ฝ๋๋ฅผ ๋ฐ์ถํ๋ ๋ชฉ์ ๊ณผ ๋๋ถ์ด ์ธํ๋ผ์ ์ ๋ณด๋ฅผ ์ ์ถํ๋ ์ฌ๊ณ ๋ฅผ ์ผ์ผํฌ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ณ๋์ ๋ฏธ๋ค์จ์ด ์ค์ ์ ๊ฐ๋ณ์ ์ผ๋ก ์ด์์์๊ฒ ์์ํ๊ณ ์ ํ๋ค๋ฉด YAML ํ์ผ์ด ์๋ Python ์ฝ๋์์ ์ง์ os ํจ์๋ฅผ ์ด์ฉํด ํ๊ฒฝ ๋ณ์๋ก ์ค์ ํ ์ ์๋๋ก ์ ๋ํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ปจํ ์ด๋ ๊ธฐ๋ฐ์ ์ด์ ์์คํ ์์๋ ์ง์ ํ๊ฒฝ ๋ณ์๋ฅผ ์ ํ ํ์ฌ ๊ทธ์ ๋ง๊ฒ ์ค์ ํ ์ ์์ต๋๋ค.