๐Ÿ“— ๋ฉด์ ‘๋Œ€๋น„ code ์šฉ์–ด ์ •๋ฆฌ

์†์ƒํ›ˆยท2022๋…„ 12์›” 29์ผ
0

โญ1. Django๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  • ํŒŒ์ด์ฌ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๋ฌด๋ฃŒ ์˜คํ”ˆ์†Œ์Šค ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ(web application framework)์ž…๋‹ˆ๋‹ค. ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์›น์‚ฌ์ดํŠธ๋ฅผ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ๊ตฌ์„ฑ์š”์†Œ๋กœ ์ด๋ฃจ์–ด์ง„ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

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

โญ2. Django๋ฅผ ๋ฐฑ์—”๋“œ ์Šคํƒ์œผ๋กœ ์„ ์ •ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  • ํŒŒ์ด์ฌ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ค‘์—์„œ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์œผ๋กœ ์“ฐ์ด๋ฉฐ,
    DB์™€ AdminํŽ˜์ด์ง€, ORM๋“ฑ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํŽธ๋ฆฌํ•˜์—ฌ ๊ฐœ๋ฐœ์— ์œ ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

โญ3. Django์—๋Š” ์–ด๋–ค ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

  • ORM, Admin, permission๋“ฑ ๋‚ด๋ถ€ ๊ธฐ๋Šฅ์ด ๋งŽ์•„์„œ ์ˆ™์ง€ํ•˜๋ฉด ๋น ๋ฅธ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๊ณ ,
    Django ํ…œํ”Œ๋ฆฟ์„ ํ™œ์šฉํ•˜์—ฌ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ๋„ ๋‹ค๋ฅธ ๊ธฐ์ˆ ์—†์ด ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

โญ4. Django๊ฐ€ ๋‹ค๋ฅธ Python ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋น„๊ต๋˜๋Š” ํŠน์ง•์ด ์žˆ๋‹ค๋ฉด?

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

โญ5. Django ํ”„๋กœ์„ธ์Šค๋Š” ์–ด๋–ค ์ˆœ์„œ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๊นŒ?

  • request๊ฐ€ ๋“ค์–ด์˜ค๋ฉด URL์— ๋”ฐ๋ผ ์ง€์ •๋œ view๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ •ํ•ด์ง„ response๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

โญ6. Django์˜ MTVํŒจํ„ด ์‹œ์Šคํ…œ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  • Model-Template-View๋กœ ์ด๋ฃจ์–ด์ง„ ํŒจํ„ด์œผ๋กœ Model์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์˜๋ฏธํ•˜๊ณ ,
    template์€ ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ๊ฐ ์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ํ™”๋ฉด ์ฆ‰, UI๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์ด๊ณ ,
    View๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

โญ7. ORM์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค.

  • Object-Relational Mapping์˜ ์•ฝ์ž๋กœ SQL์ด๋ผ๋Š” ์–ธ์–ด ๋Œ€์‹  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‰ฝ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

โญ8. Django์˜ ์žฅ๋‹จ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  • ์žฅ์ : ํŒŒ์ด์ฌ ์›นํ”„๋ ˆ์ž„์›Œํฌ ์ค‘์—์„œ ๊ฐ€์žฅ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŽ์•„์„œ ์ž๋ฃŒ ์ฐพ๊ธฐ๊ฐ€ ํŽธ๋ฆฌํ•˜๋ฉฐ,
    RDBMS์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ์™„์ „ํžˆ ์ง€์›ํ•˜๋Š” ๊ธฐ๋ณธ ๋‚ด์žฅ ORM์ด ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
    ๋‹จ์ : ๋ฌด๊ฒ๊ณ  ๋ณต์žกํ•˜๋ฉฐ, Flask์™€ ๊ฐ™์€ ๋งˆ์ดํฌ๋กœ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋น„ํ•ด ์ž์œ ๋„๊ฐ€ ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.

โญ9. Django Admin์€ ๋ฌด์—‡์ด๊ณ  ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๊นŒ?

  • Django admin์€ django์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ด€๋ฆฌ์ž ๊ธฐ๋Šฅ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    DB์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€,์ˆ˜์ •,์‚ญ์ œ๋ฅผ ํ•  ์ˆ˜ ์žˆ๊ณ  ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์„ ํ†ตํ•ด ํŽ˜์ด์ง€๋ฅผ
    ์‚ฌ์šฉ์„ฑ์žˆ๊ฒŒ ๊พธ๋ฐ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โญ10. Django Template Engine์€ ๋ฌด์—‡์ด๊ณ  ์–ด๋–ค ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๊นŒ?

  • Django Template Engine์€ Jinja2์™€ ๋น„์Šทํ•œ Django์—์„œ ๊ธฐ๋ณธ์œผ๋กœ ์ง€์›ํ•˜๋Š” ํ…œํ”Œ๋ฆฟ ์—”์ง„์ž…๋‹ˆ๋‹ค.
    ์ด๋ฅผ ํ†ตํ•ด django ํ…œํ”Œ๋ฆฟ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ 
    HTML์„ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

โญ11. Django๋ฅผ ํ†ตํ•ด CRUD๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ HTTP Method์™€ ํ•จ๊ป˜ ์„ค๋ช…ํ•˜์‹œ์˜ค

  • get: ์ •๋ณด ์กฐํšŒ (read)
    post: ์ •๋ณด ์—…๋กœ๋“œ(create)
    put: ์ •๋ณด์ˆ˜์ •(update)
    delete: ์ •๋ณด ์‚ญ์ œ(delete)

โญ12. Django์—์„œ ํ…Œ์ด๋ธ”์„ ์„ค๊ณ„ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ˜์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค

  • models.py์— models.Model์„ ์ƒ์†ํ•ด ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ 
    charfield, integerfield ๋“ฑ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ํ…Œ์ด๋ธ”์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค.
    ๋งŒ๋“ค์–ด์ง„ ํ…Œ์ด๋ธ”์€ python manage.py makemigration ๋ช…๋ น์–ด๋กœ
    migration ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋’ค python manage.py migrate๋กœ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

โญ13. ํšŒ์›๊ฐ€์ž…์„ ํ•  ๋•Œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์ €์žฅํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  • ํ•ดํ‚น์— ์ทจ์•ฝํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ €์ •๋ณด๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ํ•ด์‹ฑ, ์•”ํ˜ธํ™”ํ•ด์„œ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    SHA-256ํ‘œ์ค€ ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

โญ14. JWT์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค.

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

โญ15. JWT์˜ Access Token๊ณผ Refresh Token์€ ์™œ ํ•„์š”ํ•œ๊ฐ€์š”?

  • JWTํ† ํฐ์€ token์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ ๋ณธ์ธ์ด ๋งž๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜๋‹จ์ด ์—†์Šต๋‹ˆ๋‹ค.
    ๋”ฐ๋ผ์„œ ์–ด๋–ค ์˜๋ฏธ์—์„œ๋Š” ๋ณด์•ˆ์ด ์ทจ์•ฝํ•œ๋ฐ ์ด๋ฅผ ๋ณด์•ˆํ•ด์ฃผ๋Š” ๊ฒƒ์ด refresh token์˜ ์กด์žฌ์ž…๋‹ˆ๋‹ค.
    ์„ค์ •ํ•œ ํ† ํฐ ์œ ํšจ๊ธฐ๊ฐ„์ด ์ง€๋‚˜๋ฉด access token์˜ ๊ธฐ๊ฐ„์ด ๋งŒ๋ฃŒ๋˜๊ณ  refresh token์„ ๊ฐ€์ง€๊ณ  access token์„ ์ƒˆ๋กœ
    ๋ฐœ๊ธ‰๋ฐ›์•„์„œ token์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒํ•ฉ๋‹ˆ๋‹ค.

โญ16. Django์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ JWT๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์—๋Š” ์–ด๋–ค ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

  • JWT๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์ € ๊ด€๋ จ ์ •๋ณด๋ฅผ ๋ชจ๋‘ base64 ์ธ์ฝ”๋”ฉ์„ ํ•˜๊ณ  ์œ ์ง€ ์‹œ๊ฐ„๋„ ์งง์•„ ๋ณด์•ˆ์— ์œ ๋ฆฌํ•˜๋ฉฐ,
    ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์— ํ˜ธํ™˜์„ฑ๋„ ๋†’์Šต๋‹ˆ๋‹ค.
    Django ๊ธฐ๋ณธ ์ธ์ฆ์€ Django ๋‚ด์žฅ์ธ ๋งŒํผ ํ›จ์”ฌ๋” ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

โญ17. ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” FK, OneToOne, ManyToMany ํ•„๋“œ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค.

  • FK: ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”๊ณผ ๊ด€๊ณ„๊ฐ€ ์žˆ์„ ๋•Œ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์˜ ๋‚ด์šฉ์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    OnetoOne: 1:1์˜ ๋Œ€์‘ ๊ด€๊ณ„ ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด ์œ ์ €์™€ ์œ ์ €ํ”„๋กœํ•„ ๋ชจ๋ธ
    ManytoMany: A ๋ชจ๋ธ์— ์—ฐ๊ด€๋œ B ๋ชจ๋ธ ํ•„๋“œ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์ผ ์ˆ˜ ์žˆ๊ณ ,
    B๋ชจ๋ธ์— ์—ฐ๊ด€๋œ A ๋ชจ๋ธ ํ•„๋“œ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ผ ์ˆ˜ ์žˆ๋Š” ๊ด€๊ณ„๊ฐ€ MtoM ์ž…๋‹ˆ๋‹ค.

โญ18. Django์—์„œ ManyToManyํ•„๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค.

  • ๋ชจ๋ธ๊ณผ ๋‹ค๋Œ€๋‹ค ๊ด€๊ณ„์— ๋‘๊ณ  ์‹ถ์€ ๋ชจ๋ธ์„ manytomany ํ•„๋“œ๋กœ ์—ฐ๊ฒฐํ•˜๋ฉด
    ์ž๋™์ ์œผ๋กœ ๋‘ ๋ชจ๋ธ์„ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์ƒˆ๋กœ์šด ๋ชจ๋ธ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
    class Company(models.Model):
    company_name = models.CharField(max_length=128)
    business_area = models.ManyToManyField('BusinessArea', through='CompanyBusinessArea')

    class Meta:
        db_table = 'companies'
        

โญ19. FBV์™€ CBV๋Š” ๊ฐ๊ฐ ๋ฌด์—‡์ด๋ฉฐ, ์–ด๋–ค ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

  • views.py๋ฅผ ํ•จ์ˆ˜์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ํด๋ž˜์Šค ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์˜ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
    ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ๊ตฌ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๊ณ ,
    ์ƒ์†ํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ฝ”๋“œ ์ˆ˜๋ฅผ ์ค„์ด๊ณ  ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โญ20. ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ด๋ฉฐ ์–ด๋–ค ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

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

โญ21. ํ…Œ์ŠคํŠธ์ฝ”๋“œ์—์„œ setup ํ•จ์ˆ˜์™€ setupclass์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  • setup()โ‡’ ๊ฐ ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ด์ „์— ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ์ž…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์‹คํ–‰๋  ๋•Œ ๋งˆ๋‹ค ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    setUpClass() โ‡’ ํ•ด๋‹น ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ด์ „ ๋‹จ ํ•œ๋ฒˆ ํ˜ธ์ถœ๋˜๋Š” ๋ฉ”์†Œ๋“œ์ž…๋‹ˆ๋‹ค.
    setup ๋ฉ”์†Œ๋“œ๋Š” ๊ฐ ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ ์ด์ „์— ํ•ญ์ƒ ํ˜ธ์ถœ ๋ฉ๋‹ˆ๋‹ค.
    ๋ฉ”์†Œ๋“œ์— @classmethod๋ผ๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ๋‹ฌ์•„์ค˜์•ผํ•˜๊ณ  ๋ฉ”์†Œ๋“œ ์ธ์ž๋กœ cls๋ฅผ ๋„˜๊ฒจ์ค˜์•ผํ•ฉ๋‹ˆ๋‹ค.

โญ22. Template Engine์„ ์‚ฌ์šฉํ•  ๋•Œ, ๋ฐœ์ƒํ•˜๋Š” CSRF Error๊ฐ€ ๋ฌด์—‡์ด๊ณ  ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๊นŒ?

  • csrf ์‚ฌ์ดํŠธ๊ฐ„ ์š”์ฒญ ์œ„์กฐ์ด๋ฉฐ, ์‚ฌ์ดํŠธ๊ฐ„ ์š”์ฒญ ์œ„์กฐ๋Š” ์›น์‚ฌ์ดํŠธ ์ทจ์•ฝ์  ๊ณต๊ฒฉ์˜ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.
    ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ์˜์ง€์™€๋Š” ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ณต๊ฒฉ์ž๊ฐ€ ์˜๋„ํ•œ ํ–‰์œ„๋ฅผ ํŠน์ • ์›น์‚ฌ์ดํŠธ์— ์š”์ฒญํ•˜๊ฒŒ ํ•˜๋Š” ๊ณต๊ฒฉ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.
    Template Engine ์„ ์‚ฌ์šฉํ• ๋•Œ๋Š” {% csrf_token %} ์„ ๋ถ™์—ฌ์ค˜์„œ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โญ23. Django ORM์—์„œ queryset๊ณผ object์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค.

  • queryset์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ์ฒด๋“ค์˜ list์ž…๋‹ˆ๋‹ค.
    object๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—์„œ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

โญ24. Django ORM์—์„œ ์ •์ฐธ์กฐ์™€ ์—ญ์ฐธ์กฐ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค

  • ์ •์ฐธ์กฐ: ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ForeignKey๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ฑฐ๋‚˜ 1:1 ๊ด€๊ณ„์ธ ์ƒํ™ฉ์—์„œ ์ฐธ์กฐ ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
    (๋‚ด๊ฐ€ ์ฐธ์กฐํ•˜๋Š” table์ ‘๊ทผ)
    ์—ญ์ฐธ์กฐ: ๋‹ค๋ฅธ ๊ฐ์ฒด๊ฐ€ ForeignKey๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ฑฐ๋‚˜ N:N ๊ด€๊ณ„์ธ ์ƒํ™ฉ,
    ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
    (๋‚˜๋ฅผ ์ฐธ์กฐํ•˜๋Š” table์ ‘๊ทผ)

โญ25. Response ๊ฒฐ๊ณผ์™€ ํ•จ๊ป˜ status code๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

โญ26. ํšŒ์›ํƒˆํ‡ด, ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์‹ค์ œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๊ทธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  • ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œ ํ•  ์ˆ˜ ๋Š” ์žˆ์ง€๋งŒ ์‚ญ์ œ์‹œํ‚ค๊ธฐ ๋ณด๋‹ค๋Š” ์œ ์ €์˜ ๊ถŒํ•œ์„ ์ •์ง€ ์‹œํ‚ค๋Š”๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.
    ํŠนํžˆ RDBMS์—์„œ๋Š” ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„ ์˜ค๋ฅ˜๋ฅผ ์œ ๋ฐœ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
    ๋˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œ ํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค๋Š” ์œ ์ง€ํ•˜๋Š” ๊ฒƒ ์ด ๋งˆ์ผ€ํŒ… ๋“ฑ์— ํ™œ์šฉ ํ•  ์ˆ˜ ์žˆ์–ด ์ข‹์Šต๋‹ˆ๋‹ค.

โญ27. RESTful API๋Š” ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

  • HTTP URI ๋ฅผ ํ†ตํ•ด ์ž์›์„ ๋ช…์‹œํ•˜๊ณ , HTTP method (GET,POST,PUT,DELETE)๋ฅผ ํ†ตํ•ด
    ํ•ด๋‹น ์ž์›์— ๋Œ€ํ•œ CRUD OPERATION์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    RESTful ์ด๋ผ๋Š” ๋ง์€ REST ๋ผ๋Š” ์•„ํ‚คํ…์ฒ˜ ๊ฐœ๋…์„ ๊ทธ๋Œ€๋กœ์ ์šฉํ•ด์„œ ์›น์„œ๋ฒ„ ๊ตฌ์„ฑํ•˜๊ณ  ์›น์„œ๋น™์„ ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

โญ28. DRF๋ฅผ ์‚ฌ์šฉํ•ด API๋ฅผ ๊ฐœ๋ฐœํ•  ๊ฒฝ์šฐ ์–ด๋–ค ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

  • Serailizer๋ฅผ ํ†ตํ•ด ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ๋ฅผ JSOn,XML๋“ฑ์˜ ์ปจํ…ํŠธ ํƒ€์ž…์œผ๋กœ ์‰ฝ๊ฒŒ
    ๋ณ€ํ™˜ ๊ฐ€๋Šฅํ•œ python ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜์‹œ์ผœ์ค๋‹ˆ๋‹ค.
    ORM ๊ณผ non-ORM์„ ๋ชจ๋‘ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
    ๋งŽ์€ ๊ธฐ์—…์—์„œ ์‚ฌ์šฉํ•ด์„œ ์ •๋ณด๋ฅผ ์–ป๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
    ์ธ์ฆ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด OAuth1์™€ OAuth2๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

โญ29. Django ์™€ DRF๋ฅผ ํ†ตํ•œ ๊ฐœ๋ฐœ์˜ ์ฐจ์ด์ ์€ ์–ด๋–ค ๊ฒƒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

  • Django ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ Queryset์„ ํ…œํ”Œ๋ฆฟ ์–ธ์–ด๋กœ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
    DRF๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด json์„ ํ…œํ”Œ๋ฆฟ ์–ธ์–ด๋กœ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
    DRF๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด python์œผ๋กœ ๋งŒ๋“  ๋ฐฑ์—”๋“œ๋ฅผ ๋‹ค๋ฅธ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

โญ30. Django User ๋ชจ๋ธ๊ณผ DRF Custom User ๋ชจ๋ธ์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  • Django User๋ชจ๋ธ์—๋Š” ์œ ์ €๋„ค์ž„,์ด๋ฆ„,์ด๋ฉ”์ผ,ํŒจ์Šค์›Œ๋“œ ์˜ ๊ธฐ๋ณธ์ ์ธ ํ•„๋“œ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
    ํ•˜์ง€๋งŒ ์‹ค์ œ ์„œ๋น„์Šค์—์„œ๋Š” ๋” ๋งŽ์€ User์˜ ์ •๋ณด๋ฅผ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.
    ์ƒ์ผ์ด๋ผ๋˜์ง€, ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์งˆ๋ฌธ์„ ํฌํ•จํ•  ์ˆ˜ ๋„์žˆ์Šต๋‹ˆ๋‹ค.
    ๊ทธ๋ ‡๊ธฐ ์œ„ํ•ด Custom User์„ ํ†ตํ•ด ์ปค์Šคํ…€ ํ•ฉ๋‹ˆ๋‹ค.
    ๋˜ํ•œ Django User๋ชจ๋ธ์€ username์œผ๋กœ ๋กœ๊ทธ์ธ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โญ46. Django ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฐํฌํ•  ๋•Œ, ์‹œํฌ๋ฆฟํ‚ค๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค.

  • .env์— ์‹œํฌ๋ฆฟํ‚ค์™€ database์ •๋ณด๋“ค์„ ์ž‘์„ฑํ•˜๊ณ  settings.py์—์„œ๋Š” .envํŒŒ์ผ์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    ๊ทธ๋ฆฌ๊ณ  .env๋ฅผ .gitignore์— ํฌํ•จ์‹œ์ผœ github์— push๋˜์ง€ ์•Š๋„๋ก ํ•˜๊ณ  EC2์„œ๋ฒ„์— ๋”ฐ๋กœ .envํŒŒ์ผ์„ ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
    ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ local_settings.py๋ผ๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์„œ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

โญ47. Django ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์‹œ ๋ฐœ์ƒํ•˜๋Š” CORS ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค.

  • CORS๋Š” Cross Origin Resource Sharing์˜ ์•ฝ์ž๋กœ
    ๋„๋ฉ”์ธ ๋˜๋Š” ํฌํŠธ๊ฐ€ ๋‹ค๋ฅธ ์„œ๋ฒ„์˜ ์ž์›์„ ์š”์ฒญํ•˜๋Š” ๋งค์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค.
    CORS ๋ฌธ์ œ๋Š” ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๋•Œ, ํ—ค๋”์— ์ ‘๊ทผ์„ ํ—ˆ๋ฝํ•˜๋Š” ๋‚ด์šฉ์ด ์—†์œผ๋ฉด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    ์ด๋Ÿด ๊ฒฝ์šฐ ์™ธ๋ถ€ ์„œ๋ฒ„์—์„œ ๋ณด๋‚ด๋Š” ์š”์ฒญ์˜ ํ—ค๋”(Access-Control-Allow-Origin response ํ—ค๋”)์—
    cross origin HTTP ์š”์ฒญ์„ ํ—ˆ๊ฐ€ํ•ด ์ ‘๊ทผ์„ ํ—ˆ๋ฝํ•˜๋Š” ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.
    pip๋ฅผ ํ†ตํ•ด(ํ˜น์€ Poetry)django-cors-headers๋ฅผ ๋‹ค์šด๋ฐ›๊ณ  installed app์— ๋ช…์‹œ๋ฅผ ํ•ด์ค€๋‹ค์Œ
    cors allow (header, method, allowed_origin) ์„ค์ •๋“ค์„ ์šฉ๋„์— ๋งž๊ฒŒ ์„ค์ •ํ•ด์ฃผ๋ฉด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

โญ48. Django ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฐํฌํ•  ๋•Œ Allow Host์— * ๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด ์•ˆ๋˜๋Š” ์ด์œ ๋Š”?

  • allow host *์€ ์–ด๋–ค ํ˜ธ์ŠคํŠธ์—์„œ ์ ‘๊ทผ์„ ํ•ด๋„ ํ—ˆ๋ฝํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ๋กœ ๋‹ค์–‘ํ•œ ๊ณต๊ฒฉ์˜ ๋Œ€์ƒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โญ49. Django ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฐํฌํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” Gunicorn์ด ๋ฌด์—‡์ด๋ฉฐ, WSGI๋ฅผ ์™œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.

  • Gunicorn์€ ์›น์„œ๋ฒ„์— ํ•„์š”ํ•œ ๋™์ ํŽ˜์ด์ง€ ์š”์ฒญ์„ python์— ๋งž๊ฒŒ ํ•ด์„ํ•˜์—ฌ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์— ์ „๋‹ฌํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
    ์ด๋ฅผ ํ†ตํ•ด ์žฅ๊ณ  ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์›น์„œ๋ฒ„๋กœ ๊ตฌ๋™๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์žฅ๊ณ ์˜ ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด django์˜ runserver๋Š” ํ…Œ์ŠคํŠธ, ๋””๋ฒ„๊น…์šฉ์ด๋ฉฐ
    ๋ณด์•ˆ๊ณผ ์„ฑ๋Šฅํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— wsgi์™€ ์›น์„œ๋ฒ„๋กœ ์„œ๋น„์Šคํ•˜๋„๋ก ๊ถŒ์žฅ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

โญ50. Django ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฐํฌํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” NGINX๊ฐ€ ๋ฌด์—‡์ด๋ฉฐ, ์›น์„œ๋ฒ„๋ฅผ ์™œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค

  • nginx๋ž€ ์ •์  ํŽ˜์ด์ง€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์›น์„œ๋ฒ„์˜ ๊ตฌ์ถ•์„ ๋„์™€์ฃผ๋Š” ์†Œํ”„ํŠธ์›จ์–ด์ž…๋‹ˆ๋‹ค.
    ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ฒ˜๋ฆฌ๋ฐฉ์‹์œผ๋กœ ์‘๋‹ต์ด ๋น ๋ฅด๊ณ  ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    nginx๋ฅผ ํ”„๋ก์‹œ ์„œ๋ฒ„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์„œ๋ฒ„์— ๋ถ„์‚ฐํ•˜๊ธฐ ์œ„ํ•œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ๊ธฐ๋Šฅ,
    DDos ๊ณต๊ฒฉ ์™„ํ™”, ์›น์„œ๋ฒ„์˜ ssl์ธ์ฆ๋„ ์ ์šฉ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    Gunicorn๋งŒ์œผ๋กœ ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜๋ฉด ์ •์ ์ธ ํŽ˜์ด์ง€๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์—†๊ณ  ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋ฅผ ๋ถ„๋ฆฌํ•ด
    REST API์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ด๋„ Nginx๋ฅผ ํ†ตํ•ด ์žฅ์ ์œผ๋กœ ์–ธ๊ธ‰ํ•œ ํ”„๋ก์‹œ ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•ด ๋‹ค์–‘ํ•œ
    ๋ณด์•ˆ์ด์ ๋„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โญ51. Django์—์„œ PostgreSQL์„ ์„ ํ˜ธํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

  • PostgreSQL์€ ํ™•์žฅ ๊ฐ€๋Šฅ์„ฑ ๋ฐ ํ‘œ์ค€ ์ค€์ˆ˜๋ฅผ ๊ฐ•์กฐํ•˜๋Š”
    ๊ฐ์ฒด-๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(ORDBMS)์˜ ํ•˜๋‚˜ ์ž…๋‹ˆ๋‹ค.
    Django๋Š” PostgreSQL์—์„œ๋งŒ ์ž‘๋™ํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    PostgreSQL์—๋Š” Django๊ฐ€ ์ง€์›ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ณต์œ ๋˜์ง€ ์•Š๋Š” ๋งŽ์€ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    PostgreSQL์— Django์—์„œ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ

์ง‘๊ณ„ ํ•จ์ˆ˜ ๊ธฐ๋Šฅ
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ œ์•ฝ ๊ธฐ๋Šฅ
์–‘์‹ ํ•„๋“œ ๋ฐ ์œ„์ ฏ ๊ธฐ๋Šฅ
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ•จ์ˆ˜ ๊ธฐ๋Šฅ
๋ชจ๋ธ ์ธ๋ฑ์Šค ๊ธฐ๋Šฅ
์กฐํšŒ ๊ธฐ๋Šฅ
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…
์ „์ฒด ํ…์ŠคํŠธ ๊ฒ€์ƒ‰
๊ฒ€์ฆ

โญ52. HTTP๊ฐ€ HTTPS๋กœ ๋ฐฐํฌํ–ˆ์„ ๋•Œ์˜ ์žฅ์ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.

  • HTTP HTTPS ์ฐจ์ด์ 
    HTTPS(https://)๋Š” SSL(Secure Socket Layer) ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” HTTP(http://)์ž…๋‹ˆ๋‹ค. SSL(๋˜๋Š” TLS) ์ธ์ฆ์„œ๋Š” ์ผ๋ฐ˜ HTTP ์š”์ฒญ ๋ฐ ์‘๋‹ต์„ ์•”ํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ HTTPS๋Š” HTTP๋ณด๋‹ค ๋” ์•ˆ์ „ํ•œ ๋ณด์•ˆ์šฉ ํ”„๋กœํ† ์ฝœ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • HTTP์™€ HTTPS์˜ ์œ ์ผํ•œ ์ฐจ์ด์ ์€ HTTPS๋ฅผ ์‚ฌ์šฉํ•œ ์›น ํŽ˜์ด์ง€๋ฅผ ํ†ตํ•ด ์ „์†ก๋˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ์ถ”๊ฐ€์ ์ธ ๋ณด์•ˆ ๊ณ„์ธต์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ TLS(์ „์†ก ๊ณ„์ธต ๋ณด์•ˆ) ํ”„๋กœํ† ์ฝœ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๋Š” ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ์†์ƒ๋  ์ˆ˜ ์—†๋Š” HTTPS ์‚ฌ์ดํŠธ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋˜๋ฉฐ ์ œ3์ž๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธ๋ฉ๋‹ˆ๋‹ค.

    • HTTP๋ž€?
      HTTP(HyperText Transfer Protocol)๋Š” ํ•˜์ดํผ ํ…์ŠคํŠธ ์ „์†ก ํ”„๋กœํ† ์ฝœ์œผ๋กœ ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ์ธํ„ฐ๋„ท์„ ์ž‘๋™์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•˜๋ฉฐ, ์›น ์„œ๋ฒ„ ๋ฐ ์›น ๋ธŒ๋ผ์šฐ์ € ์ƒํ˜ธ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ์œ„ํ•œ ์‘์šฉ๊ณ„์ธต ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค.

      ์›น ์‚ฌ์ดํŠธ์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ”„๋กœํ† ์ฝœ ๋ณ€ํ˜•์ด ํ•„์š”ํ•œ๋ฐ, ์ด๋•Œ ์›น ์‚ฌ์ดํŠธ URL์ด ์ผ๋ฐ˜์ ์œผ๋กœ โ€œhttp://www..โ€๋กœ ์‹œ์ž‘ํ•˜๋ฉฐ URL์— ํ•ด๋‹นํ•˜๋Š” ์›น ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์›น ์‚ฌ์ดํŠธ ์„œ๋ฒ„์— ๋ช…๋ น์„ ๋ณด๋‚ด ์ž‘๋™ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • HTTPS๋ž€?
    HTTPS(Hypertext Transfer Protocol Secure)๋Š” ํ•˜์ดํผ ํ…์ŠคํŠธ ์ „์†ก ํ”„๋กœํ† ์ฝœ ๋ณด์•ˆ์œผ๋กœ ํ‘œ์ค€ HTTP์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„์™€ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์•”ํ˜ธํ™”๋˜๊ธฐ ๋•Œ๋ฌธ์— ์›น์‚ฌ์ดํŠธ์— ์ถ”๊ฐ€์ ์ธ ๋ณดํ˜ธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐœ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ํ›”์น˜๊ฑฐ๋‚˜, ํ•ดํ‚นํ•˜๊ฑฐ๋‚˜ ๋ณผ ์ˆ˜ ์—†๋„๋ก ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

  • HTTPS ํ™•์ธ ๋ฐฉ๋ฒ•
    ๋ธŒ๋ผ์šฐ์ €์—์„œ URL์„ ํ™•์ธํ•˜์—ฌ ์›น์‚ฌ์ดํŠธ์— HTTPS ๋ณดํ˜ธ ๊ธฐ๋Šฅ์ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ ์ด๋ฆ„ ์•ž์— ์ž๋ฌผ์‡  ์•„์ด์ฝ˜์ด ์žˆ์œผ๋ฉด ๋‹น์‹ ์˜ ์‚ฌ์ดํŠธ๋Š” HTTPS๋กœ ์ธํ•ด ์•ˆ์ „ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

profile
< ์ฝ”๋ฆฐ์ด์˜ ์ฝ”๋”ฉ๋ชจํ—˜๊ธฐ >

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