์ƒ์œ„ 20๊ฐœ Python ์ •์  ๋ถ„์„ ๋„๊ตฌ

ํŒŒ์ด์ฌ ์ •์  ๋ถ„์„ ๋„๊ตฌ TOP 20: ์ฝ”๋“œ ํ’ˆ์งˆ ๋ฐ ์„ฑ๋Šฅ ํ–ฅ์ƒ

ํšจ์œจ์ ์ด๊ณ  ์•ˆ์ „ํ•˜๋ฉฐ ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ Python ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง๋ฉดํ•˜๋Š” ๊ณผ์ œ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ ์ฆ๊ฐ€ํ•˜์—ฌ ์˜ค๋ฅ˜, ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ ๋ฐ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•œ ๊ณณ์ž…๋‹ˆ๋‹ค. Python ๋งค์šฐ ๊ท€์ค‘ํ•ด์ง‘๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ ๋„ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, ๋น„ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค ์ดˆ๊ธฐ์— ๋ณด์•ˆ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ†ตํ•ฉํ•˜์—ฌ ์ •์  ๋ถ„์„ ์›Œํฌํ”Œ๋กœ์— ์ฝ”๋“œ ํ’ˆ์งˆ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ตœ์ ํ™”ํ•˜๋ฉฐ ๋ชจ๋ฒ” ์‚ฌ๋ก€์™€ ๊ฐ™์€ ์ค€์ˆ˜๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŽฉ 8 ๊ทธ๋ฆฌ๊ณ  ๊นจ๋—ํ•œ ์ฝ”๋”ฉ ์›์น™.

ํ˜„๋Œ€ํ™” ์œ„ํ—˜ ๋ช…ํ™•์„ฑ

Smart TS XL์€ ์Šค์บ๋„ˆ ์ถœ๋ ฅ์„ ๋™์ž‘ ๋ฐ ์ข…์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์ œ๊ณตํ•จ์œผ๋กœ์จ Python DevOps ๊ฒŒ์ดํŠธ ๊ฒฐ์ •์„ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ ํƒ์ƒ‰

์ •์  ์ฝ”๋“œ ๋ถ„์„์€ ๋‹จ์ˆœํ•œ ๊ตฌ๋ฌธ ๊ฒ€์‚ฌ๋ฅผ ๋„˜์–ด ์ฝ”๋“œ ๋ณต์žก์„ฑ, ๋…ผ๋ฆฌ ์˜ค๋ฅ˜ ๋ฐ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜, ์ค‘๋ณต ๋ฃจํ”„ ๋ฐ ์ตœ์ ์ด ์•„๋‹Œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹๋ณ„ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ค„์ด๊ณ  ์œ ์ง€ ๊ด€๋ฆฌ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ณด์•ˆ ๊ฐ์‚ฌ์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๋ฉฐ ์•…์šฉ ๊ฐ€๋Šฅํ•ด์ง€๊ธฐ ์ „์— ์ž ์žฌ์ ์ธ ์ทจ์•ฝ์„ฑ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์€ Python ์Šคํฌ๋ฆฝํŠธ๋‚˜ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ž‘์—…ํ•˜๋“  ์ •์  ๋ถ„์„์„ ํ†ตํ•ฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ํšจ์œจ์ ์ด๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” Python ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ, ๋ณด์•ˆ ๋ฐ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ด์ฌ์„ ์œ„ํ•œ ํ•„์ˆ˜ ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ 20๊ฐ€์ง€

์Šค๋งˆํŠธ TS XL

Smart TS XL์€ ์ตœ์‹  Python ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ์„ค๊ณ„๋œ ๊ณ ์„ฑ๋Šฅ AI ๊ธฐ๋ฐ˜ ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋ฐ ์˜ํ–ฅ ํ‰๊ฐ€ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋ณต์žกํ•œ Python ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์žˆ์–ด ํƒ€์˜ ์ถ”์ข…์„ ๋ถˆํ—ˆํ•˜๋Š” ์ •ํ™•์„ฑ, ํšจ์œจ์„ฑ ๋ฐ ๋ณด์•ˆ์„ ์ œ๊ณตํ•˜์—ฌ ๊ธฐ์—…, ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ํŒ€ ๋ฐ ์‚ฌ์ด๋ฒ„ ๋ณด์•ˆ ์ „๋ฌธ๊ฐ€์—๊ฒŒ ํ•„์ˆ˜์ ์ธ ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ์ˆ˜๋ฐฑ๋งŒ ์ค„์˜ Python ์ฝ”๋“œ๋ฅผ ๋ช‡ ์ดˆ ๋งŒ์— ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋Š” Smart TS XL์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์—…๊ณ„ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ค€์ˆ˜ํ•˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

๋น„๊ตํ•  ์ˆ˜ ์—†๋Š” ์†๋„์™€ ํ™•์žฅ์„ฑ

  • ์‹ค์‹œ๊ฐ„์œผ๋กœ ์‹ฌ์ธต์ ์ธ ์ •์  ์ฝ”๋“œ ๋ถ„์„์„ ์‹คํ–‰ํ•˜์—ฌ ๋ช‡ ์ดˆ ๋‚ด์— ์ทจ์•ฝ์ ๊ณผ ๋น„ํšจ์œจ์„ฑ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์„ฑ๋Šฅ ์ €ํ•˜ ์—†์ด ๊ด‘๋ฒ”์œ„ํ•œ Python ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ๊ธฐ์—… ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ ํŒŒ์ดํ”„๋ผ์ธ๊ณผ์˜ ์›ํ™œํ•œ ํ†ตํ•ฉ์„ ์ œ๊ณตํ•˜์—ฌ ๋ชจ๋“  ๊ทœ๋ชจ์˜ ํŒ€์„ ์ง€์›ํ•˜๊ณ , ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋™์‹œ์— ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

ํฌ๊ด„์ ์ธ ์ฝ”๋“œ ํ’ˆ์งˆ ๋ฐ ๋ณด์•ˆ ๊ฐ์‚ฌ

Smart TS XL์€ ์‹ฌ์ธต์ ์ธ ์ •์  ์ฝ”๋“œ ๋ถ„์„์„ ์ œ๊ณตํ•˜์—ฌ ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ, ๋น„ํšจ์œจ์ ์ธ ์ฝ”๋“œ ํŒจํ„ด ๋ฐ ๊ตฌ์กฐ์  ์•ฝ์ ์„ ํ”„๋กœ๋•์…˜์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „์— ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. AI ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•˜์—ฌ ์ •ํ™•ํ•˜๊ณ  ์ƒํ™ฉ์— ๋งž๋Š” ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • SQL ์ฃผ์ž… ์œ„ํ—˜, ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ž๊ฒฉ ์ฆ๋ช…, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ API ์‚ฌ์šฉ ๋“ฑ์˜ ๋ณด์•ˆ ๊ฒฐํ•จ์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํšจ์œจ์„ฑ์„ ์ตœ์ ํ™”ํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด Big O ํ‘œ๊ธฐ๋ฒ•์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.
  • ์ค‘๋ณต๋œ ๋ฃจํ”„, ๊ณผ๋„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ, ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ๋ณด์กด์„ ํ”Œ๋ž˜๊ทธ๋กœ ํ‘œ์‹œํ•˜์—ฌ ํšจ์œจ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  • PEP 8 ๋ฐ ๋ชจ๋ฒ” ๋ณด์•ˆ ๊ด€ํ–‰๊ณผ ๊ฐ™์€ Python ์ฝ”๋”ฉ ํ‘œ์ค€์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.

์ƒ๋‹นํ•œ ๋น„์šฉ ์ ˆ๊ฐ ๋ฐ ROI

  • ์ฝ”๋“œ ๊ฒ€ํ†  ์‹œ๊ฐ„์„ 30-40% ๋‹จ์ถ•ํ•˜์—ฌ ๊ฐœ๋ฐœํŒ€์ด ๋””๋ฒ„๊น…์ด ์•„๋‹Œ ํ˜์‹ ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค ์ดˆ๊ธฐ์— ๋ณด์•ˆ ์ทจ์•ฝ์ ๊ณผ ๋น„ํšจ์œจ์„ฑ์„ ํŒŒ์•…ํ•˜์—ฌ ๋ฐฐํฌ ํ›„ ์ˆ˜์ •์— ๋“œ๋Š” ๋น„์šฉ์ด ์ตœ์†Œํ™”๋ฉ๋‹ˆ๋‹ค.
  • Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๊ณผ CPU ์†Œ๋น„๋ฅผ ์ตœ์ ํ™”ํ•˜์—ฌ ์ธํ”„๋ผ ๋น„์šฉ์„ ์ค„์ž…๋‹ˆ๋‹ค.

ํ–ฅ์ƒ๋œ ์†Œํ”„ํŠธ์›จ์–ด ํ’ˆ์งˆ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ์„ฑ

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†๋„๋ฅผ ์ €ํ•˜์‹œํ‚ค๋Š” ์ˆจ๊ฒจ์ง„ ์ข…์†์„ฑ, ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ, ๋น„ํšจ์œจ์ ์ธ ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฆฌํŒฉํ† ๋ง์ด ํ•„์š”ํ•œ ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ์˜ค๋ž˜๋œ ์ฝ”๋“œ๋ฅผ ์‹๋ณ„ํ•˜์—ฌ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.
  • ์ผ๊ด€๋˜๊ณ  ๊น”๋”ํ•œ ์ฝ”๋”ฉ ๊ด€ํ–‰์„ ์ ์šฉํ•˜์—ฌ Python ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€ ๊ด€๋ฆฌ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ž์„ธํ•œ ์„ค๋ช…๊ณผ ๊ถŒ์žฅ ์‚ฌํ•ญ์ด ํฌํ•จ๋œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ณด๊ณ ์„œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋›ฐ์–ด๋‚œ ์ง€์‹ ๊ด€๋ฆฌ ๋ฐ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ

  • ๋ช…ํ™•ํ•œ ๋ฌธ์„œ์™€ AI ๊ธฐ๋ฐ˜ ์ฝ”๋“œ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•˜์—ฌ ์‹ ๊ทœ ๊ฐœ๋ฐœ์ž์˜ ์˜จ๋ณด๋”ฉ์„ ๊ฐ€์†ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ํŒ€ ๊ฐ„ ์ง€์‹ ์ „๋‹ฌ์„ ์ž๋™ํ™”ํ•˜์—ฌ ์ •์  ์ฝ”๋“œ ๋ถ„์„์— ๋Œ€ํ•œ ์„ ์ž„ ๊ฐœ๋ฐœ์ž์— ๋Œ€ํ•œ ์˜์กด๋„๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.
  • ์ •์  ๋ถ„์„ ๋ณด๊ณ ์„œ๋ฅผ ์œ„ํ•œ ์ค‘์•™ ์ €์žฅ์†Œ๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœํŒ€๊ณผ ๋ณด์•ˆํŒ€ ๊ฐ„์˜ ํ˜‘์—…์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ˆœํ™˜ ๋ณต์žก๋„์™€ ๊ฐ™์€ ๊ณ ๊ธ‰ ๋ณต์žก๋„ ์ธก์ • ํ•ญ๋ชฉ์„ ํ™œ์šฉํ•˜์—ฌ ํŒ€์ด ๋ฆฌํŒฉํ† ๋ง ์ž‘์—…์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ •ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค.

์‚ฐ์—… ๋ฐ ๊ณ ๊ฐ ์œ ํ˜•

Smart TS XL์€ **๋†’์€ ๋ณด์•ˆ, ์„ฑ๋Šฅ ์ตœ์ ํ™”, ๋Œ€๊ทœ๋ชจ Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ**์ด ํ•„์š”ํ•œ ์‚ฐ์—…์— ํ•„์ˆ˜์ ์ธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • ๊ธˆ์œต ์„œ๋น„์Šค โ€“ ๊ทœ์ œ ํ”„๋ ˆ์ž„์›Œํฌ ์ค€์ˆ˜๋ฅผ ๋ณด์žฅํ•˜๊ณ  ์‚ฌ๊ธฐ์„ฑ ์ฝ”๋”ฉ ๊ด€ํ–‰์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜๋ฃŒ โ€“ ๋ฏผ๊ฐํ•œ ํ™˜์ž ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๊ณ  ์˜๋ฃŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ณด์•ˆ ๊ทœ์ •์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ์ˆ  ํšŒ์‚ฌ โ€“ ๋Œ€๊ทœ๋ชจ Python ๊ธฐ๋ฐ˜ ์†Œํ”„ํŠธ์›จ์–ด ์†”๋ฃจ์…˜์˜ ์„ฑ๋Šฅ๊ณผ ๋ณด์•ˆ์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ •๋ถ€ ๊ธฐ๊ด€ โ€“ ์‚ฌ์ด๋ฒ„ ๋ณด์•ˆ ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์นจํ•ด๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์†Œ๋งค ๋ฐ ์ „์ž ์ƒ๊ฑฐ๋ž˜ โ€“ ๊ฒฐ์ œ ์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ ๋ฐ API์˜ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌํ˜„ ๋ฐ ํ†ตํ•ฉ

  • **์ตœ์†Œํ•œ์˜ ์‹œ์Šคํ…œ ์ข…์†์„ฑ**์œผ๋กœ ๋ช‡ ์‹œ๊ฐ„ ๋‚ด์— ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.
  • **GitHub, GitLab, Bitbucket, Jenkins ๋ฐ ๊ธฐํƒ€ CI/CD ๋„๊ตฌ**์™€ ์™„๋ฒฝํ•˜๊ฒŒ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ง€์†์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•ด **์ „์ฒด ๋ฐ ์ฆ๋ถ„ ์ฝ”๋“œ ์Šค์บ”**์„ ๋ชจ๋‘ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • **์ž๋™ ์‹คํ–‰**์„ ์œ„ํ•ด ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ ํŒ€์˜ ์ˆ˜๋™ ์ž‘์—… ๋ถ€๋‹ด์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Pylint

pylint ์ •์  ์ฝ”๋“œ ๋ถ„์„

Pylint๋Š” Python ์ฝ”๋“œ ํ’ˆ์งˆ๊ณผ ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ๊ฐ•ํ™”ํ•˜๋„๋ก ์„ค๊ณ„๋œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ตฌ๋ฌธ ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ์ฝ”๋”ฉ ํ‘œ์ค€์„ ์ ์šฉํ•˜๊ณ , ์‹คํ–‰ ์ „์— ๋น„ํšจ์œจ์„ฑ์„ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์ค‘๋ณต ๋ณ€์ˆ˜, ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ, ๋ณต์žกํ•œ ํ‘œํ˜„์‹๊ณผ ๊ฐ™์€ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ Pylint๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ Python ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๋”ฐ๋ฅด๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ํ’ˆ์งˆ ์ ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜์—ฌ ํŒ€์ด ๊ฐ€๋…์„ฑ์„ ๊ฐœ์„ ํ•˜๊ณ , ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ค„์ด๊ณ , ๊ฐœ๋ฐœ ํŒ€๊ณผ ํ”„๋กœ์ ํŠธ์—์„œ ์ผ๊ด€๋œ ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • ํฌ๊ด„์ ์ธ ์ •์  ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์˜ค๋ฅ˜, ์ž˜๋ชป๋œ ๊ด€ํ–‰ ๋ฐ ์ฝ”๋“œ ์•…์šฉ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • PEP 8 ์ค€์ˆ˜๋ฅผ ๊ฐ•ํ™”ํ•˜์—ฌ ํ†ต์ผ๋œ ํ˜•์‹๊ณผ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ฅธ ๊ฐœ์„  ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ์ˆซ์žํ˜• ์ฝ”๋“œ ํ’ˆ์งˆ ์ ์ˆ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋Šฅํ•œ ๊ทœ์น™ ๊ตฌ์„ฑ์„ ํ†ตํ•ด ํŒ€์€ ํŠน์ • ํ”„๋กœ์ ํŠธ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž๊ฒŒ ๊ฒ€์‚ฌ๋ฅผ ๋งž์ถคํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Jenkins, GitHub Actions ๋ฐ ๊ธฐํƒ€ CI/CD ๋„๊ตฌ์™€ ํ†ตํ•ฉ๋˜์–ด ์ž๋™ํ™”๋œ ๋ถ„์„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„ํšจ์œจ์ ์ธ ๋ฃจํ”„, ์ค‘๋ณต๋œ ๊ณ„์‚ฐ, ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์„  ์˜์—ญ

Pylint์˜ ์—„๊ฒฉํ•œ ๊ทœ์น™ ์„ธํŠธ๋Š” ๋งŽ์€ ์ˆ˜์˜ ๊ฒฝ๊ณ ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐœ๋ฐœ์ž๋ฅผ ์••๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒ€์€ ์ข…์ข… ์ค‘์š”ํ•˜์ง€ ์•Š์€ ์•Œ๋ฆผ์„ ํ•„ํ„ฐ๋งํ•˜๊ณ  ๋…ธ์ด์ฆˆ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ๊ตฌ์„ฑ์„ ๋ฏธ์„ธ ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ์‚ฌ์šฉ์ž ์ง€์ •์ด ์—†์œผ๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ์‹ค์ œ ์ฝ”๋“œ ๊ฐœ์„ ์— ์ง‘์ค‘ํ•˜๋Š” ๋Œ€์‹  ์‚ฌ์†Œํ•œ ์Šคํƒ€์ผ ์œ„๋ฐ˜์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Pylint๋Š” ์ฝ”๋“œ ์Šคํƒ€์ผ ์ ์šฉ์— ๋›ฐ์–ด๋‚˜์ง€๋งŒ, ๊ธฐ๋ณธ ์ œ๊ณต ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ ํƒ์ง€ ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ์‹ฌ์ธต์ ์ธ ๋ณด์•ˆ ๋ถ„์„์ด ํ•„์š”ํ•œ ํ”„๋กœ์ ํŠธ๋Š” ํฌ๊ด„์ ์ธ ๋ณดํ˜ธ๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Pylint์˜ ๋ถ„์„์€ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŽ์ด ์†Œ๋ชจํ•  ์ˆ˜ ์žˆ์–ด ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹คํ–‰ ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์„ฑ๋Šฅ ์ œ์•ฝ์ด ์—„๊ฒฉํ•œ ํ”„๋กœ์ ํŠธ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Pylint

Pylint๋Š” Python ์ฝ”๋“œ ํ’ˆ์งˆ๊ณผ ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ๊ฐ•ํ™”ํ•˜๋„๋ก ์„ค๊ณ„๋œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ตฌ๋ฌธ ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ์ฝ”๋”ฉ ํ‘œ์ค€์„ ์ ์šฉํ•˜๊ณ , ์‹คํ–‰ ์ „์— ๋น„ํšจ์œจ์„ฑ์„ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์ค‘๋ณต ๋ณ€์ˆ˜, ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ, ๋ณต์žกํ•œ ํ‘œํ˜„์‹๊ณผ ๊ฐ™์€ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ Pylint๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ Python ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๋”ฐ๋ฅด๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ํ’ˆ์งˆ ์ ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜์—ฌ ํŒ€์ด ๊ฐ€๋…์„ฑ์„ ๊ฐœ์„ ํ•˜๊ณ , ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ค„์ด๊ณ , ๊ฐœ๋ฐœ ํŒ€๊ณผ ํ”„๋กœ์ ํŠธ์—์„œ ์ผ๊ด€๋œ ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • ํฌ๊ด„์ ์ธ ์ •์  ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์˜ค๋ฅ˜, ์ž˜๋ชป๋œ ๊ด€ํ–‰ ๋ฐ ์ฝ”๋“œ ์•…์šฉ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • PEP 8 ์ค€์ˆ˜๋ฅผ ๊ฐ•ํ™”ํ•˜์—ฌ ํ†ต์ผ๋œ ํ˜•์‹๊ณผ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ฅธ ๊ฐœ์„  ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ์ˆซ์žํ˜• ์ฝ”๋“œ ํ’ˆ์งˆ ์ ์ˆ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋Šฅํ•œ ๊ทœ์น™ ๊ตฌ์„ฑ์„ ํ†ตํ•ด ํŒ€์€ ํŠน์ • ํ”„๋กœ์ ํŠธ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž๊ฒŒ ๊ฒ€์‚ฌ๋ฅผ ๋งž์ถคํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Jenkins, GitHub Actions ๋ฐ ๊ธฐํƒ€ CI/CD ๋„๊ตฌ์™€ ํ†ตํ•ฉ๋˜์–ด ์ž๋™ํ™”๋œ ๋ถ„์„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„ํšจ์œจ์ ์ธ ๋ฃจํ”„, ์ค‘๋ณต๋œ ๊ณ„์‚ฐ, ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์„  ์˜์—ญ

Pylint์˜ ์—„๊ฒฉํ•œ ๊ทœ์น™ ์„ธํŠธ๋Š” ๋งŽ์€ ์ˆ˜์˜ ๊ฒฝ๊ณ ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐœ๋ฐœ์ž๋ฅผ ์••๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒ€์€ ์ข…์ข… ์ค‘์š”ํ•˜์ง€ ์•Š์€ ์•Œ๋ฆผ์„ ํ•„ํ„ฐ๋งํ•˜๊ณ  ๋…ธ์ด์ฆˆ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ๊ตฌ์„ฑ์„ ๋ฏธ์„ธ ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ์‚ฌ์šฉ์ž ์ง€์ •์ด ์—†์œผ๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ์‹ค์ œ ์ฝ”๋“œ ๊ฐœ์„ ์— ์ง‘์ค‘ํ•˜๋Š” ๋Œ€์‹  ์‚ฌ์†Œํ•œ ์Šคํƒ€์ผ ์œ„๋ฐ˜์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋” ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Pylint๋Š” ์ฝ”๋“œ ์Šคํƒ€์ผ ์ ์šฉ์— ๋›ฐ์–ด๋‚˜์ง€๋งŒ, ๊ธฐ๋ณธ ์ œ๊ณต ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ ํƒ์ง€ ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ์‹ฌ์ธต์ ์ธ ๋ณด์•ˆ ๋ถ„์„์ด ํ•„์š”ํ•œ ํ”„๋กœ์ ํŠธ๋Š” ํฌ๊ด„์ ์ธ ๋ณดํ˜ธ๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Pylint์˜ ๋ถ„์„์€ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŽ์ด ์†Œ๋ชจํ•  ์ˆ˜ ์žˆ์–ด ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹คํ–‰ ์‹œ๊ฐ„์ด ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์„ฑ๋Šฅ ์ œ์•ฝ์ด ์—„๊ฒฉํ•œ ํ”„๋กœ์ ํŠธ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฒ€์ •

๋ธ”๋ž™ ํŒŒ์ด์ฌ ์ฝ”๋“œ ๋ถ„์„

Black์€ ํ”„๋กœ์ ํŠธ ์ „๋ฐ˜์— ๊ฑธ์ณ ์ผ๊ด€๋œ ์ฝ”๋”ฉ ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๋Š” ๋งค์šฐ ๋…๋‹จ์ ์ธ Python ์ฝ”๋“œ ํฌ๋งคํ„ฐ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด ๋ฆฐํ„ฐ์™€ ๋‹ฌ๋ฆฌ Black์€ ์—„๊ฒฉํ•œ ํฌ๋งคํŒ… ๊ทœ์น™์„ ์ค€์ˆ˜ํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ํฌ๋งคํŒ…ํ•˜์—ฌ ํŒ€ ๋‚ด์—์„œ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ๋‘˜๋Ÿฌ์‹ผ ๋…ผ์Ÿ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๊ท ์ผํ•œ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•จ์œผ๋กœ์จ ์ˆ˜๋™ ํฌ๋งคํŒ…์˜ ํ•„์š”์„ฑ์„ ์ค„์ด๋Š” ๋™์‹œ์— ์ฝ”๋“œ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€ ๊ด€๋ฆฌ์„ฑ์„ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค. Black์€ ์˜คํ”ˆ ์†Œ์Šค์™€ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ ๋ชจ๋‘์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜์–ด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ˆ˜๋™ ๊ฐœ์ž… ์—†์ด ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๋”ฐ๋ฅด๋Š” "๋ธ”๋ž™ ์ฒ˜๋ฆฌ๋œ" ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • ์ผ๊ด€๋œ ์Šคํƒ€์ผ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Python ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ํฌ๋งทํ•ฉ๋‹ˆ๋‹ค.
  • ์—„๊ฒฉํ•˜๊ณ  ๋…๋‹จ์ ์ธ ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜์—ฌ ์ˆ˜๋™์ ์ธ ์„œ์‹ ๊ฒฐ์ •์˜ ํ•„์š”์„ฑ์„ ์ค„์ž…๋‹ˆ๋‹ค.
  • Git ์‚ฌ์ „ ์ปค๋ฐ‹ ํ›„ํฌ, CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๋ฐ ์ธ๊ธฐ ์žˆ๋Š” IDE์™€ ์›ํ™œํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด ์ž๋™ ์ค„ ๋ฐ”๊ฟˆ ๋ฐ ์ฝ”๋“œ ์žฌ๊ตฌ์„ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ๋™์ผํ•œ ์„œ์‹ ๊ทœ์น™์„ ๋”ฐ๋ฅด๋„๋ก ํ•˜์—ฌ ์ฝ”๋“œ ๊ฒ€ํ†  ์†๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค.
  • ๋‹ค์–‘ํ•œ Python ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋ฏ€๋กœ ์žฅ๊ธฐ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•œ ์•ˆ์ •์ ์ธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

๊ณ ๋ คํ•ด์•ผ ํ•  ์ œํ•œ ์‚ฌํ•ญ

Black์€ ์ผ๊ด€๋œ ์ฝ”๋”ฉ ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜์ง€๋งŒ, ์—„๊ฒฉํ•œ ์„œ์‹ ๊ทœ์น™์€ ๋ชจ๋“  ๊ฐœ๋ฐœ์ž์˜ ์„ ํ˜ธ๋„์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ •์  ๋ถ„์„ ๋„๊ตฌ์™€ ๋‹ฌ๋ฆฌ ์ฝ”๋“œ ํ’ˆ์งˆ, ๋ณต์žก์„ฑ ๋˜๋Š” ๋ณด์•ˆ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ฆฐํŒ…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํฌ๊ด„์ ์ธ ๋ถ„์„์„ ์œ„ํ•ด Flake8 ๋˜๋Š” Pylint์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Black์€ ๋˜ํ•œ ์„œ์‹ ์ง€์ •์— ๋Œ€ํ•œ "์ผ๋ฅ ์ " ์ ‘๊ทผ ๋ฐฉ์‹์„ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ œํ•œ๋œ ์‚ฌ์šฉ์ž ์ง€์ • ์˜ต์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ณด๋‹ค ์œ ์—ฐํ•œ ์„œ์‹ ์ง€์ • ์ œ์–ด๋ฅผ ์›ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋Š” ์ œํ•œ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋งŽ์€ ๊ธฐ์—ฌ์ž๊ฐ€ ์žˆ๋Š” ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๊ธฐ์กด ์„œ์‹ ์ง€์ • ํ‘œ์ค€์ด Black์˜ ๊ฐ•์ œ ์Šคํƒ€์ผ๊ณผ ๋‹ค๋ฅผ ๊ฒฝ์šฐ Black์œผ๋กœ ์ „ํ™˜ํ•˜๋ ค๋ฉด ์ƒ๋‹นํ•œ ์ ์‘์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ดํ”ผ

mypy ํŒŒ์ด์ฌ ์ฝ”๋“œ ๋ถ„์„๊ธฐ

Mypy๋Š” Python์šฉ ์ •์  ์œ ํ˜• ๊ฒ€์‚ฌ๊ธฐ๋กœ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋Ÿฐํƒ€์ž„ ์ „์— ์œ ํ˜• ๊ด€๋ จ ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. Mypy๋Š” ์„ ํƒ์  ์œ ํ˜• ์ฃผ์„์„ ๋„์ž…ํ•˜์—ฌ ์ฝ”๋“œ ์•ˆ์ •์„ฑ๊ณผ ์œ ์ง€ ๊ด€๋ฆฌ์„ฑ์„ ํ–ฅ์ƒ์‹œ์ผœ Python์„ ๋” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Python ํ”„๋กœ์ ํŠธ์™€ ์™„๋ฒฝํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜์–ด ์ž ์žฌ์ ์ธ ์œ ํ˜• ๋ถˆ์ผ์น˜, ๋ˆ„๋ฝ๋œ ์ธ์ˆ˜ ๋ฐ ์ž˜๋ชป๋œ ๋ฐ˜ํ™˜ ์œ ํ˜•์— ๋Œ€ํ•œ ์กฐ๊ธฐ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Mypy๋Š” ๋ฏธ๋ฌ˜ํ•œ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์œ ํ˜• ์•ˆ์ „์„ฑ์ด ํ•„์ˆ˜์ ์ธ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • ๋Ÿฐํƒ€์ž„ ์ „์— ์ •์  ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์œ ํ˜• ๋ถˆ์ผ์น˜๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ ์ง„์ ์ธ ํƒ€์ดํ•‘์„ ์ง€์›ํ•˜๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์œ ํ˜• ํžŒํŠธ๋ฅผ ์ ์ง„์ ์œผ๋กœ ์ฑ„ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•จ์ˆ˜์™€ ๋ชจ๋“ˆ ์ „์ฒด์— ๊ฑธ์ณ ์œ ํ˜• ์ผ๊ด€์„ฑ์„ ์ ์šฉํ•˜์—ฌ ์ฝ”๋“œ ์œ ์ง€ ๊ด€๋ฆฌ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
  • CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ํ†ตํ•ฉํ•˜์—ฌ ๊ฐœ๋ฐœ ์ดˆ๊ธฐ์— ์œ ํ˜• ๊ด€๋ จ ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•ฉ๋‹ˆ๋‹ค.
  • Python์˜ ๋‚ด์žฅ๋œ ์œ ํ˜• ํžŒํŠธ ๋ฐ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.
  • Flake8 ๋ฐ Pylint์™€ ๊ฐ™์€ ๋ฆฐํ„ฐ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์—ฌ ํฌ๊ด„์ ์ธ ์ •์  ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ๋ ค ์‚ฌํ•ญ ๋ฐ ๊ณผ์ œ

Mypy๋Š” ์ฝ”๋“œ ์•ˆ์ „์„ฑ์„ ๊ฐ•ํ™”ํ•˜์ง€๋งŒ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์œ ํ˜• ํžŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋Š” ํŠนํžˆ ์›๋ž˜ ์œ ํ˜• ์ฃผ์„์œผ๋กœ ์„ค๊ณ„๋˜์ง€ ์•Š์€ ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ฒฝ์šฐ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ๊ฒ€์‚ฌ์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ํŒ€์€ Mypy๋ฅผ ์ฑ„ํƒํ•  ๋•Œ ํ•™์Šต ๊ณก์„ ์— ์ง๋ฉดํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” ๋” ์—„๊ฒฉํ•œ ์ฝ”๋”ฉ ๊ทœ์น™์„ ์ ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Mypy๋Š” ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•˜๊ฑฐ๋‚˜ ์ฝ”๋“œ ์Šคํƒ€์ผ ๊ทœ์น™์„ ์ ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์™„์ „ํ•œ ๋ถ„์„์„ ์œ„ํ•ด ๊ธฐ์กด ๋ฆฐํ„ฐ ๋ฐ ๋ณด์•ˆ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ผ๋ถ€ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—๋Š” ์ „์ฒด ์œ ํ˜• ์ฃผ์„์ด ์—†์–ด ํŠน์ • ๊ฒฝ์šฐ์— ๋ถˆ์™„์ „ํ•˜๊ฑฐ๋‚˜ ๋ถ€์ •ํ™•ํ•œ ์œ ํ˜• ๊ฒ€์‚ฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฐ์ 

Bandit์€ Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ์„ค๊ณ„๋œ ๋ณด์•ˆ ์ค‘์‹ฌ ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ž๊ฒฉ ์ฆ๋ช…, SQL ์ฃผ์ž… ๋ฐ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํ•จ์ˆ˜ ์‚ฌ์šฉ๊ณผ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ์— ๋Œ€ํ•ด ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์Šค์บ”ํ•ฉ๋‹ˆ๋‹ค. Bandit์„ ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์— ํ†ตํ•ฉํ•จ์œผ๋กœ์จ ํŒ€์€ ๋ณด์•ˆ ๊ฒฐํ•จ์„ ์กฐ๊ธฐ์— ์‹๋ณ„ํ•˜๊ณ  ์ˆ˜์ •ํ•˜์—ฌ ๋ณด์•ˆ ์นจํ•ด ์œ„ํ—˜์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Bandit์€ ๋ณด์•ˆ์— ๋ฏผ๊ฐํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด์•ˆ ๋ฐ ๊ทœ์ • ์ค€์ˆ˜๋ฅผ ์šฐ์„ ์‹œํ•˜๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํ•„์ˆ˜์ ์ธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐ ์ทจ์•ฝํ•œ ์•”ํ˜ธํ™” ๊ด€ํ–‰์„ ํฌํ•จํ•œ ์ผ๋ฐ˜์ ์ธ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ์ž ์žฌ์ ์ธ ์ฃผ์ž… ์œ„ํ—˜์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์ •์  ์ฝ”๋“œ ์Šค์บ๋‹์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์‹ฌ๊ฐ๋„ ์ˆ˜์ค€์„ ํฌํ•จํ•œ ์ž์„ธํ•œ ๋ณด์•ˆ ๋ณด๊ณ ์„œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์ˆ˜์ • ์‚ฌํ•ญ์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฐํฌ ์ „ ๋ณด์•ˆ ๊ฒ€์‚ฌ๋ฅผ ์‹œํ–‰ํ•˜๊ธฐ ์œ„ํ•ด CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.
  • ํŠน์ • ํ”„๋กœ์ ํŠธ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž์ถฐ ๋ณด์•ˆ ์ •์ฑ…์„ ์กฐ์ •ํ•˜๊ธฐ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ๊ทœ์น™ ๊ตฌ์„ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ๋ฆฐํ„ฐ ๋ฐ ์ •์  ๋ถ„์„ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์—ฌ ํฌ๊ด„์ ์ธ ์ฝ”๋“œ ๊ฒ€ํ† ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ•œ๊ณ„์™€ ๋„์ „

Bandit์€ ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ์„ ํƒ์ง€ํ•˜๋Š” ๋ฐ ํšจ๊ณผ์ ์ด์ง€๋งŒ, ์ฃผ๋กœ ์ •์  ๋ถ„์„์— ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ๋Ÿฐํƒ€์ž„ ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๋™์  ๋ณด์•ˆ ํ…Œ์ŠคํŠธ์™€ ์ˆ˜๋™ ์ฝ”๋“œ ๊ฒ€ํ† ๋กœ ๋ณด์™„ํ•˜์—ฌ ๋ณด๋‹ค ์ฒ ์ €ํ•œ ๋ณด์•ˆ ํ‰๊ฐ€๋ฅผ ๋‹ฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Bandit์˜ ํšจ๊ณผ๋Š” ์ž˜ ์œ ์ง€ ๊ด€๋ฆฌ๋œ ๊ทœ์น™ ์„ธํŠธ์— ๋‹ฌ๋ ค ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ƒˆ๋กœ์šด ์œ„ํ˜‘์— ๋Œ€์ฒ˜ํ•˜๊ธฐ ์œ„ํ•ด ์ž์ฃผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๊ฑฐ์ง“ ์–‘์„ฑ ๋ฐ˜์‘์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๋Š” ์ตœ์ ์˜ ๊ฒฐ๊ณผ๋ฅผ ์œ„ํ•ด ๊ตฌ์„ฑ์„ ๋ฏธ์„ธ ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ๋ณด์•ˆ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋Š” ๊ทœ์ • ์ค€์ˆ˜ ํ‘œ์ค€์„ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ด๋ผ์ดํŠธ

Pyright๋Š” Microsoft์—์„œ ๊ฐœ๋ฐœํ•œ Python์šฉ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ธ ์ •์  ์œ ํ˜• ๊ฒ€์‚ฌ๊ธฐ์ž…๋‹ˆ๋‹ค. ๊ณ ๊ธ‰ ์œ ํ˜• ์ถ”๋ก ์„ ์ œ๊ณตํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค ์ดˆ๊ธฐ์— ์œ ํ˜• ๊ด€๋ จ ์˜ค๋ฅ˜๋ฅผ ํฌ์ฐฉํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. Pyright๋Š” ๋‹ค๋ฅธ ์œ ํ˜• ๊ฒ€์‚ฌ๊ธฐ์— ๋น„ํ•ด ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค. ์ ์ง„์ ์ธ ํƒ€์ดํ•‘์„ ์ง€์›ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์›ํ•˜๋Š” ์†๋„๋กœ ์œ ํ˜• ํžŒํŠธ๋ฅผ ์ฑ„ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Pyright๋ฅผ ์›Œํฌํ”Œ๋กœ์— ํ†ตํ•ฉํ•˜๋ฉด ํŒ€์€ ๋‹ค์–‘ํ•œ Python ๋ฒ„์ „์—์„œ ์ฝ”๋“œ ์•ˆ์ •์„ฑ, ์œ ์ง€ ๊ด€๋ฆฌ์„ฑ ๋ฐ ํ˜ธํ™˜์„ฑ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•œ ์œ ํ˜• ์ถ”๋ก ์„ ํ†ตํ•ด ์ •์  ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ ์ง„์ ์ธ ํƒ€์ดํ•‘์„ ์ง€์›ํ•˜์—ฌ ์œ ํ˜• ํžŒํŠธ์˜ ์ ์ง„์ ์ธ ์ฑ„ํƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • Visual Studio Code ๋ฐ ๋‹ค๋ฅธ ํŽธ์ง‘๊ธฐ์™€ ์™„๋ฒฝํ•˜๊ฒŒ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.
  • ์†๋„๊ฐ€ ์ตœ์ ํ™”๋˜์–ด ๋Œ€๊ทœ๋ชจ Python ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • ์œ ํ˜• ๋ถˆ์ผ์น˜, ์ž˜๋ชป๋œ ํ•จ์ˆ˜ ์„œ๋ช…, ๋ˆ„๋ฝ๋œ ์ธ์ˆ˜๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ํ–ฅ์ƒ๋œ ๋””๋ฒ„๊น…์„ ์œ„ํ•ด ์ž์„ธํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์™€ ์œ ํ˜• ์ œ์•ˆ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ณผ์ œ ๋ฐ ๊ณ ๋ ค ์‚ฌํ•ญ

Pyright๋Š” ํ›Œ๋ฅญํ•œ ํƒ€์ž… ์ฒด์ปค์ด์ง€๋งŒ, ์—„๊ฒฉํ•œ ํƒ€์ž… ์ ์šฉ์œผ๋กœ ์ธํ•ด ๊ฐœ๋ฐœ์ž๋Š” ํŠนํžˆ ๋™์  ํƒ€์ดํ•‘์ด ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์ฝ”๋“œ๋ฅผ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ๋ฆฌํŒฉํ† ๋งํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ž… ํžŒํŠธ์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ํŒ€์—์„œ๋Š” ๊ทœ์น™์— ์ ์‘ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Pyright๋Š” ์œ ํ˜• ๊ฒ€์‚ฌ์—๋งŒ ์ง‘์ค‘ํ•˜๋ฉฐ ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ์ด๋‚˜ ์Šคํƒ€์ผ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํฌ๊ด„์ ์ธ ์ •์  ๋ถ„์„์„ ์›ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋Š” Pylint๋‚˜ Bandit๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๋„๊ตฌ์™€ ํŽ˜์–ด๋งํ•˜์—ฌ ์ „์ฒด ์ฝ”๋“œ ํ’ˆ์งˆ ๋ฒ”์œ„๋ฅผ ๋ณด์žฅํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ดํƒ€์ž…

Pytype์€ Google์—์„œ ๊ฐœ๋ฐœํ•œ ์ •์  ์œ ํ˜• ์ถ”๋ก  ๋„๊ตฌ๋กœ, ๋ช…์‹œ์  ์œ ํ˜• ์ฃผ์„ ์—†์ด๋„ Python ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์œ ํ˜• ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” Python์˜ ๋™์  ํŠน์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ์œ ํ˜• ๊ฒ€์‚ฌ์˜ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Pytype์€ ์‹ฌ์ธต ์ฝ”๋“œ ๋ถ„์„์„ ํ™œ์šฉํ•˜์—ฌ ์œ ํ˜• ๋ถˆ์ผ์น˜, ์ž˜๋ชป๋œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฐ˜ํ™˜ ๊ฐ’์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ๊ด‘๋ฒ”์œ„ํ•œ ์ˆ˜๋™ ์ฃผ์„ ์—†์ด๋„ ๊ฐ•๋ ฅํ•œ ์œ ํ˜• ๊ฒ€์ฆ์ด ํ•„์š”ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • ๋ช…์‹œ์ ์ธ ์œ ํ˜• ํžŒํŠธ๊ฐ€ ํ•„์š” ์—†์ด ์œ ํ˜• ์ถ”๋ก ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž˜๋ชป๋œ ํ•จ์ˆ˜ ํ˜ธ์ถœ, ๋ฐ˜ํ™˜ ์œ ํ˜• ๋ถˆ์ผ์น˜, ๋ณ€์ˆ˜ ์œ ํ˜• ๋ถˆ์ผ์น˜๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ๋ฌธ์„œํ™”๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ž๋™์œผ๋กœ ์œ ํ˜• ์ฃผ์„์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์œ ํ˜•์ด ์ง€์ •๋˜์ง€ ์•Š์€ Python ํ”„๋กœ์ ํŠธ์™€ ๋ถ€๋ถ„์ ์œผ๋กœ ์œ ํ˜•์ด ์ง€์ •๋œ Python ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž๋™ํ™”๋œ ์œ ํ˜• ๊ฒ€์ฆ์„ ์œ„ํ•ด CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.
  • ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ž ์žฌ์ ์ธ ์œ ํ˜• ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ž ์žฌ์  ํ•œ๊ณ„

Pytype์€ ๊ฐ•๋ ฅํ•œ ์œ ํ˜• ์ถ”๋ก ์„ ์ œ๊ณตํ•˜์ง€๋งŒ ๋ณต์žกํ•œ ๋™์  ์ฝ”๋“œ์—์„œ ํ•ญ์ƒ ์œ ํ˜•์„ ์ •ํ™•ํ•˜๊ฒŒ ์ถ”๋ก ํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๊ฑฐ์ง“ ์–‘์„ฑ ๋˜๋Š” ์˜ค๋ฅ˜ ๋ˆ„๋ฝ์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ๋™์ ์ธ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋Š” ๋ช…์‹œ์  ์œ ํ˜• ํžŒํŠธ๋กœ ๋ณด์™„ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Pytype์€ ๋ณด์•ˆ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์ •์  ๋ถ„์„์ด ํ•„์š”ํ•œ ํŒ€์€ ๋ณด์•ˆ ๊ฐ์‚ฌ๋ฅผ ์œ„ํ•ด Bandit ๋˜๋Š” ์ฝ”๋“œ ํฌ๋งทํŒ…์„ ์œ„ํ•ด Black๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๋„๊ตฌ์™€ ๊ฒฐํ•ฉํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ„๋ฆฌ

isort๋Š” import ๋ฌธ์„ ์ž๋™์œผ๋กœ ์ •๋ ฌํ•˜๊ณ  ์ •๋ฆฌํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ์ „์ฒด์—์„œ ์ผ๊ด€์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ๋ณด์žฅํ•˜๋Š” Python ์œ ํ‹ธ๋ฆฌํ‹ฐ์ž…๋‹ˆ๋‹ค. ์ •์˜๋œ ์ˆœ์„œ๋กœ import๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜์—ฌ isort๋Š” ์ฝ”๋“œ ์Šคํƒ€์ผ์˜ ๋ถˆํ•„์š”ํ•œ ๋ณ€ํ˜•์„ ์ œ๊ฑฐํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ํŽธ์ง‘๊ธฐ, ๋ฒ„์ „ ์ œ์–ด ์‹œ์Šคํ…œ ๋ฐ CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜์–ด ํ˜‘์—… ํ”„๋กœ์ ํŠธ์—์„œ ๊นจ๋—ํ•œ ์ฝ”๋”ฉ ํ‘œ์ค€์„ ์ ์šฉํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • ํ”„๋กœ์ ํŠธ ๊ทœ์น™์— ๋”ฐ๋ผ ์ˆ˜์ž… ๋ช…์„ธ์„œ๋ฅผ ์ž๋™์œผ๋กœ ์ •๋ ฌํ•˜๊ณ  ๊ทธ๋ฃนํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ์กด ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋ฉฐ ์‚ฌ์šฉ์ž ์ •์˜ ์ •๋ ฌ ๊ตฌ์„ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • Visual Studio Code ๋ฐ PyCharm๊ณผ ๊ฐ™์€ IDE์™€ ํ†ตํ•ฉ๋˜์–ด ์‹ค์‹œ๊ฐ„ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ตฌ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์ œ์ถœ ์ „์— ๊ฐ€์ ธ์˜ค๊ธฐ ์ •๋ ฌ์„ ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์ „ ์ปค๋ฐ‹ ํ›„ํฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • Black, Flake8 ๋“ฑ ๋‹ค๋ฅธ ์ •์  ๋ถ„์„ ๋„๊ตฌ์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.
  • ์ผ๊ด€๋œ ๊ฐ€์ ธ์˜ค๊ธฐ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•จ์œผ๋กœ์จ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€ ๊ด€๋ฆฌ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

๊ฐœ์„ ์„ ์œ„ํ•œ ์˜์—ญ

isort๋Š” ์ž„ํฌํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ๋งค์šฐ ํšจ๊ณผ์ ์ด์ง€๋งŒ, ๊ทธ ๊ธฐ๋Šฅ์€ ๋ฌธ์žฅ์„ ์ •๋ ฌํ•˜๊ณ  ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ๊ตญํ•œ๋ฉ๋‹ˆ๋‹ค. ๋…ผ๋ฆฌ ์˜ค๋ฅ˜, ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ ๋˜๋Š” ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ํ˜„์ƒ๊ณผ ๊ฐ™์€ ๋” ๊นŠ์€ ์ฝ”๋“œ ํ’ˆ์งˆ ๋ฌธ์ œ๋Š” ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ํŠน์ • ๊ฐ€์ ธ์˜ค๊ธฐ ๊ตฌ์กฐ๊ฐ€ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋Š” isort์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ํŒ€ ์„ ํ˜ธ๋„์— ๋งž์ถ”๊ธฐ ์œ„ํ•ด ์ˆ˜๋™ ๊ตฌ์„ฑ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ํŠน์ • ๊ฐ€์ ธ์˜ค๊ธฐ์˜ ์›์น˜ ์•Š๋Š” ์žฌ์ •๋ ฌ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์„ค์ •์„ ๋ฏธ์„ธ ์กฐ์ •ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ผ๋ˆ

Radon์€ Python ํ”„๋กœ์ ํŠธ์˜ ์ฝ”๋“œ ๋ณต์žก์„ฑ์„ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•œ ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์‚ฌ์ดํด๋กœ๋งคํ‹ฑ ๋ณต์žก์„ฑ, ์œ ์ง€ ๊ด€๋ฆฌ ์ง€์ˆ˜ ๋ฐ ์›์‹œ ๋ฉ”ํŠธ๋ฆญ์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ํ‰๊ฐ€ํ•˜๊ณ  ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. Radon์€ ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•œ ํ•จ์ˆ˜์™€ ๋ชจ๋“ˆ์„ ์‹๋ณ„ํ•˜์—ฌ ๊นจ๋—ํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์šฐ์„ ์‹œํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•œ ํ•จ์ˆ˜๋ฅผ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ˆœํ™˜ ๋ณต์žก๋„๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ํ’ˆ์งˆ์„ ํ‰๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์œ ์ง€๋ณด์ˆ˜์„ฑ ์ง€์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
  • ์ง€์†์ ์ธ ๋ณต์žก์„ฑ ํ‰๊ฐ€๋ฅผ ์œ„ํ•ด CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ์˜ ํ†ตํ•ฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์ˆซ์ž์  ๋ณต์žก์„ฑ ์ ์ˆ˜๊ฐ€ ํฌํ•จ๋œ ์ž์„ธํ•œ ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ํŒ€์ด ์žฅ๊ธฐ์ ์ธ ์ฝ”๋“œ ์ง€์† ๊ฐ€๋Šฅ์„ฑ์„ ์œ„ํ•ด ๋ฆฌํŒฉํ† ๋ง ์ž‘์—…์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
  • Pylint์™€ Black๊ณผ ๊ฐ™์€ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์—ฌ ํฌ๊ด„์ ์ธ ์ •์  ๋ถ„์„ ์›Œํฌํ”Œ๋กœ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ณ ๋ ค ์‚ฌํ•ญ ๋ฐ ๊ณผ์ œ

Radon์€ ๊ท€์ค‘ํ•œ ๋ณต์žก์„ฑ ์ง€ํ‘œ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ๋ณต์žกํ•œ ์ฝ”๋“œ ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•œ ์ง์ ‘์ ์ธ ๊ถŒ์žฅ ์‚ฌํ•ญ์€ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๊ฒฐ๊ณผ๋ฅผ ํ•ด์„ํ•˜๊ณ  ์ ์ ˆํ•œ ๋ฆฌํŒฉํ† ๋ง ์ „๋žต์„ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, Radon์€ ๋ณด์•ˆ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ์ฝ”๋”ฉ ์Šคํƒ€์ผ ํ‘œ์ค€์„ ์ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์ •์  ๋ถ„์„ ์†”๋ฃจ์…˜์ด ํ•„์š”ํ•œ ํŒ€์€ Radon์„ linter ๋ฐ ๋ณด์•ˆ ์ค‘์‹ฌ ๋„๊ตฌ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ํฌ๊ด„์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํƒ๊ด‘ ์ž

Prospector๋Š” ์—ฌ๋Ÿฌ ๋ฆฐํ„ฐ๋ฅผ ๋‹จ์ผ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ง‘๊ณ„ํ•˜์—ฌ ํฌ๊ด„์ ์ธ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” Python ์ •์  ๋ถ„์„ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. Pylint, Mypy, McCabe์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ตฌ๋ฌธ ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ์ฝ”๋”ฉ ํ‘œ์ค€์„ ์ ์šฉํ•˜๊ณ , ๋ณต์žก์„ฑ์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. Prospector๋Š” ํ†ตํ•ฉ ๋ณด๊ณ ์„œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์ฝ”๋“œ ๋ถ„์„์„ ๊ฐ„์†Œํ™”ํ•˜๋ฏ€๋กœ Python ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์ค‘์•™ ์ง‘์ค‘์‹ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•œ ํŒ€์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • Pylint, Pyflakes, McCabe๋ฅผ ํฌํ•จํ•œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฆฐํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ๋„๊ตฌ๋กœ ์ง‘๊ณ„ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ๋ณต์žก์„ฑ, ์œ ์ง€ ๊ด€๋ฆฌ์„ฑ ๋ฐ ๋ณด์•ˆ์„ ์œ„ํ•ด ์‹ฌ์ธต์ ์ธ ์ •์  ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ถ„์„ ์ถœ๋ ฅ์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์„ธ๋ถ€์ ์ธ ๊ทœ์น™ ๊ตฌ์„ฑ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • CI/CD ์›Œํฌํ”Œ๋กœ์™€ ํ†ตํ•ฉ๋˜์–ด ์ž๋™ํ™”๋œ ํ’ˆ์งˆ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ์ •์  ๋ถ„์„ ๋„๊ตฌ์˜ ํ†ต์ฐฐ๋ ฅ์„ ๋‹ด์€ ๋‹จ์ผ ๋ณด๊ณ ์„œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ํŒ€๊ณผ ํ”„๋กœ์ ํŠธ์—์„œ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ด€๋ฆฌ ๊ด€ํ–‰์„ ํ‘œ์ค€ํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

๊ณ ๋ ค ์‚ฌํ•ญ ๋ฐ ๊ณผ์ œ

Prospector๋Š” ์—ฌ๋Ÿฌ ๋ฆฐํ„ฐ์— ๋Œ€ํ•œ ํ†ตํ•ฉ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ๊ฒฝ๊ณ ์™€ ์ œ์•ˆ์˜ ์–‘์ด ๋„ˆ๋ฌด ๋งŽ์•„์„œ ์••๋„์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๋ณด๊ณ ์„œ์—์„œ ๊ณผ๋„ํ•œ ๋…ธ์ด์ฆˆ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์„ฑ์„ ์กฐ์ •ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Prospector๋Š” ๋…๋ฆฝํ˜• linter์™€ ๊ฐ™์ด IDE ๋‚ด๋ถ€์—์„œ ์‹ค์‹œ๊ฐ„ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰์„ ์ฝ”๋“œ ๋ถ„์„๋ณด๋‹ค๋Š” ์ง€์†์ ์ธ ํ†ตํ•ฉ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

SonarQube(ํŒŒ์ด์ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ)

SonarQube๋Š” Python ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์ˆ˜์ค€์˜ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋œ ๊ฐ•๋ ฅํ•œ ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์‹ฌ์ธต์ ์ธ ๋ณด์•ˆ, ์œ ์ง€ ๊ด€๋ฆฌ ๋ฐ ์•ˆ์ •์„ฑ ๋ถ„์„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. SonarQube๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์ง€์†์ ์ธ ๊ฒ€์‚ฌ๋ฅผ ์ง€์›ํ•˜๊ณ  CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜์–ด ํŒ€์ด ์ฝ”๋”ฉ ํ‘œ์ค€์„ ์‹œํ–‰ํ•˜๊ณ  ๋ฐฐํฌ ์ „์— ์ทจ์•ฝ์„ฑ์„ ๊ฐ์ง€ํ•˜๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • ๋ณด์•ˆ ์ทจ์•ฝ์ , ๋ฒ„๊ทธ, ์ฝ”๋“œ ์•…์ทจ๋ฅผ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ •์  ์ฝ”๋“œ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ„ ๊ฒฝ๊ณผ์— ๋”ฐ๋ฅธ Python ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ธฐ ์œ„ํ•œ ์ค‘์•™ ๋Œ€์‹œ๋ณด๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • Jenkins, GitHub Actions ๋ฐ ๊ธฐํƒ€ CI/CD ๋„๊ตฌ์™€ ํ†ตํ•ฉ๋˜์–ด ์ž๋™ํ™”๋œ ๋ถ„์„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์œ ์—ฐ์„ฑ์„ ์œ„ํ•ด ์˜จํ”„๋ ˆ๋ฏธ์Šค ๋ฐ ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๋ฐฐํฌ๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์—…๊ณ„ ์ฝ”๋”ฉ ํ‘œ์ค€ ๋ฐ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฌธ์ œ์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‹ฌ๊ฐ๋„ ๋ถ„๋ฅ˜๋ฅผ ํฌํ•จํ•œ ์ž์„ธํ•œ ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๊ณ ๋ คํ•ด์•ผ ํ•  ์ œํ•œ ์‚ฌํ•ญ

SonarQube๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ด์ง€๋งŒ, ๋ฆฌ์†Œ์Šค ์ง‘์•ฝ์ ์ธ ํŠน์„ฑ์œผ๋กœ ์ธํ•ด ๋นŒ๋“œ ์†๋„๊ฐ€ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠนํžˆ ๋Œ€๊ทœ๋ชจ Python ํ”„๋กœ์ ํŠธ์—์„œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ํšจ์œจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋ ค๋ฉด ์ „์šฉ ์ธํ”„๋ผ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ์†Œ๊ทœ๋ชจ ํŒ€์ด๋‚˜ ์Šคํƒ€ํŠธ์—…์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, SonarQube์˜ ๋ณด์•ˆ ๋ถ„์„ ๊ธฐ๋Šฅ์€ ์ „๋ฌธ ๋ณด์•ˆ ๋„๊ตฌ๋งŒํผ ๊ด‘๋ฒ”์œ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—„๊ฒฉํ•œ ๊ทœ์ • ์ค€์ˆ˜ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์žˆ๋Š” ์กฐ์ง์€ ์ถ”๊ฐ€ ๋ณด์•ˆ ์ค‘์‹ฌ ๋ถ„์„ ์†”๋ฃจ์…˜์œผ๋กœ ๋ณด์™„ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๋จธ๋ฆฌ ์ˆ˜๋ฆฌ

Vulture๋Š” ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ์™€ ์ฃฝ์€ ์ฝ”๋“œ๋ฅผ ๊ฐ์ง€ํ•˜๋„๋ก ์„ค๊ณ„๋œ ๊ฐ€๋ฒผ์šด Python ์ •์  ๋ถ„์„ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ค‘๋ณต๋œ ํ•จ์ˆ˜, ๋ณ€์ˆ˜ ๋ฐ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‹๋ณ„ํ•˜์—ฌ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. Vulture๋Š” ํŠนํžˆ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ณ  ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ์„ ์ค„์ด๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • Python ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜, ๋ณ€์ˆ˜, ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์“ธ๋ชจ์—†๋Š” ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ฐ„์†Œํ™”ํ•˜๊ณ  ์ •๋ฆฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€๋ณ๊ณ  ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—๋„ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
  • ํŠน์ • ์ฝ”๋“œ๋ฒ ์ด์Šค ๋ถ€๋ถ„์„ ์ œ์™ธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ •์˜ ๋ฌด์‹œ ๋ชฉ๋ก์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์†์‰ฌ์šด ์ฝ”๋“œ ์ •๋ฆฌ ๋ฐ ๋ฆฌํŒฉํ† ๋ง์„ ์œ„ํ•œ ์ž์„ธํ•œ ๋ณด๊ณ ์„œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ข…ํ•ฉ์ ์ธ ์›Œํฌํ”Œ๋กœ๋ฅผ ์œ„ํ•ด ๋‹ค๋ฅธ ์ •์  ๋ถ„์„ ๋„๊ตฌ์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

๊ณผ์ œ ๋ฐ ๊ณ ๋ ค ์‚ฌํ•ญ

Vulture๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฐ ๋›ฐ์–ด๋‚˜์ง€๋งŒ ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜, ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ ๋˜๋Š” ์„ฑ๋Šฅ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์‹ฌ์ธต ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๋‹ค๋ฅธ ๋ฆฐํ„ฐ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ ํ’ˆ์งˆ์— ๋Œ€ํ•œ ์ „์ฒด์ ์ธ ๊ทธ๋ฆผ์„ ์–ป์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ Vulture๋Š” ๋ฌธ์ž์—ด ๊ธฐ๋ฐ˜ ๋ฆฌํ”Œ๋ ‰์…˜์„ ํ†ตํ•ด ์ฐธ์กฐ๋˜๋Š” ํ•จ์ˆ˜์™€ ๊ฐ™์ด ๋™์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ์—์„œ ๊ฑฐ์ง“ ์–‘์„ฑ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ์ฝ”๋“œ๊ฐ€ ์‹ค์ˆ˜๋กœ ์ œ๊ฑฐ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋ฉด ์ข…์ข… ์ˆ˜๋™ ๊ฒ€ํ† ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ด์ฝ”๋“œ์Šคํƒ€์ผ

PyCodeStyle์€ ์ด์ „์— PEP8๋กœ ์•Œ๋ ค์กŒ์œผ๋ฉฐ, Python ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์‹œํ–‰ํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘” ์ •์  ๋ถ„์„ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ Python์˜ ๊ณต์‹ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ์ธ PEP 8์„ ์ค€์ˆ˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์—ฌ ์ฝ”๋“œ๋ฒ ์ด์Šค ์ „์ฒด์—์„œ ์ผ๊ด€๋œ ์„œ์‹์„ ์œ ์ง€ํ•˜๋„๋ก ๋•์Šต๋‹ˆ๋‹ค. PyCodeStyle์€ ๊ฐ€๋ณ๊ณ  ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์— ์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊นจ๋—ํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฌ์šด Python ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • PEP 8 ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ๋ผ์ธ์— ๋”ฐ๋ผ Python ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๋“ค์—ฌ์“ฐ๊ธฐ, ๊ฐ„๊ฒฉ, ์ค„ ๊ธธ์ด์˜ ๋ถˆ์ผ์น˜๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€๋ณ๊ณ  ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— IDE์—์„œ ์‹ค์‹œ๊ฐ„ ๋ถ„์„์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • ํŠน์ • ์Šคํƒ€์ผ ๊ทœ์น™์„ ๋ฌด์‹œํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์„ฑ ์˜ต์…˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์ „ ์ปค๋ฐ‹ ํ›„ํฌ ๋ฐ CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ์›ํ™œํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • Flake8 ๋“ฑ ๋‹ค๋ฅธ ๋ฆฐํ„ฐ์™€ ํ†ตํ•ฉํ•ด ๋” ๊ด‘๋ฒ”์œ„ํ•œ ์ฝ”๋“œ ๋ถ„์„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์„ ์„ ์œ„ํ•œ ์˜์—ญ

PyCodeStyle์€ ์„œ์‹ ๊ทœ์น™์„ ์ ์šฉํ•˜๋Š” ๋ฐ ํšจ๊ณผ์ ์ด์ง€๋งŒ, ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜, ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ ๋˜๋Š” ์„ฑ๋Šฅ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ํฌ๊ด„์ ์ธ ์ •์  ๋ถ„์„์„ ์œ„ํ•ด Pylint ๋˜๋Š” Bandit๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, ์ผ๋ถ€ ํŒ€์€ PEP 8์˜ ์—„๊ฒฉํ•œ ๊ทœ์น™์ด ํŠน์ • ํ”„๋กœ์ ํŠธ์—๋Š” ๋„ˆ๋ฌด ์—„๊ฒฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. PyCodeStyle์€ ์‚ฌ์šฉ์ž ์ง€์ • ์ฝ”๋”ฉ ํ‘œ์ค€์— ์ ์‘ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜๋™ ๊ตฌ์„ฑ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ์„ค์ • ํ”„๋กœ์„ธ์Šค์— ๋ณต์žก์„ฑ์ด ๋”ํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ดํ”Œ๋ ˆ์ดํฌ

PyFlakes๋Š” ์Šคํƒ€์ผ ๊ทœ์น™์„ ์ ์šฉํ•˜์ง€ ์•Š๊ณ  ์ฝ”๋“œ์˜ ์˜ค๋ฅ˜๋ฅผ ํƒ์ง€ํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘” Python์šฉ ๊ฒฝ๋Ÿ‰ ์ •์  ๋ถ„์„ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ ์˜ค๋ฅ˜, ์ •์˜๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜ ๋ฐ ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์‹๋ณ„ํ•˜์—ฌ ๊นจ๋—ํ•˜๊ณ  ์˜ค๋ฅ˜ ์—†๋Š” Python ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ธ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. PyFlakes๋Š” ์†๋„์™€ ํšจ์œจ์„ฑ์œผ๋กœ ์œ ๋ช…ํ•˜์—ฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์‹ค์‹œ๊ฐ„ ํ”ผ๋“œ๋ฐฑ์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • ๊ตฌ๋ฌธ ์˜ค๋ฅ˜, ์ •์˜๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜, ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€๋ณ๊ณ  ๋น ๋ฅด๋ฉฐ ๊ฑฐ์˜ ์ฆ‰๊ฐ์ ์ธ ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • PEP 8์ด๋‚˜ ๊ธฐํƒ€ ์ฝ”๋”ฉ ์Šคํƒ€์ผ ๊ทœ์น™์„ ์ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Flake8 ๋“ฑ ๋‹ค๋ฅธ ๋ฆฐํ„ฐ์™€ ์‰ฝ๊ฒŒ ํ†ตํ•ฉ๋˜์–ด ๋” ๊ด‘๋ฒ”์œ„ํ•œ ๋ถ„์„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ž๋™ํ™”๋œ ์˜ค๋ฅ˜ ๊ฐ์ง€์— ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.
  • ์ตœ์†Œํ•œ์˜ ๊ตฌ์„ฑ๋งŒ ํ•„์š”ํ•˜๋ฏ€๋กœ ์–ด๋–ค ํ”„๋กœ์ ํŠธ์—์„œ๋‚˜ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์„ ์„ ์œ„ํ•œ ์˜์—ญ

PyFlakes๋Š” ๊ธฐ๋ณธ ์ฝ”๋”ฉ ์˜ค๋ฅ˜๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฐ ๋›ฐ์–ด๋‚˜์ง€๋งŒ ๋ณด์•ˆ ๊ฐ์‚ฌ, ์„ฑ๋Šฅ ํ”„๋กœํŒŒ์ผ๋ง ๋˜๋Š” ๋ณต์žก์„ฑ ๊ฒ€์‚ฌ์™€ ๊ฐ™์€ ๊ณ ๊ธ‰ ์ •์  ๋ถ„์„ ๊ธฐ๋Šฅ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ๋ณด๋‹ค ์‹ฌ์ธต์ ์ธ ์ฝ”๋“œ ๋ถ„์„์„ ์›ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋Š” PyFlakes๋ฅผ ๋ณด์•ˆ์„ ์œ„ํ•œ Bandit ๋˜๋Š” ๋ณต์žก์„ฑ ์ธก์ •์„ ์œ„ํ•œ Radon๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๋„๊ตฌ๋กœ ๋ณด์™„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ PyFlakes๋Š” ์ฝ”๋”ฉ ์Šคํƒ€์ผ ๊ทœ์น™์„ ์ ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์Šคํƒ€์ผ์˜ ์ผ๊ด€์„ฑ์„ ์›ํ•˜๋Š” ํŒ€์€ Black์ด๋‚˜ PyCodeStyle๊ณผ ๊ฐ™์€ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งฅ์ผ€์ด๋ธŒ

McCabe๋Š” ์‚ฌ์ดํด๋กœ๋งคํ‹ฑ ๋ณต์žก๋„๋ฅผ ์ธก์ •ํ•˜๋Š” Python ์ •์  ๋ถ„์„ ๋„๊ตฌ๋กœ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•œ ํ•จ์ˆ˜์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋ณต์žก๋„ ์ ์ˆ˜๊ฐ€ ๋†’์œผ๋ฉด ์œ ์ง€ ๊ด€๋ฆฌ, ๋””๋ฒ„๊น… ๋˜๋Š” ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋Š” ์˜์—ญ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. McCabe๋ฅผ ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์— ํ†ตํ•ฉํ•˜๋ฉด ํŒ€์€ ๋ณต์žกํ•œ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€ ๊ด€๋ฆฌ์„ฑ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • Python ์ฝ”๋“œ์˜ ์ˆœํ™˜ ๋ณต์žก๋„๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์„ ์‹๋ณ„ํ•˜๊ณ  ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
  • Flake8๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜์–ด ๋ฆฐํŒ…๊ณผ ๋ณต์žก์„ฑ ๊ฒ€์‚ฌ๋ฅผ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•จ์ˆ˜์™€ ๋ฉ”์„œ๋“œ์— ์ˆ˜์น˜์  ๋ณต์žก๋„ ์ ์ˆ˜๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€๋ณ๊ณ  ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์‹œ๊ฐ„ ๋ถ„์„์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ๋ณต์žก์„ฑ ์ž„๊ณ„๊ฐ’.

๊ณผ์ œ ๋ฐ ๊ณ ๋ ค ์‚ฌํ•ญ

McCabe๋Š” ์ฝ”๋“œ ๋ณต์žก์„ฑ์„ ์ธก์ •ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ์˜์—ญ์„ ๋ฆฌํŒฉํ† ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ง€์นจ์€ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๋ณต์žก์„ฑ ์ ์ˆ˜๋ฅผ ํ•ด์„ํ•˜๊ณ  ๋ฆฌํŒฉํ† ๋ง ์ „๋žต์„ ์ง์ ‘ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ McCabe๋Š” ๊ตฌ๋ฌธ ์˜ค๋ฅ˜, ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ ๋˜๋Š” ์„ฑ๋Šฅ ๋น„ํšจ์œจ์„ฑ์— ๋Œ€ํ•ด ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™„์ „ํ•œ ์ •์  ๋ถ„์„ ์†”๋ฃจ์…˜์„ ์ฐพ๋Š” ํŒ€์€ ๋ณด์•ˆ ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•ด Bandit ๋˜๋Š” ๊ตฌ๋ฌธ ๊ฒ€์ฆ์„ ์œ„ํ•ด PyFlakes์™€ ๊ฐ™์€ ๋„๊ตฌ์™€ ํ•จ๊ป˜ McCabe๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋”œ๋ฆฐํŠธ

Dlint๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ผ๋ฐ˜์ ์ธ Python ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ์„ ํƒ์ง€ํ•˜๊ณ  ์™„ํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋ณด์•ˆ ์ค‘์‹ฌ ์ •์  ๋ถ„์„ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. Flake8์„ ์ถ”๊ฐ€ ๋ณด์•ˆ ๊ฒ€์‚ฌ๋กœ ํ™•์žฅํ•˜์—ฌ SQL ์ฃผ์ž…, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์—ญ์ง๋ ฌํ™” ๋ฐ ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ž๊ฒฉ ์ฆ๋ช…๊ณผ ๊ฐ™์€ ๋ณด์•ˆ ๊ฒฐํ•จ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•œ ๋„๊ตฌ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • Python ์ฝ”๋“œ์˜ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ์— ํŠนํ™”๋œ ๋ฆฐํŒ… ๊ทœ์น™์œผ๋กœ Flake8์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ž ์žฌ์ ์ธ SQL ์ฃผ์ž… ์œ„ํ—˜๊ณผ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํ•จ์ˆ˜ ์‚ฌ์šฉ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ์‰ฝ๊ฒŒ ํ†ตํ•ฉ๋˜์–ด ์ž๋™ํ™”๋œ ๋ณด์•ˆ ๋ถ„์„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€๋ณ๊ณ  ํšจ์œจ์ ์ด์–ด์„œ ์ •๊ธฐ์ ์ธ ์Šค์บ”์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ์ •์  ๋ถ„์„ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์—ฌ ํฌ๊ด„์ ์ธ ๋ณด์•ˆ ๋ฒ”์œ„๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ณ ๋ ค ์‚ฌํ•ญ ๋ฐ ๊ณผ์ œ

Dlint๋Š” ๋ณด์•ˆ ์ค‘์‹ฌ ์ •์  ๋ถ„์„์— ํƒ์›”ํ•˜์ง€๋งŒ ์ฝ”๋“œ ํ’ˆ์งˆ, ์œ ์ง€ ๊ด€๋ฆฌ์„ฑ ๋˜๋Š” ๋ณต์žก์„ฑ์— ๋Œ€ํ•œ ์™„์ „ํ•œ ๊ทธ๋ฆผ์„ ์ œ๊ณตํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ํŒ€์€ ์ด๋ฅผ ๋‹ค๋ฅธ ๋ฆฐํŒ… ๋ฐ ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ๊ท ํ˜• ์žกํžŒ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Dlint์˜ ํšจ๊ณผ๋Š” ์ •๊ธฐ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ ๋ณด์•ˆ ๊ทœ์น™ ์„ธํŠธ์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์ฃผ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒˆ๋กœ์šด ๋ณด์•ˆ ์œ„ํ˜‘์„ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๋Š” ์ตœ์ƒ์˜ ๋ณด์•ˆ ๊ด€ํ–‰์— ๋Œ€ํ•ด ๊ณ„์† ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Wemake Python ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ

Wemake Python Styleguide๋Š” Python ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์—„๊ฒฉํ•œ ์ฝ”๋”ฉ ํ‘œ์ค€์„ ์ ์šฉํ•˜๋Š” ์˜๊ฒฌ์ด ์žˆ๋Š” ๋ฆฐํŒ… ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. Flake8์„ ์œ ์ง€ ๊ด€๋ฆฌ์„ฑ, ๋ณต์žก์„ฑ ๋ฐ ๋ชจ๋ฒ” ์‚ฌ๋ก€์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๊ทœ์น™์œผ๋กœ ํ™•์žฅํ•˜์—ฌ ํŒ€์ด ๊ณ ํ’ˆ์งˆ, ์ฝ๊ธฐ ์‰ฝ๊ณ  ์ผ๊ด€๋œ ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • ์ถ”๊ฐ€์ ์ธ ๋ณต์žก์„ฑ๊ณผ ์œ ์ง€ ๊ด€๋ฆฌ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด Flake8์„ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์•…์ทจ, ์•ˆํ‹ฐํŒจํ„ด, ๊ณผ๋„ํ•œ ์ค‘์ฒฉ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ๊น”๋”ํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์žฅ๋ คํ•ฉ๋‹ˆ๋‹ค.
  • CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๋ฐ ๋ฒ„์ „ ์ œ์–ด ์‹œ์Šคํ…œ๊ณผ์˜ ํ†ตํ•ฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์„ค๋ช…๊ณผ ๊ฐœ์„  ์ œ์•ˆ์„ ๋‹ด์€ ์ž์„ธํ•œ ๋ณด๊ณ ์„œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋Šฅํ•œ ๊ทœ์น™ ์„ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒ€์ด ๋„๊ตฌ๋ฅผ ๊ฐ์ž์˜ ํ•„์š”์— ๋งž๊ฒŒ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ ๋ คํ•ด์•ผ ํ•  ์ œํ•œ ์‚ฌํ•ญ

Wemake Python Styleguide์˜ ์—„๊ฒฉํ•œ ๊ทœ์น™์€ ๋งŽ์€ ์ˆ˜์˜ ๊ฒฝ๊ณ ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๋ฅผ ์••๋„ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๊ตฌ์„ฑ ์กฐ์ •์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทœ์น™์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ํŒ€์€ ์ ์‘ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ฝ”๋“œ ๊ตฌ์กฐ์™€ ๊ฐ€๋…์„ฑ์„ ๊ฐœ์„ ํ•˜์ง€๋งŒ ์‹ฌ์ธต์ ์ธ ๋ณด์•ˆ ๋ถ„์„์„ ์ œ๊ณตํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋ณด์•ˆ ์ค‘์‹ฌ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ Bandit ๋˜๋Š” Dlint์™€ ๊ฐ™์€ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ด๋ ˆ

Pyre๋Š” Meta(์ด์ „ Facebook)์—์„œ ๊ฐœ๋ฐœํ•œ Python์šฉ ๋น ๋ฅด๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ •์  ์œ ํ˜• ๊ฒ€์‚ฌ๊ธฐ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์œ ํ˜• ๊ด€๋ จ ์˜ค๋ฅ˜๋ฅผ ์ผ์ฐ ํฌ์ฐฉํ•˜์—ฌ ์ฝ”๋“œ ์•ˆ์ „์„ฑ๊ณผ ์œ ์ง€ ๊ด€๋ฆฌ์„ฑ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. Pyre๋Š” ์„ฑ๋Šฅ์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์–ด ๋Œ€๊ทœ๋ชจ Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ ํ•ฉํ•œ ์„ ํƒ์ž…๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•œ ์ •์  ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ํ˜•์‹ ๋ถˆ์ผ์น˜, ๋ˆ„๋ฝ๋œ ์ธ์ˆ˜, ์ž˜๋ชป๋œ ๋ฐ˜ํ™˜ ์œ ํ˜•์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ ์ง„์ ์ธ ๋„์ž…์„ ์œ„ํ•ด ์ ์ง„์ ์ธ ํƒ€์ดํ•‘์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ด‘๋ฒ”์œ„ํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ฐ–์ถ˜ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์— ์ตœ์ ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๋‚ด์—์„œ ์‹ค์‹œ๊ฐ„ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ง€์†์ ์ธ ์œ ํ˜• ๊ฒ€์ฆ์„ ์œ„ํ•ด CI/CD ์›Œํฌํ”Œ๋กœ์™€ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.

๊ณผ์ œ ๋ฐ ๊ณ ๋ ค ์‚ฌํ•ญ

Pyre๋Š” ๋งค์šฐ ํšจ์œจ์ ์ด์ง€๋งŒ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์œ ํ˜• ์ฃผ์„์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋Š” ์œ ํ˜• ํžŒํŠธ๊ฐ€ ์—†๋Š” ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—„๊ฒฉํ•œ ์œ ํ˜• ์ ์šฉ์œผ๋กœ ์ธํ•ด ์ถ”๊ฐ€ ๋ฆฌํŒฉํ† ๋ง ์ž‘์—…์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Pyre๋Š” ์œ ํ˜• ๊ฒ€์‚ฌ์—๋งŒ ์ง‘์ค‘ํ•˜๋ฉฐ ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ์„ ๋ถ„์„ํ•˜๊ฑฐ๋‚˜ ์Šคํƒ€์ผ ๊ทœ์น™์„ ์ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณด๋‹ค ํฌ๊ด„์ ์ธ ์ •์  ๋ถ„์„ ์›Œํฌํ”Œ๋กœ๋ฅผ ์œ„ํ•ด ๋ฆฐํ„ฐ ๋ฐ ๋ณด์•ˆ ๋„๊ตฌ์™€ ๊ฒฐํ•ฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜คํ† ํ”Œ๋ ˆ์ดํฌ

Autoflake๋Š” Python ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ์™€ ๋ณ€์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ์ œ๊ฑฐํ•˜๋Š” ๊ฐ€๋ฒผ์šด ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•œ ์š”์†Œ๋ฅผ ์ •๋ฆฌํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ๊ฐœ์„ ํ•˜์—ฌ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ฐ„์†Œํ™”ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ ๋ณ€์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.
  • ๋…ผ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ์ฝ”๋“œ๋ฅผ ๋” ๊น”๋”ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Black์ด๋‚˜ isort์™€ ๊ฐ™์€ ํฌ๋งคํ„ฐ์™€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€๋ณ๊ณ  ํšจ์œจ์ ์ด์–ด์„œ ๋น ๋ฅด๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ž๋™ ์ ์šฉ์„ ์œ„ํ•œ ์‚ฌ์ „ ์ปค๋ฐ‹ ํ›„ํฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๊ด€๋œ ์ •๋ฆฌ๋ฅผ ์œ„ํ•ด CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.

๊ฐœ์„ ์„ ์œ„ํ•œ ์˜์—ญ

Autoflake๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘์ง€๋งŒ ๊ตฌ๋ฌธ ๊ฒ€์ฆ, ๋ณด์•ˆ ๊ฒ€์‚ฌ ๋˜๋Š” ๋ณต์žก์„ฑ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๊ธฐ์กด linter์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ๋™์ ์œผ๋กœ ์ฐธ์กฐ๋˜๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์ œ๊ฑฐ๋˜์–ด ์ •ํ™•์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜๋™์œผ๋กœ ๊ฒ€ํ† ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„์‹œ๋ฝ

Bento๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ Python ํ”„๋กœ์ ํŠธ์—์„œ ์ทจ์•ฝ์ ๊ณผ ์ฝ”๋“œ ํ’ˆ์งˆ ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•˜๋„๋ก ๋•๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ๊ฐ€๋ณ๊ณ  ๋ณด์•ˆ ์ค‘์‹ฌ์˜ ์ •์  ๋ถ„์„ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ๋ณด์•ˆ ์œ„ํ—˜, ๋ชจ๋ฒ” ์‚ฌ๋ก€ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ตœ์‹  ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์— ์›ํ™œํ•˜๊ฒŒ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค. Bento๋Š” ๋ณด์•ˆ๊ณผ ํšจ์œจ์„ฑ์„ ์šฐ์„ ์‹œํ•˜๋Š” ํŒ€์— ์ด์ƒ์ ์ด๋ฉฐ, ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๋ผ์ดํ”„์‚ฌ์ดํด ์ดˆ๊ธฐ์— ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • SQL ์ฃผ์ž… ๋ฐ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ํฌํ•จํ•œ ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์ธ ์ฝ”๋”ฉ ์‹ค์ˆ˜์™€ ์œ ์ง€ ๊ด€๋ฆฌ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ •์  ์ฝ”๋“œ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น ๋ฅธ ๋„์ž…์„ ์œ„ํ•ด ์ตœ์†Œํ•œ์˜ ๊ตฌ์„ฑ์œผ๋กœ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์›ํ™œํ•œ ๋ฒ„์ „ ์ œ์–ด ๋ถ„์„์„ ์œ„ํ•ด GitHub, GitLab ๋ฐ Bitbucket๊ณผ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋Šฆ์ถ”์ง€ ์•Š์œผ๋ฉด์„œ๋„ ๊ฑฐ์˜ ์ฆ‰๊ฐ์ ์ธ ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ž๋™ํ™”๋œ ๊ฒ€์‚ฌ๋ฅผ ์ง€์›ํ•˜์—ฌ ๋ณด์•ˆ ๋ฐ ์ฝ”๋“œ ํ’ˆ์งˆ ํ‘œ์ค€์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ๋ ค ์‚ฌํ•ญ ๋ฐ ๊ณผ์ œ

Bento๋Š” ๋ณด์•ˆ ๋ฐ ์ฝ”๋“œ ํ’ˆ์งˆ ๋ถ„์„์— ํšจ๊ณผ์ ์ด์ง€๋งŒ ์‹ฌ์ธต์ ์ธ ์„ฑ๋Šฅ ํ”„๋กœํŒŒ์ผ๋ง์ด๋‚˜ ๋ณต์žก์„ฑ ํ‰๊ฐ€๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์ •์  ๋ถ„์„ ๋ฒ”์œ„๋ฅผ ์›ํ•˜๋Š” ํŒ€์€ ๋ณต์žก์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•œ Radon์ด๋‚˜ ์œ ํ˜• ๊ฒ€์ฆ์„ ์œ„ํ•œ Mypy์™€ ๊ฐ™์€ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, Bento์˜ ํšจ๊ณผ๋Š” ์ •๊ธฐ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋œ ๋ณด์•ˆ ๊ทœ์น™ ์„ธํŠธ์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์ฃผ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒˆ๋กญ๊ฒŒ ๋‚˜ํƒ€๋‚˜๋Š” ๋ณด์•ˆ ์œ„ํ˜‘์„ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๋Š” ์ง„ํ™”ํ•˜๋Š” ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๋ฐ ์ ๊ทน์ ์œผ๋กœ ๋‚˜์„œ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ด์ฌ์—์„œ ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ์š” ์ด์ 

๋ฒ„๊ทธ์™€ ์ฝ”๋“œ ๋ƒ„์ƒˆ๋ฅผ ์ผ์ฐ ๊ฐ์ง€

์ •์  ์ฝ”๋“œ ๋ถ„์„์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ๋ฒ„๊ทธ์™€ ์ฝ”๋“œ ๋ƒ„์ƒˆ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋™์  ๋ถ„์„๊ณผ ๋‹ฌ๋ฆฌ ์ •์  ๋ถ„์„์€ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์Šค์บ”ํ•˜์—ฌ ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜, ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜ ๋ฐ ๋น„ํšจ์œจ์ ์ธ ๋ฃจํ”„๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” ๊ฐ์ง€๋˜์ง€ ์•Š์œผ๋ฉด ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜, ๋ณด์•ˆ ์œ„ํ—˜ ๋ฐ ๋””๋ฒ„๊น… ์‹œ๊ฐ„ ์ฆ๊ฐ€๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ชฉ๋ก์˜ ํ•ฉ๊ณ„๋ฅผ ๊ณ„์‚ฐํ•˜์ง€๋งŒ ๋ฏธ๋ฌ˜ํ•œ ๋…ผ๋ฆฌ ์˜ค๋ฅ˜๊ฐ€ ํฌํ•จ๋œ ์ด Python ํ•จ์ˆ˜๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์„ธ์š”.


def sum_list(numbers):
    total = 0
    for num in numbers:
        total = num  # Incorrectly reassigning instead of adding
    return total

print(sum_list([1, 2, 3, 4]))  # Output: 4 instead of 10

์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜๋กœ ํ‘œ์‹œํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ์„ ์‹œ์‚ฌํ•ฉ๋‹ˆ๋‹ค. total += num ๋Œ€์‹  total = num. ์ด๋Ÿฌํ•œ ์กฐ๊ธฐ ๊ฐ์ง€ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ž ์žฌ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ๋””๋ฒ„๊น… ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๋กœ, ์ด๋Š” ์ฝ”๋“œ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ํ˜ผ๋ž€์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


def calculate_area(radius):
    pi = 3.14
    unused_var = 10  # This variable serves no purpose
    return pi * radius * radius

์ •์  ๋ถ„์„์€ ๋‹ค์Œ์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•ฉ๋‹ˆ๋‹ค. unused_var, ๊นจ๋—ํ•˜๊ณ  ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์ •์  ๋ถ„์„์„ ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์— ํ†ตํ•ฉํ•จ์œผ๋กœ์จ ๊ฐœ๋ฐœ์ž๋Š” ๋ณด๋‹ค ์•ˆ์ •์ ์ด๊ณ  ์ตœ์ ํ™”๋˜๊ณ  ๋ฒ„๊ทธ ์—†๋Š” Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ์„ฑ๋Šฅ ๋ฐ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๊ฐœ์„ 

์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์€ ํšจ์œจ์ ์ธ Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ์ •์  ์ฝ”๋“œ ๋ถ„์„์€ ๋น„ํšจ์œจ์ ์ธ ๋ฃจํ”„, ๋ถˆํ•„์š”ํ•œ ์žฌ๊ท€ ํ˜ธ์ถœ ๋ฐ ์ค‘๋ณต ๊ณ„์‚ฐ์„ ์‹๋ณ„ํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ€๋Šฅํ•œ ํ•œ ํšจ์œจ์ ์œผ๋กœ ์‹คํ–‰๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ˆซ์ž๊ฐ€ ์†Œ์ˆ˜์ธ์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ƒ๊ฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


def is_prime(n):
    for i in range(2, n):
        if n % i == 0:
            return False
    return True

์ด ํ•จ์ˆ˜๋Š” O(n) ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ์‹คํ–‰๋˜๋ฉฐ, ์ด๋Š” ํฐ ์ˆ˜์— ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ์ •์  ๋ถ„์„ ๋„๊ตฌ๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ O(โˆšn) ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ์ตœ์ ํ™”ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.


import math

def is_prime_optimized(n):
    if n < 2:
        return False
    for i in range(2, int(math.sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True

๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ์ค„์ด๋ฉด ํ•จ์ˆ˜๊ฐ€ ํฐ ๊ฐ’์— ๋Œ€ํ•ด ์ƒ๋‹นํžˆ ๋” ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค. n.

๋˜ ๋‹ค๋ฅธ ์˜ˆ๋กœ๋Š” ๋ฃจํ”„์—์„œ ์ค‘๋ณต๋œ ๊ณ„์‚ฐ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.


def inefficient_function(numbers):
    for num in numbers:
        squared = num ** 2
        print(squared)

If squared ๋ฃจํ”„ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ณ„์‚ฐ๋˜๋Š” ๊ฒฝ์šฐ ์ตœ์ ํ™”๋Š” ๊ฐ ๋ฐ˜๋ณต๋งˆ๋‹ค ๊ฐ’์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ๋Œ€์‹  ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ •์  ๋ถ„์„ ๋„๊ตฌ๋Š” ์ด๋Ÿฌํ•œ ๋น„ํšจ์œจ์„ฑ์„ ๊ฐ์ง€ํ•˜๊ณ  ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๋ณด์•ˆ ์ทจ์•ฝ์  ํƒ์ง€

๋ณด์•ˆ์€ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์—์„œ ์ค‘์š”ํ•œ ๋ฌธ์ œ์ด๋ฉฐ, Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋„ ์˜ˆ์™ธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐฐํฌ๋˜๊ธฐ ์ „์— ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ์„ ํƒ์ง€ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์œ ์ถœ, ์ฃผ์ž… ๊ณต๊ฒฉ ๋ฐ ๋ฌด๋‹จ ์•ก์„ธ์Šค๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ๋ณด์•ˆ ๊ฒฐํ•จ ์ค‘ ํ•˜๋‚˜๋Š” ํ•˜๋“œ์ฝ”๋”ฉ๋œ ์ž๊ฒฉ ์ฆ๋ช…์ž…๋‹ˆ๋‹ค.


DB_PASSWORD = "supersecret123"  # Hardcoded password (security risk)

์ •์  ๋ถ„์„์€ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ‘œ์‹œํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋Œ€์‹  ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.


import os

DB_PASSWORD = os.getenv("DB_PASSWORD")  # Secure way to retrieve passwords

๋˜ ๋‹ค๋ฅธ ๋นˆ๋ฒˆํ•œ ๋ณด์•ˆ ์œ„ํ—˜์—๋Š” SQL ์ฃผ์ž… ๊ณต๊ฒฉ์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋Š”, ๊ฒ€์—ด๋˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.


def get_user_data(user_id):
    query = f"SELECT * FROM users WHERE id = {user_id}"  # SQL Injection risk
    return execute_query(query)

์ •์  ๋ถ„์„ ๋„๊ตฌ๋Š” ์ž ์žฌ์ ์ธ SQL ์ฃผ์ž… ์œ„ํ—˜์„ ๊ฐ์ง€ํ•˜๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.


def get_user_data_secure(user_id):
    query = "SELECT * FROM users WHERE id = %s"
    return execute_query(query, (user_id,))

์ฝ”๋“œ ์œ ์ง€ ๊ด€๋ฆฌ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ

๊นจ๋—ํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฝ๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์žฅ๊ธฐ์ ์ธ ํ”„๋กœ์ ํŠธ ์„ฑ๊ณต์— ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ์ง€์ €๋ถ„ํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋Š” ๋””๋ฒ„๊น…, ์ตœ์ ํ™” ๋ฐ ํ™•์žฅํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค. ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ๋Š” ์ฝ”๋”ฉ ํ‘œ์ค€, ์ ์ ˆํ•œ ๋ฌธ์„œ ๋ฐ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์‹œํ–‰ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ PEP 8๊ณผ ๊ฐ™์€ ์ง€์นจ์„ ๋”ฐ๋ฅด๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

ํ˜•์‹์ด ์ž˜๋ชป๋œ Python ํ•จ์ˆ˜๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์„ธ์š”.


def add_numbers(a,b):return a+b

์ด ํ•จ์ˆ˜๋Š” ์ ์ ˆํ•œ ๊ฐ„๊ฒฉ๊ณผ ๊ฐ€๋…์„ฑ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ์ •์  ๋ถ„์„์€ ๋‹ค์Œ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.


def add_numbers(a, b):
    return a + b  # Improved readability

๊ธฐ์ˆ  ๋ถ€์ฑ„ ๊ฐ์†Œ

๊ฐœ๋ฐœ์ž๊ฐ€ ์ ์ ˆํ•œ ์ฝ”๋“œ ๊ตฌ์กฐ๋ณด๋‹ค ๋น ๋ฅธ ์ˆ˜์ •์„ ์šฐ์„ ์‹œํ•˜๋ฉด ๊ธฐ์ˆ  ๋ถ€์ฑ„๊ฐ€ ๋ˆ„์ ๋˜์–ด ๋น„ํšจ์œจ์ ์ด๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด ์ฝ”๋“œ๋ฒ ์ด์Šค๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ๋А๋ ค์ง€๊ณ  ๋ฒ„๊ทธ ๋ฐœ์ƒ์ด ๋Š˜์–ด๋‚˜๋ฉฐ ํ–ฅํ›„ ๊ฐœ์„  ๋น„์šฉ์ด ๋” ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค.

์ •์  ๋ถ„์„ ๋„๊ตฌ๋Š” ์ค‘๋ณต๋˜๊ณ  ์˜ค๋ž˜๋˜๊ณ  ๋น„ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ์‹๋ณ„ํ•˜์—ฌ ๊ธฐ์ˆ  ๋ถ€์ฑ„๊ฐ€ ๊ด€๋ฆฌ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง€๊ธฐ ์ „์— ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ๋ฅผ ๊ณ ๋ คํ•ด ๋ณด์„ธ์š”.


def calculate_discount(price, discount):
    if discount > 0:
        new_price = price - (price * discount / 100)
        return new_price
    else:
        return price

์—ฌ๊ธฐ, else ๋ฌธ์žฅ์€ ๋ถˆํ•„์š”ํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ •์  ๋ถ„์„์€ ๊ทธ๊ฒƒ์„ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค:


def calculate_discount(price, discount):
    if discount > 0:
        return price - (price * discount / 100)
    return price

์ •์  ์ฝ”๋“œ ๋ถ„์„์ด ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์— ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋˜๋Š”๊ฐ€

ํŒŒ์ด์ฌ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๊ฐ์ง€

Python์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋Š” ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠนํžˆ ์žฅ๊ธฐ ์‹คํ–‰ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. Python์€ ์ž๋™ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๋ถ€์ ์ ˆํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋กœ ์ธํ•ด ๊ณผ๋„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋น„๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ๋Š” ๋‹ค์Œ์„ ๊ฐ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น, ์ˆœํ™˜ ์ฐธ์กฐ ๋ฐ ๋น„ํšจ์œจ์ ์ธ ๊ฐ์ฒด ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ์ „์—.

๋‹ค์Œ ์˜ˆ์ œ์—์„œ๋Š” ๊ฐœ์ฒด๊ฐ€ ์ฐธ์กฐ๋œ ์ƒํƒœ๋กœ ๋‚จ์•„ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.


class MemoryLeakExample:
    def __init__(self):
        self.data = [x for x in range(1000000)]  # Large list allocation

leak = MemoryLeakExample()
# The object is not explicitly deleted, leading to high memory usage

์ •์  ๋ถ„์„ ๋„๊ตฌ๋Š” ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๊ฒฐ์ฝ” ํ•ด์ œ๋˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜์—ฌ ๋ช…์‹œ์  ์‚ญ์ œ๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.


del leak  # Explicitly deleting the object to free memory

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์˜ ๋˜ ๋‹ค๋ฅธ ์ผ๋ฐ˜์ ์ธ ์›์ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ˆœํ™˜ ์ฐธ์กฐ. ๋‘ ๊ฐ์ฒด๊ฐ€ ์„œ๋กœ๋ฅผ ์ฐธ์กฐํ•  ๋•Œ Python์˜ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๋Š” ์ด๋ฅผ ํ•ด์ œํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


class A:
    def __init__(self):
        self.ref = B(self)  # Circular reference

class B:
    def __init__(self, obj):
        self.ref = obj

a = A()

์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ๋Š” ์ด๋Ÿฌํ•œ ํŒจํ„ด์„ ์‹๋ณ„ํ•˜๊ณ  ์‚ฌ์šฉ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. weakref ์ˆœํ™˜์„ ๋Š์œผ๋ ค๋ฉด:


import weakref

class A:
    def __init__(self):
        self.ref = weakref.ref(B(self))  # Using weak references

class B:
    def __init__(self, obj):
        self.ref = obj

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์กฐ๊ธฐ์— ๊ฐ์ง€ํ•จ์œผ๋กœ์จ ์ •์  ๋ถ„์„์€ Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋‹ค ๋ถˆํ•„์š”ํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ฐฉ์ง€ํ•˜์„ธ์š”.

๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ๋ฐ ๊ฐœ์ฒด ์ˆ˜๋ช… ์ฃผ๊ธฐ ์ตœ์ ํ™”

์ •์  ์ฝ”๋“œ ๋ถ„์„์˜ ๋˜ ๋‹ค๋ฅธ ์ฃผ์š” ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ค‘๋ณต๋œ ๊ฐ์ฒด ํ• ๋‹น ์‹๋ณ„ ๊ทธ๋ฆฌ๊ณ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์ƒ์„ฑ์€ ์„ฑ๋Šฅ์— ์ƒ๋‹นํ•œ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

๋น„ํšจ์œจ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ณ ๋ คํ•ด ๋ณด์„ธ์š”.


def process_data():
    data = [x for x in range(1000000)]  # Large list stored in memory
    return sum(data)

result = process_data()

์ „์ฒด ๋ชฉ๋ก์€ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๋ฏ€๋กœ ํ•ฉ๊ณ„๋งŒ ๊ณ„์‚ฐํ•˜๋ฉด ๋˜๋ฏ€๋กœ ๋ถˆํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ •์  ๋ถ„์„ ๋„๊ตฌ๋Š” ๋‹ค์Œ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๋ฐœ์ „๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ตœ์ ํ™”ํ•˜๋ ค๋ฉด:


def process_data():
    return sum(x for x in range(1000000))  # Generator expression (memory-efficient)

result = process_data()

๋˜ํ•œ ์ •์  ๋ถ„์„ ๋„๊ตฌ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ๋ช…์‹œ์  ๋ฉ”๋ชจ๋ฆฌ ์ •๋ฆฌ๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŒŒ์ผ์ด ์—ด๋ฆฌ์ง€๋งŒ ๋‹ซํžˆ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์„ธ์š”.


def read_file():
    file = open("data.txt", "r")
    content = file.read()  # File remains open (memory leak)
    return content

์ •์  ๋ถ„์„์—์„œ๋Š” ์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™์œผ๋กœ ํ•ด์ œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.


def read_file():
    with open("data.txt", "r") as file:
        return file.read()  # File closes automatically after reading

์ด๋Ÿฌํ•œ ์ตœ์ ํ™”๋Š” Python ํ”„๋กœ๊ทธ๋žจ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋‹ค๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์†Œ๋ชจ๋ฅผ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์œ ์ง€ ๋ฐฉ์ง€

๊ฐ€์žฅ ๊ฐ„๊ณผ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ ์ค‘ ํ•˜๋‚˜๋Š” ๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด ์œ ์ง€, ๊ฐ์ฒด๊ฐ€ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์€ ํ›„์—๋„ ๋ฉ”๋ชจ๋ฆฌ์— ๋ณด๊ด€๋˜๋Š” ๊ฒฝ์šฐ. ์ •์  ์ฝ”๋“œ ๋ถ„์„์€ ์ด๋Ÿฌํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๋Š” ์ „๋žต์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ธ€๋กœ๋ฒŒ ๋ชฉ๋ก์ด ๊ณ„์† ์ปค์ง€๋Š” ๋‹ค์Œ ํ•จ์ˆ˜๋ฅผ ๊ณ ๋ คํ•ด ๋ณด์„ธ์š”.


cached_data = []

def add_to_cache(data):
    cached_data.append(data)  # Data is continuously added but never removed

์ •์  ๋ถ„์„์—์„œ๋Š” ์ด๋ฅผ ์ž ์žฌ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๋กœ ํ‘œ์‹œํ•˜๊ณ  ์‚ฌ์šฉ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. WeakSet ๋˜๋Š” ์บ์‹œ ํฌ๊ธฐ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.


from collections import deque

cached_data = deque(maxlen=100)  # Limits cache size to prevent excessive memory use

def add_to_cache(data):
    cached_data.append(data)

๋˜ ๋‹ค๋ฅธ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋Š” ๊ฐ์ฒด๊ฐ€ ๋ชฉ๋ก์— ์ €์žฅ๋˜์—ˆ์ง€๋งŒ ์ œ๊ฑฐ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.


def store_objects():
    obj_list = []
    for _ in range(10000):
        obj_list.append(SomeObject())  # Objects accumulate without being cleared

์ •์  ๋ถ„์„์—์„œ๋Š” ๊ฐ์ฒด ๋ณด์กด์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ง€์šฐ๊ฑฐ๋‚˜ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.


def store_objects():
    obj_list = [SomeObject() for _ in range(1000)]  # Limited object retention

๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฐ์ฒด๊ฐ€ ์ œ๊ฑฐ๋˜๋„๋ก ๋ณด์žฅํ•จ์œผ๋กœ์จ ์ •์  ๋ถ„์„ ๋„๊ตฌ๋Š” Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋ฅผ ์ตœ์†Œํ™”ํ•˜๋‹ค ์‹œ๊ฐ„์ด ์ง€๋‚˜๋„ ํšจ์œจ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™” ๋ฐ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘

Python์˜ ๋‚ด์žฅ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ •๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ ๋น„ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋Š” ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๋ฅผ ์••๋„ํ•˜๋‹ค, ์„ฑ๋Šฅ ๋ฌธ์ œ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ์ •์  ๋ถ„์„ ๋„๊ตฌ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์‹ค์ˆ˜๋กœ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ์˜ค์šฉํ•ฉ๋‹ˆ๋‹ค..

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘์˜ ๋น„ํšจ์œจ์ ์ธ ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•ด ๋ณด์„ธ์š”.


import gc

gc.disable()  # Disabling garbage collection (bad practice)

์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ๋Š” ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘ ๋น„ํ™œ์„ฑํ™”๊ฐ€ ๋‹ค์Œ์—์„œ๋งŒ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฒฝ๊ณ ํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์„ฑ๋Šฅ ์‹œ๋‚˜๋ฆฌ์˜ค. ๋Œ€์‹ , ๊ฐ์ฒด๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋„๋ก ๋ณด์žฅํ•˜์—ฌ ์ ์ ˆํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์‹œํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋Š” ๊ณผ๋„ํ•œ ์ˆ˜๋™ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘์ž…๋‹ˆ๋‹ค.


import gc

def process_large_data():
    data = [x for x in range(1000000)]
    del data
    gc.collect()  # Unnecessary manual garbage collection call

์ •์  ๋ถ„์„์—์„œ๋Š” Python์˜ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๊ฐ€ ์ž๋™์œผ๋กœ ์ •๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.


def process_large_data():
    data = [x for x in range(1000000)]
    # No need for manual gc.collect(); Python will handle it

์ •์  ์ฝ”๋“œ ๋ถ„์„์„ ํ™œ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ๋ถˆํ•„์š”ํ•œ ์ˆ˜๋™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ํ”ผํ•˜์‹ญ์‹œ์˜ค ์ตœ์ ํ™”๋œ ์„ฑ๋Šฅ์„ ์œ„ํ•ด Python์˜ ํšจ์œจ์ ์ธ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘ ์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋งบ์Œ๋ง

์ •์  ์ฝ”๋“œ ๋ถ„์„์€ Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ’ˆ์งˆ, ๋ณด์•ˆ ๋ฐ ํšจ์œจ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ์ ์ธ ๊ด€ํ–‰์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋ฅผ ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์— ํ†ตํ•ฉํ•จ์œผ๋กœ์จ ํŒ€์€ ์ฝ”๋“œ๊ฐ€ ํ”„๋กœ๋•์…˜์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์— ๋ฒ„๊ทธ๋ฅผ ์‚ฌ์ „์— ๊ฐ์ง€ํ•˜๊ณ , ์ฝ”๋”ฉ ํ‘œ์ค€์„ ์ ์šฉํ•˜๊ณ , ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์‹  ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๊นจ๋—ํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ์ค‘์š”ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ์„ ์‹๋ณ„ํ•˜๋“ , ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ตœ์ ํ™”ํ•˜๋“ , ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ์ ์šฉํ•˜๋“ , ์ •์  ๋ถ„์„์€ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ค„์ด๊ณ  ์ „๋ฐ˜์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด ์•ˆ์ •์„ฑ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ •์  ๋ถ„์„์„ ์šฐ์„ ์‹œํ•˜๋Š” ์กฐ์ง์€ ์ƒ์‚ฐ์„ฑ ์ฆ๊ฐ€, ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๊ฐ์†Œ, ๋ณด์•ˆ ๊ฐ•ํ™”์˜ ์ด์ ์„ ์–ป์Šต๋‹ˆ๋‹ค.

์˜ฌ๋ฐ”๋ฅธ ์ •์  ์ฝ”๋“œ ๋ถ„์„ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์€ Black์„ ์‚ฌ์šฉํ•˜์—ฌ ์—„๊ฒฉํ•œ ์„œ์‹ ํ‘œ์ค€์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ Bandit์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์•ˆ ์œ„ํ—˜์„ ์‹๋ณ„ํ•˜๊ฑฐ๋‚˜ Mypy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜• ์•ˆ์ „์„ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ํŠน์ • ํ”„๋กœ์ ํŠธ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋„๊ตฌ๋ฅผ ๊ฒฐํ•ฉํ•˜๋ฉด ์ฝ”๋“œ ํ’ˆ์งˆ, ๋ณด์•ˆ ๋ฐ ์„ฑ๋Šฅ์„ ํฌ๊ด„ํ•˜๋Š” ํฌ๊ด„์ ์ธ ๋ถ„์„์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค. Python์ด ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์˜ ์ฃผ์š” ์–ธ์–ด๋กœ ๊ณ„์† ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •์  ์ฝ”๋“œ ๋ถ„์„์„ ์ฑ„ํƒํ•˜๋ฉด ๊ฐœ๋ฐœ์ด ๊ฐ„์†Œํ™”๋  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ž ์žฌ์ ์ธ ์ทจ์•ฝ์„ฑ์œผ๋กœ๋ถ€ํ„ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •์  ๋ถ„์„์„ ์†Œํ”„ํŠธ์›จ์–ด ๋ผ์ดํ”„์‚ฌ์ดํด์˜ ํ•ต์‹ฌ ๋ถ€๋ถ„์œผ๋กœ ๋งŒ๋“ค๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ์—…๊ณ„ ํ‘œ์ค€๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋ชฉํ‘œ๋ฅผ ์ถฉ์กฑํ•˜๋Š” ๊ฐ•๋ ฅํ•˜๊ณ  ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚œ Python ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.