๐Make Migrations

Make Migrations: ํ์๊ณ์ด์ฃผ์ผํฐ
์ง๊ตฌ๋ฅผ ๋ ๋ ํ์๊ณ์ ๋ค๋ฅธ ํ์ฑ์ผ๋ก ์ด์ฃผํ๋ค๋ ์ปจ์
์ ์ปค๋ฎค๋ํฐ.
๋ฅํ์ดํฌ๋ฅผ ํตํ ์์ง์ด๋ ์ฌ์ง์ ๋ฃ์ ์๋ฏผ์ฆ์ ๋ฐ๊ธํด์ฃผ๊ณ ,
์ด์ฃผํ ํ์ฑ์ ์ํํธ์ฒ๋ผ ์ธต๊ณผ ํธ์๋ฅผ ๊ณจ๋ผ ๋๋ง์ ๊ณต๊ฐ์ ๊ฐ์ง๊ณ ๊พธ๋ฐ ์ ์๋๋ก ํ์ผ๋ฉฐ,
๋๋ค ์ปค๋ฎค๋ํฐ๋ก์์ ์ญํ ์ ํ ์ ์๋๋ก ํ์ฑ๋ณ ๊ฒ์ํ์ ์ ๊ณตํ๋ค.
ํ๋ก์ ํธ์ ๋ํ ๋์ ์ญํ โ โ๋ณด๋ฌ๊ฐ๊ธฐ๐โ
๐์์ฐ์์ (ํผ๋๋ฐฑ ๋ฐ์ ์ )
๐์์ฐ์์ (ํผ๋๋ฐฑ ๋ฐ์ ํ)

ํ๋ก์ ํธ ๊ธฐ๊ฐ
- ํ๋ก์ ํธ ์งํ๊ธฐ๊ฐ : 2022-07-07 ~ 2022-08-16
- ์ฌ์ฉ์ ํผ๋๋ฐฑ ๊ธฐ๊ฐ : 2022.08.08 ~ 2022.08.11 (์ฌ์ฉ์ ํผ๋๋ฐฑ ๋ด์ฉ )
(์นํ์ด์ง์ ๋ฐฉ๋ฌธํ ์ฌ์ฉ์์๊ฒ ์ค๋ฌธ์กฐ์ฌ๋ฅผ ํตํด ๋ฐ์ ํผ๋๋ฐฑ์ ํ ๋๋ก ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ ๋ฐ ๋ฒ๊ทธ์์ )
์ฃผ์ ๊ธฐ๋ฅ
- JWT๋ฅผ ์ด์ฉํ ๋ก๊ทธ์ธ
- ๋ฅํ์ดํฌ๋ฅผ ํตํ ์์ง์ด๋ ํ๋กํ ์ฌ์ง ์์ฑ
- ์ด๋ฏธ์ง ์ ์ฅ - AWS S3 ํ์ฉ
- ๊ฒ์ํ ๋ฐ ๋ฐฉ๋ช
๋ก ๊ธฐ๋ฅ
- ๊ฒ์ํ ๋ฐ ๋ฐฉ๋ช ๋ก CRUD
- ๊ฒ์๊ธ ์ข์์, ๊ฒ์, ํ์ด์ง๋ค์ด์
- ๋๊ธ ๋ฐ ๋๋๊ธ CRUD
- ์ ์ ๊ฐ ์ข์์, ํ๋ก์ฐ
- ๋ฐ๋๋ผ JS๋ก ๊ตฌํํ ๋ฐฉ ๊พธ๋ฏธ๊ธฐ ๊ธฐ๋ฅ
- ์์ ๊ธฐ๋ฅ - coin์ ์ด์ฉํด ๊ฐ๊ตฌ๋ฅผ ๊ตฌ๋งค
ํ๋ก์ ํธ ๊ธฐ๋ก
๐Team Github - backend
๐Team Github - frontend
๐Starting Assignment (tistory)
ํ ๊ตฌ์ฑ ๋ฐ ์ญํ
| ์ด๋ฆ | ์ญํ | ๊นํ๋ธ |
|---|---|---|
| ์ด์ ์ย ย ย ย | ์๋ฏผ์ฆ ๋ฐ๊ธ ํ์ด์ง, ์์ ํ์ด์ง(back), ๋ฐฉ ๊พธ๋ฏธ๊ธฐ ๊ธฐ๋ฅ, ๋ฅ๋ฌ๋ย ย ย ย | ๐zeonga1102 |
| ๋ ธ์ | ๊ฒ์ํ ํ์ด์ง, ์์ ํ์ด์ง(front), ๋ก๊ณ ์ ์ | ๐minkkky |
| ์ดํ๊ฒฝ | ๋ก๊ทธ์ธ ๋ฐ ํ์๊ฐ์ ํ์ด์ง, AWS ๋ฐฐํฌ | ๐LULULALA2 |
| ๊น๋๊ทผ | ๋ง์ด ํ์ด์ง | ๐yinmsk |
์คํฌ ๋ฐ ์ฌ์ฉํด

ํ๋ก์ ํธ์ ๋ํ ๋์ ์ญํ ๋ฐ ๊ฒฝํ
๋์ ์ญํ
๋ฐฑ์๋
- ๋ฐฑ์๋ ๋ฐฐํฌ
- docker ์ AWS(EC2, ACM, Route53) ์ ์ด์ฉํ์ฌ ๋ฐฑ์๋ ๋ฐฐํฌ
- ํ์๊ฐ์
/๋ก๊ทธ์ธ ํ์ด์ง์ ๋ฐฑ์๋
- JWT๋ฅผ ์ด์ฉํ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ
ํ๋ก ํธ์๋
- ํ๋ก ํธ์๋ ๋ฐฐํฌ
- AWS(S3, Cloudfront)์ ์ด์ฉํ์ฌ ํ๋ก ํธ์๋ ๋ฐฐํฌ
- GitHub์ Git action์ ์ด์ฉํ CICD
- ํ์๊ฐ์ /๋ก๊ทธ์ธ ํ์ด์ง์ ํ๋ก ํธ์๋
- ํ์ฑ ์ ํ ํ์ด์ง์ ํ๋ก ํธ์๋
๐ ์ฌ์ฉ์์ ํผ๋๋ฐฑ๊ณผ ๋์
- ์ด๋ฏธ์ง๋ฅผ ํฌํจํ ๊ฒ์๊ธ์ด ํฌ์คํธ๊ฐ ์๋๋ ํ์ (ํด๊ฒฐ๊ณผ์ )
- ์ฌ์ฉ์ ํธ์์ฑ ์ฆ์ง
- ํ์๊ฐ์ ์ ์ค๋ณต๋ ๋๋ค์, ์์ด๋ ์๋ฟ์ผ๋ก ํ์
- ์ฌ์ดํธ ์๊ฐ ๋ฐ ์ค๋ช ์ด ๋ถ์กฑ โ ์ฌ์ดํธ, ๋ฉ๋ด ๋ฐ ํ์ฑ ์ ํ์ ์ค๋ช ๋ฌธ๊ตฌ ์ถ๊ฐ
- index.html๋ก ๋์์์ ๋ ๋ก๊ทธ์ธ์ ๋ค์ ํด์ผํ๋ ๊ฒฝ์ฐ ๋ฐฉ์ง (ํด๊ฒฐ๊ณผ์ )
- XSS ๊ณต๊ฒฉ์ผ๋ก ์ธํ ๊ฒ์ํ ๋ง๋น (ํด๊ฒฐ๊ณผ์ )
- ์ฌ์ฉ์์๊ฒ ์ ๋ ฅ๋ฐ๋ ํ ์คํธ ์ค ๋ถ๋ฑํธ ๊ธฐํธ๋ฅผ html ํน์๋ฌธ์ ์ฝ๋๋ก ๋ณํ
๋ธ๋ก๊ทธ์ ๋จ๊ฒผ๋ ์ฌ์ฉ์ ํผ๋๋ฐฑ ๋ฐ์
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('<', '<')
if '>' in data.get('content'):
data['content'] = content_data.replace('>', '>')
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์ฐฝ์ ๋ซ์์ผ ํ๋ ์ผ๋ ์ค์๋ค.
์ด์ ์๋ ํ๋ก์ ํธ๋ค์์๋ ๊ธฐํํ ๊ธฐ๋ฅ์ ๊ตฌํํ๋๋ฐ ์ด์ ์ ๋ง์ท์๋๋ฐ, ์ด๋ฒ์ ์ฌ์ฉ์ ํผ๋๋ฐฑ์ ๋ฐ์๋ณด๋ ์ฌ์ดํธ ์ด์ฉ์์ ๋ณด์์ ์ธ ๋ฌธ์ ์ ์ฌ์ฉ์ ํธ์ ๋ฌธ์ ๊ฐ ์ผ๋ง๋ ์ค์ํ์ง ์๊ฒ ๋ ๊ฒ ๊ฐ๋ค. ์์ผ๋ก ๋ค๋ฅธ ํ๋ก์ ํธ๋ฅผ ํ๊ฒ ๋๋ฉด ์ข ๋ ๊ธฐํ๋จ๊ณ์์๋ถํฐ ์ฌ์ฉ์๋ฅผ ๊ณ ๋ คํ๊ฒ๋ ๊ฒ ๊ฐ๋ค.