
ํ์ด์ฌ 3.14, ํ ํ๋ฆฟ ๋ฌธ์์ด(t-string) ๋ฏธ๋ฆฌ ๋ณด๊ธฐ
ํ์ด์ฌ 3.14, ํ ํ๋ฆฟ ๋ฌธ์์ด(t-string) ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ๊ด๋ จ
ํ์ด์ฌ(Python)์ ๋ง์ ๊ฐ๋ฐ์์ ์ฌ๋์ ๋ฐ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ธ๋ฐ์. 1991๋ ์ถ์ ์ดํ๋ก ๋ฆด๋ฆฌ์ฆ๋ฅผ ํตํด ๊พธ์คํ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋, ์ด์ ๊ธฐ๋ฅ์ ๋ ํจ์จ์ ์ผ๋ก ์๋ํ๋๋ก ์ ๋ฐ์ดํธํ๋ ๋ฑ ์ฐ 2ํ ์ ๋ ์ ์ง ๋ณด์๋ฅผ ํ๊ณ ์์ต๋๋ค. ์ด๋ฒ ๊ธ์์๋ ์ฌํด ํ๋ฐ๊ธฐ(2025๋ 10์)์ ๋ฐฐํฌ ์์ ์ธ 3.14 ๋ฒ์ ์์ ์๋ก ์ถ๊ฐ๋ ํ ํ๋ฆฟ ๋ฌธ์์ด(t-string, template string)์ ๋ํด ๋ฏธ๋ฆฌ ์์๋ณด๋ ค๊ณ ํฉ๋๋ค.

๋จผ์ ํ์ด์ฌ์ ์ ํ ํ๋ฆฟ ๋ฌธ์์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฒ ๋์์๊น์? ์ด ๋ฐฐ๊ฒฝ์ ์ดํดํ๊ธฐ ์ํด์๋ ๋จผ์ PEP๋ผ๋ ๊ฐ๋ ์ ์ ํ์๊ฐ ์์ต๋๋ค. ์์ ์ฉ ํ๋ก๊ทธ๋จ์ ํฌํจํ์ฌ ์ผ๋ฐ์ ์ธ ์ํํธ์จ์ด๋ค์ ํ๋ก๊ทธ๋จ์ ์์ ์, ํน์ ์ํํธ์จ์ด์ ๊ถํ์ ๊ฐ์ง ์ง๋จ์ ์์ฌ๊ฒฐ์ ๊ถ์์ ์ํด ์ ๋ฐ์ดํธ ๋ฐฉํฅ์ด ๊ฒฐ์ ๋ฉ๋๋ค.
๊ทธ๋ ์ง๋ง ์คํ์์ค ๋ผ์ด์ผ์ค๋ฅผ ์ฑํํ๊ณ ์๋ ํ์ด์ฌ์์๋ ํน๋ณํ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค. ์์ ์ด๋ฏธ์ง์์๋ ํ ํ๋ฆฟ ๋ฌธ์์ด ๊ธฐ๋ฅ ์ถ๊ฐ๋ฅผ ์ค๋ช ํ๋ฉด์ โofficially acceptedโ๋ผ๋ ๋ฌธ์ฅ์ ์ฌ์ฉํ๊ณ ์๋๋ฐ, ์ด๋ ๊ฒ ์ํํธ์จ์ด์ ํน์ ๊ธฐ๋ฅ์ด โ์ ์์ผ๋กโ ์ถ๊ฐ ๋๋ ๋ฐฐ๊ฒฝ์ ๋ํด ๋จผ์ ์์๋ณผ๊ฒ์.
PEP: Python Enhancement Proposals
PEP๋ โPython Enhancement Proposalsโ์ ์ค์๋ง๋ก, ์ง์ญํ๋ฉด โํ์ด์ฌ ๊ฐ์ ์ ์์โ๋ผ๋ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ด ๋ฌธ์๋ค์ ํ์ด์ฌ์ ์ฌ์ฉํ๋ ์ปค๋ฎค๋ํฐ๋ฅผ ๋์์ผ๋ก, ํ์ด์ฌ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๋ชฉ์ ์ ๋์์ธ ๋ฌธ์(design document)์ ๋๋ค. ๋ํ ์ด ๋ฌธ์๋ค์ ์ ๋ณด ์ ๊ณต ์ธ์๋ ํ์ด์ฌ ์ปค๋ฎค๋ํฐ์์ ์งํ๋๋ ๋ ผ์์ ๊ธฐ๋ก, ์ ํฌ๋ช ํ๊ฒ ๊ธฐ๋กํ๊ณ , ๊ณต๊ฐํ๊ธฐ ์ํ ์ญํ ๋ ํฉ๋๋ค.
Note
์ฌ์ง์ด ์ด PEP์ ๊ดํ ๋ด์ฉ ์ค๋ช ๋ PEP 1์ด๋ผ๋ ๋ฌธ์์ ์์ฑ๋์ด ์์ต๋๋ค.

PEP์์๋ PEP 1, PEP 2, PEP 787๊ณผ ๊ฐ์ด ์์ฐ์ ๋ฒํธ๋ฅผ ๋ฌธ์์ ์ธ๋ฑ์ค๋ก์จ ํ์ฉํ๋๋ฐ ์ด ์ธ๋ฑ์ค๋ ๋์ฒด๋ก PEP๊ฐ ์์ฑ๋๋ ์ฐ์ธ ์์๋ฅผ ๋ฐ์ํ์ง๋ง, ๊ฑฐ๋ฒ๋์ค(governance), ํจํค์ง(packaging), ๋ฆด๋ฆฌ์ค(release), ํ์ (typing)๊ณผ ๊ฐ์ ํน๋ณํ ๋ด์ฉ์ ๋ค๋ฃจ๋ PEP๋ค์ ๋ณ๋์ ์ธ๋ฑ์ค ์ฒด๊ณ๋ฅผ ๊ฐ์ต๋๋ค.
์ด์ด์ PEP๋ ํฌ๊ฒ ๋ฉํ๋ฐ์ดํฐ(metadata)์ ๋ณธ๋ฌธ์ด๋ผ๋ ๋ด์ฉ์ผ๋ก ๊ตฌ์ฑ์ ๋๋์ด ๋ณผ ์ ์์ต๋๋ค. ๋ฉํ๋ฐ์ดํฐ๋ ์ ๋ชฉ(title), ์์ฑ์(author)์ ๊ฐ์ด ๋ฌธ์ ์์ฒด๋ฅผ ์ค๋ช ํ๋ ๋ด์ฉ์ด๊ณ , ๋ณธ๋ฌธ์๋ ๋ด์ฉ ์์ฝ(abstract), PEP์ ๋ด์ฉ์ ์ ์ํ๊ฒ ๋๋ ๋ฐฐ๊ฒฝ์ธ ๋๊ธฐ(motivation), ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ์ ํฌํจํ๋ ๋ช ์ธ(specification) ์ธ์๋, ์ ๊ท ๋ฐ ๊ธฐ์กด ์ฌ์ฉ์์๊ฒ ์ด PEP์ ๋ด์ฉ์ ์ด๋ป๊ฒ ๊ต์กํ ์ ์์์ง์ ๋ํ ์ฌ์ฉ๋ฒ ๊ต์ก(how to teach this)๊ณผ ๊ฐ์ ๋ด์ฉ๋ค์ด ํฌํจ๋ฉ๋๋ค.
๋ฌผ๋ก ์ด ๊ตฌ์ฑ์ ์๋ก์ด ๋ฌธ์ ์์ฑ์ ์ฝ๊ฒ ํ ์ ์๋๋ก ๋๋ ์์ ํ ํ๋ฆฟ์ผ๋ก, ๋ฐ๋์ ๋ฐ๋ผ์ผ ํ๋ ๊ฒ์ ์๋๊ธฐ์ PEP๋ง๋ค ์กฐ๊ธ์ฉ ๊ตฌ์ฑ์ด ๋ค๋ฆ ๋๋ค.
Note
์ด ํ ํ๋ฆฟ ๋ฌธ์๋ PEP 12์ ์ ์๋์ด ์์ต๋๋ค.

๋ค์ ์์ ์ผ๋ก ๋์์์, ํ ํ๋ฆฟ ๋ฌธ์์ด์ ์ ์ํ ๋ด์ฉ์ PEP 750: Template strings๋ผ๋ ๋ฌธ์์์ ๋ค๋ค์ง๊ณ ์์ต๋๋ค. ์ด์ ์ด ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ํ ํ๋ฆฟ ๋ฌธ์์ด์ ๋ฌด์์ด๊ณ , ์ด๋ค ๋ฐฐ๊ฒฝ์์ ์ถ๊ฐ ๋์๋์ง, ์ด๋ค ์ฌ๋ก๋ค์ด ์๋์ง ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค.
PEP 498: Literal String Interpolation
PEP 750์ ์ฌ์ฉ์ ์ ์ ๋ฌธ์์ด ์ฒ๋ฆฌ๋ฅผ ์ํ ํ ํ๋ฆฟ ๋ฌธ์์ด ๊ธฐ๋ฅ์ ์๊ฐํฉ๋๋ค. ์ด๋ ์์ ๋ฌธ์์ด(formatted string, f-string)์ ์ผ๋ฐํ๋ ๋ฒ์ ์ผ๋ก, ์ด์ ์ ์ฐ์ด๋ f- ์ ๋์ฌ ๋์ **t-**๋ผ๋ ์ ๋์ฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์กฐ๊ธ ๋ ๊ตฌ์ฒด์ ์ผ๋ก ํ ํ๋ฆฟ ๋ฌธ์์ด์์๋ ๋ฌธ์์ด์ ๋ฌธ์์ด(string)์ด ์๋ ํ ํ๋ฆฟ์ด๋ผ๋ ์๋ก์ด ํ์ (type)์ผ๋ก ํ๊ฐํฉ๋๋ค.
์์๋ก๋ template: Template = tโHello {name}โ
์ฒ๋ผ ์ฌ์ฉํ ์ ์๋๋ฐ ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ๋ฌธ์์ด๊ณผ { }๋ก ๊ฐ์ธ์ง ๋ณด๊ฐ๋(interpolated) ๊ฐ์ ๋ฌธ์์ด๊ณผ ๊ฒฐํฉํ๊ธฐ ์ด์ ์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ๋ฌธ์์ด ๋ณด๊ฐ ๋๋ ๋ฌธ์์ด ํฌ๋งคํ
์ ๋ฌธ์์ด ์์ ๋ณ์๋ ํํ์์ ๊ฐ์ ๋ฃ๋ ๋ฐฉ๋ฒ์ ์๋ฏธํฉ๋๋ค. ์ฝ๊ฒ ๋งํด ๋ฌธ์์ด ์ค๊ฐ์ ๋ค๋ฅธ ๊ฐ์ ํ๋ก๊ทธ๋๋ฐ์ ์ผ๋ก ๋ฃ์ด์ฃผ๋ ๋ฐฉ์์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
์์ ๋ฌธ์์ด์ PEP 498, PEP 701์์ ๋ค๋ค์ง ๋ด์ฉ์ผ๋ก, ์ฝ๊ณ ํจ๊ณผ์ ์ผ๋ก ๋ฌธ์์ด์ ๋ค๋ฃจ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ๋๋ค.
๋ฌธ์์ด ํฌ๋งคํ
ํ์ด์ฌ์์ ์ฌ๋ฌ ๋ง๋ฆฌ์ ๊ณ ์์ด์ ์ด๋ฆ๊ณผ ๋์ด๋ฅผ ์ถ๋ ฅํ๋ ๊ฐ๋จํ ์์๋ฅผ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฅผ ์ํด ์ฌ์ฉํ ์ ์๋ ๊ฐ์ฅ ๋จ์ํ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ณ ์์ด์ ์ด๋ฆ๊ณผ ๋์ด๋ฅผ ๋ฌธ์์ด์ ๊ทธ๋๋ก ๋ฃ์ด ์ถ๋ ฅํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.

์ด๋ ๊ฒ ๋ฌธ์์ด ํฌ๋งคํ ์ ์ฌ์ฉํ์ง ์๋ ํ๋์ฝ๋ฉ ๋ฐฉ๋ฒ์ ๋ช ๊ฐ์ง ๋ฌธ์ ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ ์ ํ: ๋งค๋ ์ํด์ ๊ณ ์์ด์ ๋์ด๊ฐ ์ฆ๊ฐํ๋ ๊ฒฝ์ฐ์ฒ๋ผ, ๋ณ์๋ ๊ฐ์ด ๋ฐ๋ ๋๋ง๋ค ๋ฌธ์์ด์ด ์ฌ์ฉ๋๋ ์ฌ๋ฌ ์์น์ ์ฝ๋๋ฅผ ๋งค๋ฒ ๊ณ ์ณ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- ์ ์ง๋ณด์์ ์ด๋ ค์: ๊ฐ์ด ์ฌ๋ฌ ์์น์ ํ๋์ฝ๋ฉ๋์ด ์์ผ๋ฉด, ๊ฐ์ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ์ฝ๋๋ฅผ ๋ฐ๊พธ๋ ๊ณผ์ ์์ ๋น ๋จ๋ฆฌ๊ฑฐ๋ ์๋ชป๋ ๊ฐ์ผ๋ก ์์ ํ์ฌ ์ฝ๋์ ์๋ ๋ชฉ์ ๊ณผ ๋ค๋ฅธ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ํ์ฅ์ฑ์ ๋ถ์กฑ: ์๋ก์ด ๊ณ ์์ด๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ์ฒ๋ผ, ๋ค์ํ ๊ฐ์ ๋ฃ๊ฑฐ๋ ์ฌ๋ฌ ๊ฐ์ ๋ฉ์์ง๋ฅผ ๋ง๋ค ๋ ๋งค๋ฒ ์ฝ๋๋ฅผ ์๋กญ๊ฒ ์์ฑํด์ผ ํด์ ๋ฐ๋ณต์ด ๋ง์์ง๊ณ ๊ทธ๋งํผ ์ ์ฒด ์ฝ๋๊ฐ ๊ธธ์ด์ง๋๋ค.
์ด ์ธ์๋ ์ธ๊ตญ์ด๋ก ๊ณ ์์ด ์ด๋ฆ์ ๋ณด์ฌ์ฃผ๋ ๊ฒฝ์ฐ์ฒ๋ผ ๊ตญ์ ํ/๋ค๊ตญ์ด ์ฒ๋ฆฌ์ ์ด๋ ค์, ๋๋ฒ๊น ๊ณผ ๋ก๊น ์ ๋ถํธํจ, ํน์ ์ํฉ์์์ ๋ณด์ ์ทจ์ฝ์ ๊ณผ ๊ฐ์ ๋ฌธ์ ๋ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ค๋ก ์ธํด ํ์ด์ฌ์์๋ ํ๋์ฝ๋ฉ์ด ์๋ ๋ฌธ์์ด ํฌ๋งคํ
์ ์ฌ์ฉํ๊ธฐ ์ํด์ format()
ํจ์์ % ํฌ๋งคํ
๋ฐฉ์์ ์ฌ์ฉํ ์ ์๊ณ , ๊ฐ๊ฐ์ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.

๋จผ์ C ์ธ์ด์ ๋ฌธ์์ด ์ฌ์ฉ ๋ฐฉ๋ฒ๊ณผ ์ ์ฌํ % ํฌ๋งคํ ๋ฐฉ์์, ํ๋ ์ฝ๋ฉ์ ๋นํด์๋ ํจ์จ์ ์ด์ง๋ง ๋ฌธ์์ด์์ ์ฌ์ฉํ๋ ์๋ฃํ์ ์ข ๋ฅ(์๋ฅผ ๋ค์ด ์ ์๋ %d, ์ค์๋ %f, ๋ฌธ์์ด์ %s์ ๊ฐ์ด)๋ฅผ ๋ช ํํ ํ์์ผ๋ก ์ง์ ํด์ผ๋ง ํ๋ค๋ ๋ฒ๊ฑฐ๋ก์์ด ์์ต๋๋ค.

์ด์ด์ format ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฌธ์์ด์ ์ค๊ดํธ ({ย }
)์ ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๋ฌธ์์ด์ ์ฌ์ฉํ๋ ๋ณ์์ ์๋ฃํ ์ข
๋ฅ๋ฅผ ๋ช
์ํ์ง ์์๋ ๋๋ค๋ ์ ์์ % ํฌ๋งคํ
๋ณด๋ค ํธ๋ฆฌํด์ก์ต๋๋ค. ๋์ ์์ % ์์๋ ๋ช
์ํด์ผ ํ๋ ์๋ฃํ ์ข
๋ฅ๋ฅผ ์ถ์ธกํ๋ ๊ณผ์ ์ด ์ถ๊ฐ๋๋ฉด์, % ํฌ๋งคํ
์ ๋นํด ์ฑ๋ฅ์ ์ผ๋ก ์ฝ๊ฐ ๋๋ฆฌ๋ค๋ ํน์ง์ด ์์ต๋๋ค.

๋ง์ง๋ง์ผ๋ก PEP 498์์ ์๊ฐ๋ ์์ ๋ฌธ์์ด ๋ฐฉ๋ฒ์ format ํจ์๋ %๋ผ๋ ํํ์ ์ฌ์ฉํ์ง ์๊ณ , f- ์ ๋์ฌ๋ง์ผ๋ก ๋ฐ๋ก ๋ณ์๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ฌธ์์ด ํฌ๋งคํ ๋ฐฉ๋ฒ์ ๋นํด ๊ฐ๋ ์ฑ๊ณผ ์ฌ์ฉ์ฑ์์ ํฐ ์ฅ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
๋ํ ์์ ๋ฌธ์์ด ๋ฐฉ๋ฒ์ ๋ณ์์ ๋ด์ฉ์ ์ฐ์ฐํ์ง ์๊ณ , ๋ฐ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ค๊ดํธ ์์ ๊ณ์ฐ์์ด๋ ํจ์, ๋ฉ์๋๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ ๋ฟ ์๋๋ผ ์ฑ๋ฅ์์๋ ์ ๋ฆฌํ๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค. ์์ ์ฝ๋์์๋ 0.2์ด ์ ๋ (์ฝ 50%) ์ ๋์ ์๋ ์ฐจ์ด๊ฐ ์๋ ๋งํผ, ํผํฌ๋จผ์ค๊ฐ ์ค์ํ ํ๊ฒฝ์์๋ ํฐ ์ฐจ์ด๋ฅผ ๋ณด์ผ ์ ์์ต๋๋ค.

์ด์ฒ๋ผ ์์ ๋ฌธ์์ด์ ๋ฌธ์์ด ํฌ๋งคํ ์ ์ํ ๋ฐฉ๋ฒ ์ค ๊ฐ๋ ์ฑ๋ ์ข๊ณ , ํํ์ ์ฌ์ฉ๋ ํธ๋ฆฌํ๊ณ , ์ฝ๋๊ฐ ์งง๊ณ ๋น ๋ฅธ **โ๋ง๋ณํต์น์ โ**์ ์ญํ ์ ํด์, ๋ง์ ๊ฒฝ์ฐ์์ ์ฌ์ฉ๋์์ต๋๋ค. (์ฌ์ง์ด ์ฌ์ฉํ๋ฉด ์ ๋๋ ๊ฒฝ์ฐ์๋ ๋ง์ด์ฃ !)
Motivation: f-string
์ ํ๊ณ
์ด์ฒ๋ผ ์ข์ ๋ณด์ด๋ ์์ ๋ฌธ์์ด์๋ ํ๊ณ์ ์ ์์๋๋ฐ์, ์ด๋ฅผ ์ํด ์ฌ์ฉ์๋ก๋ถํฐ ๊ณ์ ๋ช
์ ์
๋ ฅ๋ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ์ผ์์ ์ธ ์ฌ๋ก๋ฅผ ์๋ก ๋ค์ด๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฅผ ์ํด query = f"SELECT * FROM users WHERE name = โ{user_name}โ"
์ด๋ผ๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ง์ฝ ์ฌ์ฉ์๊ฐ user_name
์ ์๋์ ๊ฐ์ด โ or 1 = 1 โ
๋ก ์ฌ์ฉํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?

SQL์ ์ต์ํ ์ฌ๋๋ค์ ๊ธ๋ฐฉ ์ดํดํ ์ ์๊ฒ ์ง๋ง, ์ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ OR 1 = 1
๋ถ๋ถ์ผ๋ก ์ธํด ํญ์ ์ฐธ์ด ๋์ด, users ํ
์ด๋ธ์ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋ฉ๋๋ค. ์ฆ ์์ ๋ฌธ์์ด๋ง์ผ๋ก๋ ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ด์ฉ ์ ์ฒด๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋ง๊ธฐ ์ด๋ ค์ธ ์ ์๋ค๋ ๊ฒ์ด์ฃ . ๋น์ทํ ์์๋ก๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์กฐํํ๋ ๊ฒ์ด ์๋๋ผ, ์์ ์ญ์ ์ํค๋ ๊ฒ์ผ๋ก ์๋น์ค์ ์น๋ช
์ ์ธ ์ํฅ์ ์ค ์๋ ์์ต๋๋ค.
Note
๋ฌผ๋ก ๋๋ถ๋ถ์ ์๋น์ค์์๋ ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ ์ ์ฉํ๊ณ ์์ต๋๋ค.

์ด๋ SQL ์ธ์ ์ ์ด๋ผ๋ ๋ฌธ์ ๋ก ๋ฌผ๋ก ์ด๋ฅผ ๋ฐฉ์ดํ๋ ๋ฐฉ๋ฒ๋ ์์ง๋ง, ์์์์ ์ธ๊ธํ๊ณ ์ ํ๋ ํต์ฌ์ ์์ ๋ฌธ์์ด ๋ฐฉ๋ฒ์ด ์์ ๋ฌด๊ฒฐํ ๋ฐฉ๋ฒ์ ์๋๋ผ๋ ๊ฒ๋๋ค.
Note
SQL ์ธ์ ์ ์ธ์๋ ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํ (Cross-site scripting, XSS) ๊ฐ์ ๋ฌธ์ ๋ํ ์ ๋ฐํ ์ ์์ต๋๋ค.
PEP 750: Template Strings
์์ ์ ๊น ์ธ๊ธํ๋ ๊ฒ์ฒ๋ผ ํ
ํ๋ฆฟ ๋ฌธ์์ด์ ์์ ๋ฌธ์์ด์ ๋ ์ผ๋ฐํ(generalization)ํ ๊ธฐ๋ฅ์
๋๋ค. ์ด ๋ ๋ฐฉ๋ฒ์ ํต์ฌ ์ฐจ์ด๋ ์์ ๋ฌธ์์ด์ ๊ฒฐ๊ณผ๋ ๋ฐ๋ก ๋ฌธ์์ด์ด ๋์์ง๋ง, ํ
ํ๋ฆฟ ๋ฌธ์์ด์ ๋ฌธ์์ด์ด ์๋ ํ
ํ๋ฆฟ์ด๋ผ๋ ์๋ก์ด ํ์
(string.templatelib.Template
)์ผ๋ก์จ ์ทจ๊ธ๋๋ค๋ ์ ์
๋๋ค.
์ด ์ฐจ์ด๋ก ์ธํด my_template
๋ผ๋ ํ
ํ๋ฆฟ ๋ณ์์ str()
ํจ์๋ฅผ ์ฌ์ฉํด, ๋ฌธ์์ด๋ก ์ทจ๊ธํด ์๋ก์ด ํจ์๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํด๋ ํ
ํ๋ฆฟ ๋ณ์๋ ๋ฌธ์์ด์ด ์๋ ํ
ํ๋ฆฟ์ด๋ผ๋ ํ์
์ ์ฌ์ฉํ๋ ๋งํผ, str()
ํจ์๊ฐ ์ ์ฉ๋์ง ์์ ์ ์๋ฏธํ ๊ฐ์ ์ป์ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํด์๋ ํ
ํ๋ฆฟ ๋ณ์๋ฅผ ๋์์ผ๋ก, str()
ํจ์์ ์ ์ฌํ ์ญํ ์ ํ๋ ์ปค์คํ
ํจ์๋ฅผ ์ฌ์ฉ์๊ฐ ์ง์ ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ ํจ์๋ฅผ ์ฌ์ฉํด ๋ณํํด์ผ๋ง ํฉ๋๋ค.
์ด์ด์ง๋ ์ฝ๋๋ XSS์ ์์๋ก ์์ ๋ฌธ์์ด๊ณผ ํ ํ๋ฆฟ ๋ฌธ์์ด์ ์ฌ์ฉํ๋ ์์์ ๋๋ค.
Note
Python 3.14๋ ์์ง ๊ณต๊ฐ๋์ง ์์๊ธฐ์ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก๋ ํ ํ๋ฆฟ ๋ฌธ์์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
evil = "ยซscript>alert('evil')</script>"
template = t"<p>{evil}</pโบ"
safe = html(template) ## str(template) => not work
not_safe = t"<p>{evil}</pโบ"
## not_safe == "โนpโบ<scriptโบalert('evil')</script></pโบ"
## safe == "<p><script>alert('evil')</script></pโบ"
๋จผ์ ์ฌ์ฉ์๋ก๋ถํฐ ์ฌ์ฉ์ ์ด๋ฆ์ ์
๋ ฅ๋ฐ์ <p>
ํ๊ทธ๋ก ๊ฐ์ธ์ ๋ณด์ฌ์ฃผ๋ ์ญํ ์ ํ๋ ๊ฒฝ์ฐ, ์์ ๋ฌธ์์ด์ ์ฌ์ฉํ๋ค๋ฉด <script>
ํ๊ทธ๋ฅผ ์ด์ฉํด ์์์์๋ ๋จ์ํ evil์ด๋ผ๋ ๋ฌธ์์ด์ ๋์ฐ๋ ์ ๋์์ง๋ง ์ด ์ด์์ ์๋์น ์์ ์ก์
์ ์ ๋ฐํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ํ
ํ๋ฆฟ ๋ฌธ์์ด html()
์ด๋ผ๋ ๋ฌธ์์ด์ ์ด์ค์ผ์ดํ(escape) ์ฒ๋ฆฌํด ์ฃผ๋ ์ถ๊ฐ ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ๊น์ง๋ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค. ์ด์ค์ผ์ดํ ์ฒ๋ฆฌ(escape processing)๋ ํ๋ก๊ทธ๋๋ฐ์ด๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์์ ํน์ํ ๋ฌธ์๋ค์ด ์๋ ์๋๋ ๋๋ก ์ฒ๋ฆฌ๋์ง ์๊ฑฐ๋, ์ถฉ๋์ ์ผ์ผํค๋ ์ํฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๊ธฐ๋ฒ์
๋๋ค. ์ฃผ๋ก ๋ฌธ์์ด ๋ด์์ ํน์ ๋ฌธ์๊ฐ ํน๋ณํ ์๋ฏธ๋ฅผ ๊ฐ์ง ์๋๋ก '๋ณํ'ํด์ ์ฒ๋ฆฌํฉ๋๋ค.
ํ ํ๋ฆฟ ๋ฌธ์์ด์์๋ ์ปค์คํ ํจ์์ ์ฌ์ฉ ์ธ์๋ ๋์ ๋๋ฆฌ์ ๊ฐ์ ๊ธฐ๋ฅ๋ ํ์ฉํ์ฌ, ํ ํ๋ฆฟ ๋ฌธ์์ด์ ๋ ์ ์ฐํ๊ฒ ํ์ฉํ ์ ์์ต๋๋ค.
attributes = {"sre": "shrubbery.jpg", "alt": "looks nice"}
template = t"<img {attributes} />"
## html (template) == '<img src="shrubbery.jpg" alt="looks nice" />'
์ด ํ ํ๋ฆฟ ๋ฌธ์์ด์ ๊ธฐ์กด์ ๋ฌธ์์ด ํฌ๋งคํ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉ๋๋ ์์ ๋ฌธ์์ด์ ๋ด์ฉ์ ๊ทธ๋๋ก ์ง์ํฉ๋๋ค. ์ด ๋ด์ฉ์ ์์ ๋ฌธ์์ด์ ์ ํ ์์ด ํ์ด์ฌ ํ์์์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํ๋ ๋ด์ฉ์ธ๋ฐ์. ์ฆ, ํ ํ๋ฆฟ ๋ฌธ์์ด์ ์์ ๋ฌธ์์ด์ ๊ณ์นํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
์ด ์ธ์ ํฌ๊ฒ ์ค์ํ์ง ์์ง๋ง, ํ
ํ๋ฆฟ ๋ฌธ์์ด ์์ ์ฐ์ด๋ ์ ๋์ฌ๋ ์๋ฌธ์ t-
์ ๋๋ฌธ์ T-
๋ฐฉ๋ฒ ๋ชจ๋ ์ฌ์ฉํ ์ ์๊ณ , ์์ ๋ฌธ์์ด๋ ๊ทธ๋ฌํ๋ ๊ฒ์ฒ๋ผ u-
(์ ๋์ฝ๋) ์ b-
(๋ฐ์ดํธ) ์ ๋์ฌ, ๊ทธ๋ฆฌ๊ณ ์์ ๋ฌธ์์ด์ ์๋ฏธํ๋ f-
์๋ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํ ํ๋ฆฟ ๋ฌธ์์ด ๋ ์์๋ณด๊ธฐ
์ด์ด์ง๋ ๋ด์ฉ๋ค์ ํ ํ๋ฆฟ ๋ฌธ์์ด์ ์ฌ์ฉํ๋ ์ฃผ์ ๋ฐฉ๋ฒ๋ค์ ๋๋ค.
1. ํ ํ๋ฆฟ ๋ฌธ์์ด์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ธํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ํ ํ๋ฆฟ ๋ฌธ์์ด์ ๋ฏธ๋ฆฌ ์ ์๋์ด ์๋ strings์ ์ธ๋ถ์์ ์ถ๊ฐ๋์ด ๋ณด๊ฐ์ ์ฐ์ด๋ interpolations๋ก ๊ตฌ๋ถ๋ฉ๋๋ค. ์ด interpolations๋ ์กฐ๊ธ ๋ ๊ตฌ์ฒด์ ์ผ๋ก value์ expression์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค. value๋ ์ค์ ๋ก ํ ํ๋ฆฟ ๋ฌธ์์ด์ ๋ค์ด์ค๋ ๊ฐ, expression์ ์ด๋ฅผ ํํํ๋ ๋ณ์ ์ด๋ฆ์ผ๋ก, ๋๋ถ๋ถ expression์ ๋๋ฒ๊ทธ ๋ชฉ์ ์ธ์๋ ์ฌ์ฉํ ์ผ์ด ์๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
name = "World"
template = t"Hello {name}"
## template.strings[0] == "Hello "
## template.interpolations[0].value == "World"
## template.interpolations[0].expression == "name"
2. ์ด์ด์ interpolations
์๋ conversion
์ด๋ผ๋ ํญ๋ชฉ๋ ์กด์ฌํฉ๋๋ค.
์ด๋ ์์ ๋ฌธ์์ด์์๋ ์ฌ์ฉํ ์ ์๋ ์ ๋ ฅ๋๋ ๋ฌธ์์ด์ ์ด๋ป๊ฒ ๋ณํํ ๊ฒ์ธ์ง ์ง์ ํ๋ ์ต์ ์ผ๋ก repr๋ฅผ ์๋ฏธํ๋ r, str๋ฅผ ์๋ฏธํ๋ s, ascii๋ฅผ ์๋ฏธํ๋ a๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.

3. ๋ฌธ์์ด์ ์ถ๋ ฅ ํ์์ ์กฐ์ ํ๋ format_spec
๋ ๋์ผํ๊ฒ interpolations
๋ด๋ถ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
format_spec
์ ๊ทธ ๊ฐ์ ์ง์ ์ค์ ํ๊ธฐ๋ณด๋จ ์ค๊ดํธ ์์์ ์ ์ธํ๋ ๋ฐฉ์์ด ๋ ํธ๋ฆฌํฉ๋๋ค.
value = 42
template = t"Value: {value:.2f}"
## template.interpolations[0].format_spec = ". 2f"
4. ํ
ํ๋ฆฟ ๋ฌธ์์ด์ ๋ ๋๋ง ํจ์ (์์ ์์์ html()
ํจ์)๋ ํ
ํ๋ฆฟ ํ์
์ ๋ณ์๋ฅผ ์
๋ ฅ๋ฐ์, ์์์ ์ฒ๋ฆฌ๋ฅผ ํ๋๋ก ์ ์ธํ ์ ์์ต๋๋ค.
์ด์ด์ง๋ ์์์์๋ ํ
ํ๋ฆฟ ๋ฌธ์์ด์ ์
๋ ฅ๋ฐ์ ํ
ํ๋ฆฟ ๋ฌธ์์ด ๋ด๋ถ์ value๋ฅผ str()
ํจ์์ upper()
ํจ์๋ฅผ ์ฌ์ฉํด ๋ฌธ์์ด์ ์๋๋๋ก ๋ ๋๋งํฉ๋๋ค.

5. ํ
ํ๋ฆฟ ๋ฌธ์์ด์ ๋ฌธ์์ด์ฒ๋ผ +
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ ํ
ํ๋ฆฟ ๋ฌธ์์ด๊ณผ ๋ฌธ์์ด์ ๋ํ๋ ๊ฒ ์ธ์๋ ํ
ํ๋ฆฟ ๋ฌธ์์ด๊ณผ ํ
ํ๋ฆฟ ๋ฌธ์์ด์ ๋ํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค. ๋ฌผ๋ก +
๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ํฉ์น๋ ๋ฐฉ๋ฒ์ด๋, __add__()
ํจ์์ __radd__()
ํจ์์ ์ฌ์ฉ๋ ๊ฐ๋ฅํฉ๋๋ค.

name = "World"
## (t"Hello " t"World"').strings == ("Hello World", )
## ("Hello " t"World") strings == ("Hello World' ,)
6. ํ ํ๋ฆฟ ๋ฌธ์์ด ์ค๋ธ์ ํธ ๊ฐ์ ๋์ผ ์ฌ๋ถ๋ ์ด๋ป๊ฒ ํ์ธํ ๊น์?
์ด์ ๋ํด์๋ ์๊ฒฉํ ๊ท์น์ ํ์ด์ฌ์์ ์ง์ ํ์ง ์์ ๋ฐํ๋๋ ๋ฌธ์์ด์ด๋, ๋ค๋ฅธ ํ์ ๊ฐ์ ๋์ผ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ์ปค์คํ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด์ ๋ interpolations์์ ๊ฐ์ง ์ ์๋ ๊ฐ์ ์ ํ์ด ์๊ณ , ์ข ๋ฅ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋น์ทํ ์ด์ ๋ก ํ ํ๋ฆฟ ๋ฌธ์์ด ๊ฐ์๋ ์์(ordering)๋ฅผ ์ง์ํ์ง ์์ผ๋ฏ๋ก, ์ปค์คํ ํจ์๋ฅผ ๊ตฌํํ์ฌ ์ฌ์ฉํฉ๋๋ค.
7. ํ ํ๋ฆฟ ๋ฌธ์์ด์์ ๋๋ฒ๊ทธ ์ง์ ์ (debug specifier)๋ ์์ ๋ฌธ์์ด์์์ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
์กฐ๊ธ ๋ ๊ตฌ์ฒด์ ์ผ๋ก๋ ํ
ํ๋ฆฟ ๋ฌธ์์ด์์๋ repl()
๋ณํ์ ์๋์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
name = "World"
template = t"Hello {name=}"
print(f"{name=}") ## name='World'
## template.strings[0] = "Hello name="
## template.interpolations[0].value == "World"
## template.interpolations[0].conversion == "r"
## t'{value=}' => t'value={value!r}'.
8. ๋ง์ง๋ง์ผ๋ก ํ
ํ๋ฆฟ ๋ฌธ์์ด์์๋ r-
์ ๋์ฌ๋ฅผ t-
์ ๋์ฌ์ ํจ๊ป ์ฌ์ฉํด์ ์์ ๋ฌธ์์ด(raw template strings)์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด์ด์ง๋ ์์์์ \n
์ r-
์ ๋์ฌ๋ฅผ ์ฌ์ฉํ์ฌ, \nextline
์ ์๋ฏธํ๋ ๋จ์ด๊ฐ ์๋ \
์ n
์ด 2๊ฐ์ ๊ธ์๋ก ์ทจ๊ธ๋ฉ๋๋ค. ์ ๋์ฌ ๊ฐ ์์๋ ์๊ด์์ด rt-
๊ณผ tr-
๋ชจ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.

์ด ์ธ์ ํ ํ๋ฆฟ ๋ฌธ์์ด์ ์ํด templatelib๋ผ๋ ์๋ธ ๋ชจ๋์ ์๋กญ๊ฒ ์ฌ์ฉํ๋ค๋ ๊ฒ ์ธ์๋ ๊ฑฐ์ ๋ชจ๋ ๋ด์ฉ์ด ์ด์ ์์ ๋ฌธ์์ด์ ์๋ ๋ฐฉ์๊ณผ ๋์ผํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ฐธ๊ณ ํ๋ฉด ์ข์ต๋๋ค.
ํ ํ๋ฆฟ ๋ฌธ์์ด ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
ํ
ํ๋ฆฟ ๋ฌธ์์ด์ ์ฒ๋ฆฌํ๋ค๋ ๊ฒ์ ํ
ํ๋ฆฟ ๋ฌธ์์ด ๋ด๋ถ์ ๋ฌธ์์ด๊ณผ ๋ณด๊ฐ๋๋ ๊ฐ์ ์ต์ข
๋ฌธ์์ด๋ก ๊ณ์ฐํ๊ธฐ ์ ์ ์ ๊ทผํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๋ฅผ ์ํด ๋จผ์ .strings
์ .values
๋ฅผ ์ฌ์ฉํ์ฌ ํํ ์๋ฃํ์ ์ป์ ์ ์์ต๋๋ค.

๋ํ ํ ํ๋ฆฟ ๋ฌธ์์ด์๋ ๋ฆฌ์คํธ(list)๋ฅผ ์ฌ์ฉํ์ฌ, ๋ฌธ์์ด๊ณผ ๋ณด๊ฐ ๊ฐ์ ๊ตฌ๋ถํ์ง ์๊ณ ์ ๊ทผํ ์๋ ์์ต๋๋ค.

ํ
ํ๋ฆฟ ๋ฌธ์์ด์ ๊ฐ๋จํ ํํ ๋ฐฉ๋ฒ์ด ํท๊ฐ๋ฆฐ๋ค๋ฉด, t-
์ ๋์ฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ Template๋ฅผ ์ฌ์ฉํด ํ
ํ๋ฆฟ ๋ฌธ์์ด์ ๊ตฌ์ฑํ๋ ๋ด์ฉ์ ๋ช
์ํ์ฌ ์ธ์คํด์คํํ ์๋ ์์ต๋๋ค.

ํ ํ๋ฆฟ ๋ฌธ์์ด ์ฌ์ฉ ์์
์ด์ด์ PEP 750์ ์ ์ ์ค ํ ๋ช
์ธ Dave Peck์ด ์๊ฐํ ๊ฐ๋จํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค. ํ
ํ๋ฆฟ ๋ฌธ์์ด์ ์ด์ฉํด ํผ๊ทธ ๋ผํด(pig latin) ์ธ์ด๋ก ๋ณ๊ฒฝํ๋ ์์ ์ฝ๋์
๋๋ค. ์ฌ๊ธฐ์ ํผ๊ทธ ๋ผํด์ด๋ ์์ด ๋จ์ด๋ฅผ ๋ณํํ๋ ๊ท์น์ผ๋ก, ๋จ์ด๊ฐ ๋ชจ์ (a, e, i, o, u)๋ก ์์ํ๋ฉด ๋จ์ด ๋์ โyayโ๋ฅผ ์ถ๊ฐํ๊ณ , ๋ฐ๋๋ก ์์์ผ๋ก ์์ํ๋ฉด ์ฒซ ๊ธ์๋ฅผ ๋งจ ๋ค๋ก ๋ณด๋ด๊ณ โayโ๋ฅผ ๋ถ์ด๋ ๋ฐฉ๋ฒ์
๋๋ค. ์ด์ pig_latin
ํจ์๋ฅผ ์ฒ์ฒํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.

def pig_latin(template: Template) -> str:
"""Convert a Template to pig latin."""
result = []
for item in template:
if isinstance(item, str):
result. append(item)
else:
word = item. value
if word and word[0] in "aeiou":
result.append(word + "yay")
else:
result.append(word[1:] + word[0] + "ay")
return "". join(result)
name = "world"
template = t"Hello {name}!"
assert pig_latin(template) == "Hello orldway!"
- ๋จผ์ L4์์๋ ์ ๋ ฅ๋ฐ์ template์ ๋ํด item(์์ดํ )์ผ๋ก ๋ฐ๋ณต์ ์คํํฉ๋๋ค. ์ฌ๊ธฐ์ ์์ดํ ์ด str ์ธ์คํด์ค, ์ฆ ๋ฌธ์์ด์ด๋ผ๋ฉด result์ ์์ดํ ์ ์ถ๊ฐํฉ๋๋ค. (L5-L6)
- ๋ง์ฝ ๋ฌธ์์ด์ด ์๋๋ผ๋ฉด, ์ฆ interpolation์ด๋ผ๋ฉด (L7) ์์ดํ ์ value๋ฅผ word๋ก ์ฌ์ฉํ๊ณ , (L8)
- ๋ชจ์๊ณผ ์์์ ๊ตฌ๋ถํ์ฌ yay๋ฅผ ๋ถ์ด๊ฑฐ๋, ์ฒซ ๊ธ์๋ฅผ ๋ค๋ก ๋ณด๋ธ ๋ค ay๋ฅผ ๋ถ์ ๋๋ค. (L10, L12)
์ด ํจ์์๋ ๋ ๊ฐ์ง ํต์ฌ ๋ถ๋ถ์ด ์์ต๋๋ค. ๋จผ์ L5์์ ํ
ํ๋ฆฟ ๋ฌธ์์ด์ ๊ตฌ์ฑํ๋ ์์ดํ
์ด ๋ฌธ์์ด์ธ์ง ๋ณด๊ฐ ๊ฐ์ธ์ง๋ฅผ ๊ตฌ๋ถํ๋ ๊ฒ๊ณผ, L8์์ ๋ณด๊ฐ ๊ฐ์ด๋ผ๋ฉด .value
๋ฅผ ์ฌ์ฉํด ์ ๊ทผํ๊ณ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์ด์ฃ . ์ด ์ธ์ ๋ฌธ์์ด์ ๋ค๋ฃจ๋ ๋ถ๋ถ์ ํ
ํ๋ฆฟ ๋ฌธ์์ด์ด ์๋ ์์ ๋ฌธ์์ด์ด๋ ๊ธฐ์กด ๋ค๋ฅธ ๋ฌธ์์ด ์ฒ๋ฆฌ ๋ฐฉ๋ฒ๊ณผ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ต๋๋ค.

Format์ ๋์ด Template์ผ๋ก
๊ฒฐ๋ก ์ ์ผ๋ก, ํ
ํ๋ฆฟ ๋ฌธ์์ด์ด ๊ธฐ์กด์ ์์ ๋ฌธ์์ด๊ณผ ๋๋ ทํ๊ฒ ๊ตฌ๋ถ๋๋ ํต์ฌ์ {name}
๊ณผ ๊ฐ์ด ์
๋ ฅ๋ ๊ฐ์ผ๋ก ๋ฌธ์์ด์ ์ฆ์ ํ๊ฐํด ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋์ง, ์๋๋ฉด ๋ณ๋์ ๋ ๋๋ง ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ ์ค์ ๋ฌธ์์ด๋ก ๋ณํํ๋์ง์ ์์ต๋๋ค. ํ
ํ๋ฆฟ ๋ฌธ์์ด์ ์ด๋ฌํ ์ง์ฐ ํ๊ฐ๋ฅผ ํตํด, ๋จ์ํ ๊ฐ ์นํ์ ๋์ด ์
๋ ฅ๊ฐ์ ์ฒ๋ฆฌํ๊ณ ๊ฒ์ฆํ ์ถ๊ฐ์ ์ธ ๊ธฐํ๋ฅผ ์ ๊ณตํฉ๋๋ค.
Note
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ํ ํ๋ฆฟ ๋ฌธ์์ด์ tagged template์ ํ์ด์ฌ ๋ฒ์ ์ผ๋ก ์ดํดํ ์ ์์ต๋๋ค.

์ด๋ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ ์์ ํ๊ณ , ์์ ๋ค๋ค๋ SQL ์ธ์ ์ ์ด๋ XSS ๋ฑ์ ๋ค์ํ ๋ณด์ ์๊ตฌ๋ ๋๋ฉ์ธ ํนํ ์๊ตฌ์ ๋ง์ถฐ, ํ์ด์ฌ์์์ ๋ฌธ์์ด ์ฌ์ฉ์ ์ ์ฐํ๊ฒ ํ์ฅํ ๋ฐฉ๋ฒ์ ์ ์ํด ์ค๋ค๋ ์ ์์ ํฐ ์์๊ฐ ์์ต๋๋ค. ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ด PEP 750์ ์ ์๋ฅผ ๋น๋กฏํ ํ์ด์ฌ ์ปค๋ฎค๋ํฐ๊ฐ โํ ํ๋ฆฟ ๋ฌธ์์ดโ์ ํฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ ์์ํฌ์ ๋ฌธ์์ด ์ฒ๋ฆฌ ํ์ค์ผ๋ก ์๋ฆฌ ์ก๊ธฐ๋ฅผ ๋ฐ๋ผ๋ ์ค์ํ ์ด์ ์ด๊ธฐ๋ ํฉ๋๋ค.
ํ์ง๋ง ํ ํ๋ฆฟ ๋ฌธ์์ด์ด ๋ชจ๋ ์ํฉ์์ ์๋ฒฝํ ํด๋ฒ์ด๋ผ๊ณ ๋ณด๊ธฐ๋ ์์ง ์ด๋ฆ ๋๋ค.
- ์ฐ์ ์์ ๋ฌธ์์ด๊ณผ ๋ฌ๋ฆฌ ๋ฌธ์์ด์ด ๊ณง๋ฐ๋ก ์์ฑ๋์ง ์๊ธฐ ๋๋ฌธ์, ๊ฐ๋ฐ์๋ ๋ฐ๋์ ๋ณ๋์ ๋ ๋๋ง ๋๋ ๋ณํ ํจ์๋ฅผ ๊ฑฐ์ณ์ผ๋ง ์ต์ข ๋ฌธ์์ด์ ์ป์ ์ ์์ต๋๋ค.
- ์ด์ ๋ฐ๋ผ ์ฌ์ฉ๊ณผ ์ฝ๋ ์ดํด๊ฐ ๋ค์ ๋ณต์กํด์ง ์ ์๊ณ , ํ ํ๋ฆฟ ๊ตฌ์กฐ์ ๋ ๋๋ง ๊ณผ์ ์ ํจ๊ป ์ดํดํด์ผ ํ๋ ์ถ๊ฐ์ ์ธ ํ์ต ๋ถ๋ด๋ ๋ฐ์ํฉ๋๋ค.
- ๊ธฐ์กด ์ฝ๋๋ฅผ ํ ํ๋ฆฟ ๋ฌธ์์ด๋ก ์ฎ๊ธฐ๊ธฐ ์ํด์๋ ํธํ์ฑ ํ๋ณด, ๋ง์ด๊ทธ๋ ์ด์ ๋ฑ์ ๋ณ๋ ์์ ์ด ํ์ํฉ๋๋ค.
- ์์ง ๋์ ์ด๊ธฐ ๋จ๊ณ์ธ ๋งํผ ๋ฐํ์ ์ฑ๋ฅ(performance)์ ๋ํ ์ถฉ๋ถํ ์ค์ฆ๋ ๋ ํ์ํฉ๋๋ค.
- Template ๊ฐ์ฒด์ ํน์ฑ์ IDE์ ์ฝ๋ ์๋์์ฑ, ์ ์ ํ์ ๊ฒ์ฌ, ํ์ด๋ผ์ดํ ๋ฑ์ ๋๊ตฌ ์ง์๋ ๋น๋ถ๊ฐ์ ์ ํ์ ์ผ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.
- ๋ํ ์์ ๋ฌธ์์ด ๋ฐฉ๋ฒ์์ ๋ฌธ์์ด์ ๋ฏธ๋ฆฌ ๊ณ์ฐํ๋ ๊ฒ์ผ๋ก ์ธํ ์ํ์ ์ด๋ฏธ ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ฉ์๋ค์ด ์์ฒด์ ์ผ๋ก ์ด๋ ์ ๋ ํด๊ฒฐํ๊ณ ์๋ ์ํฉ์์, ํ์ด์ฌ ์ธ์ด ๋จ์์ ๋ถํ์ํ ์ ์๋ ํ ํ๋ฆฟ ๋ฌธ์์ด์ ๋์ ์ ์ฐ๋ คํ๋ ๋ชฉ์๋ฆฌ๋ ์์ต๋๋ค.
๋ฌด์๋ณด๋ค ๋ช ํํ, ๊ทธ๋ฆฌ๊ณ ๊ฐ๊ธ์ ์ด๋ฉด ์ ์ผํ ๋ช ๋ฐฑํ ๋ฐฉ๋ฒ์ด ์์ ๊ฒ์ด๋ค. (There should be one-- and preferably only one --obvious way to do it.)๋ผ๋ ํ์ด์ฌ์ ์์น์๋ ๋ฌธ์์ด ํฌ๋งคํ ์ ์ํด %, format, ์์ ๋ฌธ์์ด, ํ ํ๋ฆฟ ๋ฌธ์์ด๊น์ง ์ฌ๋ฌ ๋ฐฉ๋ฒ์ ์ ํํ๋ ๊ฒ์ ์กฐ๊ธ ๊ฑฐ๋ฆฌ๊ฐ ์์ฃ .
Note
์, ์ด๊ฒ๋ PEP 20์ ์์ต๋๋ค.

์ด์ฒ๋ผ ํ ํ๋ฆฟ ๋ฌธ์์ด์ ์ฌ๋ฌ ๊ฐ์ง ์ฅ์ ๊ณผ ํจ๊ป ์ค์ ๊ฐ๋ฐ ๋ฐ ์ด์ฉ ํ๊ฒฝ์์ ๊ฐ์ ๊ณผ์ ๋ ๋ถ๋ช ํ ์กด์ฌํฉ๋๋ค. ๊ทธ๋ ์ง๋ง ํ์ด์ฌ ์ปค๋ฎค๋ํฐ์์๋ ์ด๋ฏธ ๋ค์ํ ๋ถ์ผ์์ ํ ํ๋ฆฟ ๋ฌธ์์ด์ ๊ฐ๋ฅ์ฑ์ ์ ๊ทน์ ์ผ๋ก ์คํํ๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ง๋ 4์ ๋ ผ์๊ฐ ์์๋PEP 787์์๋ subprocess ๋ชจ๋์์ ํ ํ๋ฆฟ ๋ฌธ์์ด ์ง์์ ์ถ๊ฐํ๋ ๋ฐฉ์์ด ๋ ผ์๋๊ณ ์๋๋ฐ์. ์ด์ฒ๋ผ ํ์ด์ฌ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฐจ์์์์ ์ค์ ์ ์ฉ ๊ฐ๋ฅ์ฑ๊น์ง ์ ๊ทน์ ์ผ๋ก ๊ฒํ ๋๊ณ ์์ต๋๋ค.
ํฅํ ํ ํ๋ฆฟ ๋ฌธ์์ด์ด ์ผ๋ง๋ ๋น ๋ฅด๊ฒ, ๊ทธ๋ฆฌ๊ณ ๋๊ฒ ํ์ฐํ ์ง๋ ๋ ์ง์ผ๋ณผ ํ์๊ฐ ์์ต๋๋ค. ์์ ๊ทธ๋ฆฐ ์ด๋ฏธ์ง๋ค์ฒ๋ผ ํ ํ๋ฆฟ ๋ฌธ์์ด์ด ์์ ํ ๋ฌธ์์ด ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ณด์ ๊ฒ์๋๊ฐ ๋ ์ง, ๋ถํ์ํ๊ณ ๊ณผํ๊ฒ ๋๊ปด์ง๋ ์์ ๋๊ตฌ๊ฐ ๋ ์ง๋ ์์ผ๋ก ๊ณ์ ์ง์ผ๋ด์ผ๊ฒ ์ฃ . ํ์ง๋ง ์ ๋ ฅ๊ฐ์ ๋ ์์ ํ๊ฒ ๋ค๋ฃจ๊ณ , ์ ์ฐํ๊ฒ ํ์ฅํ ์ ์๋ ์๋ก์ด ํจ๋ฌ๋ค์์ผ๋ก์ ํ ํ๋ฆฟ ๋ฌธ์์ด์ด ํ์ด์ฌ ๊ฐ๋ฐ์๋ค์๊ฒ ์ค์ํ ๋๊ตฌ๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ ์ถฉ๋ถํฉ๋๋ค. ์์ผ๋ก์ ์งํ์ ํ์คํ ๊ณผ์ ์์, ํ ํ๋ฆฟ ๋ฌธ์์ด์ ์ค์ง์ ๊ฐ์น์ ํ๊ณ๊ฐ ๋์ฑ ๋ช ํํ ๋๋ฌ๋ ๊ฒ์ผ๋ก ๊ธฐ๋๋ฉ๋๋ค.