Django

GreenBeanยท2021๋…„ 7์›” 31์ผ
1
post-thumbnail

Django

์ถœ์ฒ˜ : wishket

Python๊ณผ Django

  • ํŒŒ์ด์ฌ(Python)์€ ๋””์ž์ธ ์ž์ฒด์˜ ๊ฐ€๋…์„ฑ(readability)์ด ๋›ฐ์–ด๋‚œ ๊ฐ•๋ ฅํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด
    • ์˜ˆ๋ฅผ ๋“ค๋ฉด, ํŒŒ์ด์ฌ์—์„œ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๋Š” ์ ์ ˆํ•œ ๋“ค์—ฌ์“ฐ๊ธฐ ๋ฐฉ์‹์€ ์ตœ๊ณ ์˜ ๊ธฐ์ˆ ๋ ฅ์— ๋”์šฑ ์ปค๋‹ค๋ž€ ํž˜์„ ์‹ค์–ด์คŒ
    • ๋˜ํ•œ ๋‹จ์ˆœํ•œ ๋””์ž์ธ ๋•๋ถ„์— ๋น„๊ต์  ๋ฐฐ์šฐ๊ธฐ๋„ ์‰ฌ์šด๋ฐ, ํŠนํžˆ ๊ธฐ์—…๋“ค์ด ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ข€ ๋” ๋ณต์žกํ•œ ์ž๋ฐ”(Java)๋‚˜ ์”จ์ƒต(C#)๊ณผ ๋น„๊ตํ•˜๋ฉด ๊ทธ๋Ÿฐ ์ ์ด ๋”์šฑ ๋‘๋“œ๋Ÿฌ์ง
  • ์žฅ๊ณ (Django)๋Š” ํŒŒ์ด์ฌ์œผ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“œ๋Š” ๋ฐ ์žˆ์–ด์„œ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ
  • ์žฅ๊ณ ๋Š” ๋ชจ๋ธ-๋ทฐ-ํ…œํ”Œ๋ฆฟ(Model View Template, MVT) ํŒจํ„ด์„ ์‚ฌ์šฉ
    • ์ด๋Š” ๋ชจ๋ธ-๋ทฐ-์ปจํŠธ๋กค๋Ÿฌ(Model View Controller, MVC) ํŒจํ„ด์„ ์‚ด์ง ์ˆ˜์ •ํ•œ ๋ฒ„์ „
    • ์ฆ‰, ์žฅ๊ณ ์—์„œ๋Š” ๋ทฐ(View)๊ฐ€ ์ข€ ๋” ์ปจํŠธ๋กค๋Ÿฌ(Controller)์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋ฉฐ, ํ…œํ”Œ๋ฆฟ(Template)์€ ๋ทฐ(View)์˜ ์—ญํ• ์„ ํ•จ
    • ์ด๋Ÿฌํ•œ ์†”๋ฃจ์…˜์€ ๋น„์ฆˆ๋‹ˆ์Šค์˜ ๋งฅ๋ฝ๊ณผ ๋กœ์ง์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•œ ๋ฐฉ์‹์„ ์ œ๊ณต

Django

  • ์žฅ๊ณ (Django)์˜ ์ตœ์ดˆ ๋ฒ„์ „์€ 2005๋…„์— ์ถœ์‹œ
    • ์ด ํ”„๋ ˆ์ž„์›Œํฌ๋Š” โ€˜ํŒŒ์ด์ฌ์˜ ์„ (Zen of Python)โ€™์ด๋ผ๋Š” ์›์น™์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์œผ๋ฉฐ, ์Šค์Šค๋กœ๋ฅผ โ€œ๋งˆ๊ฐ ๊ธฐํ•œ์„ ๋ฐ˜๋“œ์‹œ ์ง€ํ‚ค๋Š” ์™„๋ฒฝ์ฃผ์˜์ž๋“ค์„ ์œ„ํ•œ ์›น ํ”„๋ ˆ์ž„์›Œํฌโ€๋ผ๊ณ  ์†Œ๊ฐœํ•˜๊ณ  ์žˆ์Œ
    • ์žฅ๊ณ ๋Š” ๋ชจ๋“  ์ธก๋ฉด์—์„œ ๊ฐœ๋ฐœ์ž๋“ค์„ ๋„์™€์ฃผ๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๋ฉฐ, ์“ธ๋ฐ์—†๋Š” ๊ฒƒ๊นŒ์ง€ ์ „๋ถ€ ์ƒˆ๋กœ ๋งŒ๋“œ๋Š” ํ—›์ˆ˜๊ณ ๋ฅผ ํ•˜์ง€ ์•Š๊ฒŒ ํ•ด์คŒ
    • ์žฅ๊ณ ๋Š” ์˜คํ”ˆ์†Œ์Šค๋กœ, ์–ธ์ œ๋“  ๋„์›€์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ฑฐ๋Œ€ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ตœ๊ทผ์—๋Š” ์ธ๊ณต์ง€๋Šฅ(AI)์ด๋‚˜ ๋จธ์‹ ๋Ÿฌ๋‹(ML)๊ณผ ์—ฐ๊ด€๋˜์–ด ํŒŒ์ด์ฌ์˜ ์ธ๊ธฐ๊ฐ€ ๋”์šฑ ์ƒ์Šนํ–ˆ๊ณ , ๊ฑฐ๋Œ€ ํ…Œํฌ๊ธฐ์—…๋“ค์ด ์ˆ˜๋งŽ์€ ํ›Œ๋ฅญํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ํญ๋„“๊ฒŒ ์ฑ„ํƒํ•˜๋ฉด์„œ ์žฅ๊ณ ์˜ ์ธ๊ธฐ๊ฐ€ ์ ์  ๋” ์ปค์ง€๊ณ  ์žˆ์Œ

Django์˜ ์žฅ์ 

  • ์ตœ์†Œ๊ธฐ๋Šฅ์ œํ’ˆ(MVP : Minimum Viable Product) ์ œ์ž‘์„ ์œ„ํ•ด ๊ณง๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • ์žฅ๊ณ ๋Š” ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค์˜ ์†๋„๋ฅผ ๋†’์—ฌ์คŒ์œผ๋กœ์จ ๊ฐœ๋ฐœ์ž๋“ค์„ ๋„์™€์คŒ
    • ์—ฌ๊ธฐ์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์•ก์„ธ์Šค, ์„ธ์…˜, ๋ผ์šฐํŒ…(routing), ๋‹ค๊ตญ์–ด ์ง€์› ๋“ฑ์„ ๋‹ค๋ฃจ๋Š” ์ž์ฒด์ ์ธ ๊ฐ์ฒด๊ด€๊ณ„๋งคํ•‘(Object Relation Mapping, ORM) ๊ณ„์ธต์ด ํฌํ•จ
    • ๋˜ํ•œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ์—๋Š” ๋ณด์•ˆ์„ ๊ด€๋ฆฌ
    • ์—ฌ๊ธฐ์—๋Š” ๋ชจ๋ธ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์žฅ๊ณ  ๊ด€๋ฆฌ์ž(Djang-admin)๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ด€๋ฆฌ์ž ํŒจ๋„์ด ๊ธฐ๋ณธ์œผ๋กœ ํฌํ•จ

Tip! ORM์ด๋ž€?
ORM์€ Object Relational Mapping ์ฆ‰, ๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํ•‘์˜ ์ค„์ž„๋ง์ด๋‹ค. ๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํ•‘์„ ํ’€์–ด์„œ ์„ค๋ช…ํ•˜์ž๋ฉด ์šฐ๋ฆฌ๊ฐ€ OOP(Object Oriented Programming)์—์„œ ์“ฐ์ด๋Š” ๊ฐ์ฒด๋ผ๋Š” ๊ฐœ๋…์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์™€ RDB(Relational DataBase)์—์„œ ์“ฐ์ด๋Š” ๋ฐ์ดํ„ฐ์ธ ํ…Œ์ด๋ธ” ์ž๋™์œผ๋กœ ๋งคํ•‘(์—ฐ๊ฒฐ)ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํด๋ž˜์Šค์™€ ํ…Œ์ด๋ธ”์€ ์„œ๋กœ๊ฐ€ ๊ธฐ์กด๋ถ€ํ„ฐ ํ˜ธํ™˜๊ฐ€๋Šฅ์„ฑ์„ ๋‘๊ณ  ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์ด๋ฅผ ORM์„ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ SQL๋ฌธ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋ถˆ์ผ์น˜๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ORM์„ ์ด์šฉํ•˜๋ฉด ๋”ฐ๋กœ SQL๋ฌธ์„ ์งค ํ•„์š”์—†์ด ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

  • ๋ณด์•ˆ
    • ์žฅ๊ณ ์—๋Š” ์‚ฌ์ดํŠธ ๊ฐ„ ์š”์ฒญ ์œ„์กฐ(Cross-site request forgery, CSRF) ๋ฐ SQL ์ธ์ ์…˜(SQL Injections)๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์˜ ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํฌํ•จ
  • ๋‚ด๋ถ€์˜ ํŒŒ์ด์ฌ
    • โ€˜ํŒŒ์ด์ฌ์˜ ์„ โ€™์ด๋ผ๋Š” ๊ทœ์น™์„ ๋”ฐ๋ฅด๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์žฅ๊ณ ์—์„œ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๋ช…์‹œ์ (explicit)
    • โ€˜ํŒŒ์ด์ฌ์˜ ์„ โ€™์—์„œ๋Š” ์•”์‹œ์ (implicit)์ธ ๊ฒƒ๋ณด๋‹ค๋Š” ์–ธ์ œ๋‚˜ ๋ช…์‹œ์ ์ธ ๊ฒƒ์ด ๋‚ฌ๋‹ค๊ณ  ์„ ์–ธํ•˜๊ณ  ์žˆ์Œ
      • ์ฆ‰, ์žฅ๊ณ ์—์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋จผ์ € ํ™˜๊ฒฝ์„ค์ •์„ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ
      • ์žฅ๊ณ ๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๋›ฐ์–ด๋‚œ ์ง€์›๊ณผ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์ƒ์‚ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํŒŒ์ด์ฌ์˜ ๋ชจ๋“  ์žฅ์ ์„ ๊ณ„์Šนํ•˜๊ณ  ์žˆ์Œ

Django์˜ ๋‹จ์ 

  • ์†๋„
    • ํŒŒ์ด์ฌ ์ž์ฒด๋Š” ์†๋„๊ฐ€ ๋น ๋ฅธ ์–ธ์–ด๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ž˜๋ชป ์„ค๊ณ„ํ•˜๋ฉด ์›น์‚ฌ์ดํŠธ์˜ ์†๋„๊ฐ€ ๋Š๋ ค์งˆ ์ˆ˜ ์žˆ์Œ
    • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์•ฑ์ด ์ตœ์ ํ™”๋˜์–ด์„œ ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€๋ฅผ ๋Š˜ ํ™•์ธํ•ด์•ผ ํ•จ
    • ์ด ์ ๊ณผ ๊ด€๋ จํ•ด์„œ ์žฅ๊ณ ๋Š” ๋‚ด๋ถ€์˜ ์†๋„๋ฅผ ํ™•์ธํ•˜๊ณ  ๋ชจ๋“  ์žฅ์• ๋ฌผ์„ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ž์ฒด์ ์ธ ๋ฒค์น˜๋งˆํฌ ๋„๊ตฌ๋ฅผ ์ œ๊ณต
    • ์บ์‹ฑ(caching)์„ ๋น„๋กฏํ•ด์„œ ์ˆ˜๋งŽ์€ ์ตœ์ ํ™” ๋„๊ตฌ๋“ค๋„ ์ ์šฉ ๊ฐ€๋Šฅ
    • ์†๋„์™€ ๊ด€๋ จํ•œ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ์žฅ๊ณ  ์ž์ฒด์˜ ๋ฌธ์ œ๋ผ๊ธฐ๋ณด๋‹ค๋Š”, ์ ์ ˆํ•˜์ง€ ๋ชปํ•œ ํ™˜๊ฒฝ์„ค์ •๊ณผ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„์˜ ๋ฌธ์ œ์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ
  • ๊ด€์Šต์˜ ๊ฒฐํ•
    • โ€˜์„ค์ •๋ณด๋‹ค๋Š” ๊ด€์Šต์ด ์šฐ์„ (Convention Over Configuration)โ€™์ด๋ผ๋Š” ์ ‘๊ทผ๋ฒ•์˜ ๋Œ€ํ‘œ์ ์ธ ์‚ฌ๋ก€์ธ ๋ฃจ๋น„ ์˜จ ๋ ˆ์ผ์ฆˆ(Ruby on Rails) ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋น„๊ตํ•˜์ž๋ฉด, ์žฅ๊ณ ์—์„œ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ทœ์ •ํ•ด์•ผ ํ•จ
    • ๊ทธ๋ž˜์„œ ํ™˜๊ฒฝ์„ค์ •๊ณผ ๊ด€๋ จํ•œ ๋ฌธ์„œ๋ฅผ ๋ณ„๋„๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋ฉฐ, ์ด๋Š” ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค์˜ ์†๋„๋ฅผ ๋Šฆ์ถœ ์ˆ˜๋„ ์žˆ์Œ
    • ๋ฐ˜๋ฉด์— ๊ด€์Šต์ ์ธ ํ™˜๊ฒฝ์„ค์ •์— ์˜์กดํ•˜๋Š” ๊ฒƒ์€ ํŒŒ์ด์ฌ์˜ ์ƒํƒœ๊ณ„์—์„œ๋Š” ์•„์ฃผ ํ”ํ•œ ๋ฐฉ์‹
  • ์žฅ๊ณ ๊ฐ€ ์–ธ์ œ๋‚˜ ์ตœ์„ ์˜ ์„ ํƒ์€ ์•„๋‹ ์ˆ˜๋„ ์žˆ์Œ
    • ํ•œ ํŽ˜์ด์ง€ ๋ถ„๋Ÿ‰์˜ ์ •์ ์ธ ํŽ˜์ด์ง€๋‚˜ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค(microservice)์ฒ˜๋Ÿผ ์•„์ฃผ ๊ทœ๋ชจ๊ฐ€ ์ž‘์€ ์‚ฌ์ดํŠธ์—์„œ๋Š” ์žฅ๊ณ ๊ฐ€ ์ตœ์„ ์˜ ์„ ํƒ์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ์Œ
    • ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ์˜คํžˆ๋ ค ํ”Œ๋ผ์Šคํฌ(Flask)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ์ˆ˜๋„ ์žˆ์Œ
    • ์žฅ๊ณ ๋Š” ํ‘œ์ค€ํ™”๋œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ •๋ง๋กœ ๋น ๋ฅด๊ฒŒ ์ถœ์‹œํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋งŒ๋“ค์–ด์กŒ์Œ
      • ์ฆ‰, ์žฅ๊ณ ๋Š” ๊ฐ„๋‹จํ•œ CRUD ์•ฑ์€ ๋ฌผ๋ก ์ด๊ณ  ๋ณด๋‹ค ์ •๊ตํ•œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“œ๋Š”๋ฐ ํ•„์š”ํ•œ ๊ตฌ์„ฑ์š”์†Œ๋“ค์ด ๊ฒฐํ•ฉ
      • ์ •๋ง๋กœ ๊ฐ„๋‹จํ•œ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด, ๋ชจ๋“  โ€œ๋ฐฐํ„ฐ๋ฆฌโ€๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์žฅ๊ณ ๋Š” ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•ด ๋ณด์ผ ์ˆ˜๋„ ์žˆ์Œ
profile
๐ŸŒฑ Backend-Dev | hwaya2828@gmail.com

0๊ฐœ์˜ ๋Œ“๊ธ€