๐Ÿš€Make Migrations

logo

Make Migrations: ํƒœ์–‘๊ณ„์ด์ฃผ์„ผํ„ฐ

์ง€๊ตฌ๋ฅผ ๋– ๋‚˜ ํƒœ์–‘๊ณ„์˜ ๋‹ค๋ฅธ ํ–‰์„ฑ์œผ๋กœ ์ด์ฃผํ•œ๋‹ค๋Š” ์ปจ์…‰์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ.
๋”ฅํŽ˜์ดํฌ๋ฅผ ํ†ตํ•œ ์›€์ง์ด๋Š” ์‚ฌ์ง„์„ ๋„ฃ์€ ์‹œ๋ฏผ์ฆ์„ ๋ฐœ๊ธ‰ํ•ด์ฃผ๊ณ , ์ด์ฃผํ•œ ํ–‰์„ฑ์— ์•„ํŒŒํŠธ์ฒ˜๋Ÿผ ์ธต๊ณผ ํ˜ธ์ˆ˜๋ฅผ ๊ณจ๋ผ ๋‚˜๋งŒ์˜ ๊ณต๊ฐ„์„ ๊ฐ€์ง€๊ณ  ๊พธ๋ฐ€ ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์œผ๋ฉฐ, ๋™๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ๋กœ์„œ์˜ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–‰์„ฑ๋ณ„ ๊ฒŒ์‹œํŒ์„ ์ œ๊ณตํ•œ๋‹ค.


ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋‚˜์˜ ์—ญํ•  โ†’ โ€œ๋ณด๋Ÿฌ๊ฐ€๊ธฐ๐Ÿ‘€โ€


๐Ÿ”—์‹œ์—ฐ์˜์ƒ (ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜ ์ „)
๐Ÿ”—์‹œ์—ฐ์˜์ƒ (ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜ ํ›„)


1 2 3 4


ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„


์ฃผ์š” ๊ธฐ๋Šฅ


ํ”„๋กœ์ ํŠธ ๊ธฐ๋ก

๐Ÿ”—Team Github - backend
๐Ÿ”—Team Github - frontend
๐Ÿ”—Starting Assignment (tistory)


ํŒ€ ๊ตฌ์„ฑ ๋ฐ ์—ญํ• 

์ด๋ฆ„ ์—ญํ•  ๊นƒํ—ˆ๋ธŒ
์ด์ •์•„ย ย ย ย  ์‹œ๋ฏผ์ฆ ๋ฐœ๊ธ‰ ํŽ˜์ด์ง€, ์ƒ์  ํŽ˜์ด์ง€(back), ๋ฐฉ ๊พธ๋ฏธ๊ธฐ ๊ธฐ๋Šฅ, ๋”ฅ๋Ÿฌ๋‹ย ย ย ย  ๐Ÿ”—zeonga1102
๋…ธ์„ ๊ฒŒ์‹œํŒ ํŽ˜์ด์ง€, ์ƒ์  ํŽ˜์ด์ง€(front), ๋กœ๊ณ  ์ œ์ž‘ ๐Ÿ”—minkkky
์ดํ˜„๊ฒฝ ๋กœ๊ทธ์ธ ๋ฐ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€, AWS ๋ฐฐํฌ ๐Ÿ”—LULULALA2
๊น€๋™๊ทผ ๋งˆ์ด ํŽ˜์ด์ง€ ๐Ÿ”—yinmsk


์Šคํ‚ฌ ๋ฐ ์‚ฌ์šฉํˆด

Architecture



ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋‚˜์˜ ์—ญํ•  ๋ฐ ๊ฒฝํ—˜

๋‚˜์˜ ์—ญํ• 

๋ฐฑ์—”๋“œ

ํ”„๋ก ํŠธ์—”๋“œ


๐Ÿ› ์‚ฌ์šฉ์ž์˜ ํ”ผ๋“œ๋ฐฑ๊ณผ ๋Œ€์‘

๋ธ”๋กœ๊ทธ์— ๋‚จ๊ฒผ๋˜ ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜


1. index.html๋กœ ๋Œ์•„์™”์„ ๋•Œ ๋กœ๊ทธ์ธ์„ ๋‹ค์‹œํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐฉ์ง€

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

์ฝ”๋“œ ๋ณด๊ธฐ๐Ÿ‘€


2. XSS ๊ณต๊ฒฉ ์ฐจ๋‹จ

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

  def validate(self, data):
  content_data = data.get('content')
  if '<' in data.get('content'):
      content_data = content_data.replace('<', '&lt;')
      if '>' in data.get('content'):
          data['content'] = content_data.replace('>', '&gt;')             
  return data



๐ŸงจTroubleShooting

1. python ๋ฒ„์ „์— ๋”ฐ๋ฅธ ํ˜ธํ™˜ ๋ฌธ์ œ

โ‘  python_alpine ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ apt-get ์‚ฌ์šฉ
์•ŒํŒŒ์ธ ๋ฆฌ๋ˆ…์Šค๋Š” ์ดˆ๊ฒฝ๋Ÿ‰ํ™”๋œ ๋ฐฐํฌํŒ์ด๋ฏ€๋กœ docker์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ฆฌ๋ˆ…์Šค ์ด๋ฏธ์ง€์ธ๋ฐ, ๋„์ปค์™€ ์ด๋ฏธ์ง€ ๋ฒ„์ „์— ๋Œ€ํ•ด์„œ ์ž˜ ๋ชจ๋ฅด๋Š” ์ƒํƒœ๋กœ ๋„์ปค๋ฅผ ๊ณต๋ถ€ํ•˜๋˜ ์ฐธ๊ณ ์˜์ƒ์—์„œ ์‚ฌ์šฉํ•œ ๋ฒ„์ „์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค. ์•ŒํŒŒ์ธ ๋ฒ„์ „์—์„œ๋Š” ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋กœ apk๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ชจ๋ฅด๊ณ  apt-get์„ ์‚ฌ์šฉํ–ˆ๊ณ  ๊ณ„์† apt-get์„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด์„œ ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ๋ฒ„์ „์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป๊ณ  ๋‹ค์‹œ ๊ณต๋ถ€ํ•˜์—ฌ ์ˆ˜์ •ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

โ‘ก python_alpine ๋ฒ„์ „์—์„œ๋Š” pytorch, tensorflow ์‚ฌ์šฉ๋ถˆ๊ฐ€ํ•˜์—ฌ python_buster ๋ฒ„์ „์œผ๋กœ ์ˆ˜์ •
์œ„์—์„œ ์•ŒํŒŒ์ธ ๋ฒ„์ „์œผ๋กœ Dockerfile ์„ ์ž‘์„ฑํ•˜์—ฌ 1์ฐจ ๋ฐฐํฌ๋ฅผ ๋งˆ์น˜๊ณ  ๋จธ์‹ ๋Ÿฌ๋‹์„ ์ถ”๊ฐ€ํ•˜์—ฌ 2์ฐจ ๋ฐฐํฌ๋ฅผ ์•ž๋‘๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ pythorh ์™€ tensorflow ๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด ์ธ์‹์„ ๋ชปํ•˜๊ณ  ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜์ง€ ๋ชปํ•˜๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์•ŒํŒŒ์ธ ๋ฒ„์ „์—์„œ๋Š” ๋‘ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์š”์†Œ๊ฐ€ ๋“ค์–ด์žˆ์ง€ ์•Š์•„์„œ ์„ค์น˜ ๋ถˆ๊ฐ€๋Šฅ ํ•œ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ์„ ํ•˜๊ณ , buster ๋ฒ„์ „์œผ๋กœ ๋ฐ”๊พธ์–ด์ฃผ๋‹ˆ ์—๋Ÿฌ์—†์ด ์„ค์น˜๋˜์—ˆ๋‹ค.


2. pytorch, tensorflow run ๋ช…๋ น์–ด๋กœ ์„ค์น˜

docker container๋ฅผ ์˜ฌ๋ฆด ๋•Œ, Requirements.txt ๋กœ ํ•œ๋ฒˆ์— ์„ค์น˜ํ•˜๋ ค๊ณ  ํ•˜๋ฉด pytorch, tensorflow ๊ฐ€ ์„ค์น˜๋˜์ง€ ์•Š๊ณ  MemoryError ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์ด์ „์— pycharm ์— tensorflow ๋ฅผ ์„ค์น˜ํ•  ๋•Œ ์œ ์‚ฌํ•œ ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋˜ ๊ฒƒ์ด ๊ธฐ์–ต๋‚˜์„œ, ์ด ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ๋Š” ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” โ€“no-cache-dir ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค. ๋˜ํ•œ ๋‘ ํŒจํ‚ค์ง€๊ฐ€ ์šฉ๋Ÿ‰์ด ํฌ๊ธฐ๋•Œ๋ฌธ์— Requirements.txt ์„ค์น˜ ๋‹จ๊ณ„๊ฐ€ ์˜ค๋ž˜๊ฑธ๋ ค์„œ Dockerfile ์—์„œ ์„ค์น˜ํ•˜๋„๋ก ๋”ฐ๋กœ ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค.

# Dockerfile
RUN pip install --no-cache-dir tensorflow==2.9.0 
RUN pip install --no-cache-dir torch==1.11.0+cpu torchvision==0.12.0+cpu torchaudio==0.11.0 --extra-index-url https://download.pytorch.org/whl/cpu


3. bucket ์‚ฌ์šฉ์‹œ ๊ถŒํ•œ๋ฌธ์ œ ๋ฐœ์ƒ

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

awscli ๊ฐ€ docker ๋‚ด๋ถ€์— ์„ค์น˜์•ˆ๋˜์–ด ์žˆ์—ˆ๋˜ ๋ฌธ์ œ
โ‘  dockerfile ์— RUN pip install awscli ๋ช…๋ น์–ด ์ถ”๊ฐ€ - docker ๋‚ด๋ถ€์— aswcli ์„ค์น˜ โ‘ก docker-compose.yml ์—์„œ web container ์˜ volume ์„ค์ •์— aws ๊ถŒํ•œ์ธ์ฆ ์ €์žฅ ํด๋” ์œ„์น˜๋ฅผ ์ถ”๊ฐ€ /home/ubuntu/.aws/:/root/.aws/:ro


4. ํ”„๋ก ํŠธ CICD ํ•œ ๋‚ด์šฉ์ด ๋ฐ”๋กœ ๋ฐ˜์˜์ด ์•ˆ๋˜๋Š” ๋ฌธ์ œ

ํ”„๋ก ํŠธ ํŒ€ ๊นƒํ—ˆ๋ธŒ์—์„œ master์— merge๋ฅผ ํ•˜๊ฒŒ๋˜๋ฉด git actions ์„ ํ†ตํ•ด์„œ ์ž๋™์œผ๋กœ S3์— ๊ทธ ๋‚ด์šฉ์ด ๊ฐฑ์‹ ๋˜๋„๋ก ํ•ด๋†“์•˜๋‹ค. ๊ทธ๋Ÿฐ๋ฐ S3์— ๋‚ด์šฉ์ด ๊ฐฑ์‹ ๋˜์—ˆ๋”๋ผ๋„ ๋ˆ„๊ตฐ๊ฐ€๋Š” ๋ฐ˜์˜์ด ์•ˆ๋œ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ณด๊ณ  ์žˆ๊ฑฐ๋‚˜ ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•˜๋ฉด ์˜คํžˆ๋ ค ์ด์ „์˜ ๋‚ด์šฉ์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ๋“ฑ์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ํ”„๋ก ํŠธ ๋ฐฐํฌ๋ฅผ ํ•  ๋•Œ S3๋ฅผ CloudFront์™€ ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฐฐํฌํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— merge๋ฅผ ํ•  ๋•Œ๋งˆ๋‹ค CloudFront ๋ฌดํšจํ™” ๋ฉ”๋‰ด์—์„œ /* ๊ฒฝ๋กœ์˜ ํŒŒ์ผ์„ ๋ชจ๋‘ ๋ฌดํšจํ™”ํ•˜๋„๋ก ํ–ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ๋ฌดํšจํ™”๊ฐ€ ๋๋‚˜๊ณ  ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•ด์ฃผ๋ฉด ์ •์ƒ์ ์œผ๋กœ ์ตœ์‹ ๋ฒ„์ „์œผ๋กœ ์ถœ๋ ฅ๋˜์—ˆ๋‹ค.


5. ์ด๋ฏธ์ง€๋ฅผ ํฌํ•จํ•œ ๊ฒŒ์‹œ๊ธ€์ด ํฌ์ŠคํŠธ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ

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

โ‘ก nginx ์„ค์ •์—์„œ ํŒŒ์ผ ์—…๋กœ๋“œ ์šฉ๋Ÿ‰ ๋Š˜๋ ค์ฃผ๊ธฐ
๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด Nginx์˜ ํŒŒ์ผ ์—…๋กœ๋“œ ์šฉ๋Ÿ‰์ด 1MB๋กœ ๊ธฐ๋ณธ ์„ค์ •๋˜์–ด์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์–ด์„œ 5MB๋กœ ์ˆ˜์ •ํ–ˆ๋‹ค.

# nginx.conf  
client_max_body_size 5M;  
client_body_buffer_size 5M;  

[result] 5MB ์ด์ƒ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ์‹œ CORS error, 2.5MB ์ด์ƒ 5MB ์ดํ•˜์˜ ์ด๋ฏธ์ง€ 500 error, 2.5MB ์ดํ•˜ ์ด๋ฏธ์ง€ 200ok

โ‘ข django ์„ค์ •์—์„œ ํŒŒ์ผ ์—…๋กœ๋“œ ์šฉ๋Ÿ‰ ๋Š˜๋ ค์ฃผ๊ธฐ
nginx ์„ค์ •์„ ์ˆ˜์ •ํ–ˆ๋Š”๋ฐ๋„ ์—๋Ÿฌ๊ฐ€ ๊ณ„์† ๋˜์–ด์„œ docker container ์ค‘ nginx, web log๋ฅผ ๋ดค์ง€๋งŒ ์ด์ƒ์ด ์—†์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ django log๋ฅผ ๋ณด๋Š” ๋ฒ•์„ ์ฐพ์•„์„œ ๋ณด์•˜๋”๋‹ˆ, ์—ฌ๊ธฐ์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ณ  ์žˆ์—ˆ๋‹ค. stackoverflow ์—์„œ ๋‚˜์™€ ์œ ์‚ฌํ•œ ์—๋Ÿฌ๋ฅผ ๋ณด์ด๋Š” ์‚ฌ๋ก€๋ฅผ ์ฐพ์•„์„œ django์—์„œ๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ ํŒŒ์ผ ์—…๋กœ๋“œ ์šฉ๋Ÿ‰์„ 2.5MB๋กœ ์ œํ•œํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๋‹ค. django settings.py ์—์„œ๋Š” ํฌ๋งท์ด byte ๊ธฐ์ค€์ด์–ด์„œ 5MB๋ฅผ 5242880byte๋กœ ๋ฐ”๊ฟ”์„œ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.

# settings.py  
FILE_UPLOAD_MAX_MEMORY_SIZE = 5242880

๋ธ”๋กœ๊ทธ์— ๋‚จ๊ฒผ๋˜ ๊ธฐ๋ก



ํšŒ๊ณ 

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

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

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