๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

ํšŒ๊ณ ๋ก

AWS, GCP, Docker๋ฅผ ํ™œ์šฉํ•œ ์• ๊ฒฌ ์„œ๋น„์Šค ํฌํƒˆ ํšŒ๊ณ ๋ก

๋ฉ”์ธ ํ”„๋กœ์ ํŠธ์˜ ๋ฉ”์ธ ํฌํƒˆ

๐Ÿ”ฅ ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

โ–ถ ์• ์™„๋™๋ฌผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์„œ๋น„์Šค ํฌํƒˆ์„ ๊ตฌํ˜„ํ•˜๋Š” ํ”„๋กœ์ ํŠธ

โ–ถ ๊ฐœ๋ฐœ๊ธฐ๊ฐ„


2020๋…„ 11์›” ~ 2021๋…„ 1์›”

โ–ถ ํŒ€ ๊ตฌ์„ฑ


Front-End & Back-End: 4๋ช… (์„ฑ์œ ๋นˆ, ์ด์ฃผ์—ฝ, ์ด์†”์ง€, ์ด๊ธฐํƒœ)

โ–ถ ๊ฐœ๋ฐœ ์Šค์ผ€์ค„ ๊ด€๋ฆฌ์™€ ์†Œํ†ต์„ ์œ„ํ•ด ์‚ฌ์šฉํ•œ ํ”„๋กœ๊ทธ๋žจ


์Šค์ผ€์ค„ ๊ด€๋ฆฌ ํ”„๋กœ๊ทธ๋žจ: Slack,Discode
์†Œํ†ต ํ”„๋กœ๊ทธ๋žจ: Slack

๐Ÿง ๊ตฌํ˜„ ์˜์ƒ

https://youtu.be/nK3 sgnpixzQ

๐ŸŽ† ๋‚ด๊ฐ€ ๋งก์€ ์—ญํ• 

Front-End & Back-End

๋ฉ”์ธ ํŽ˜์ด์ง€
1. ๋ฉ”์ธ ํŽ˜์ด์ง€์˜ ํ—ค๋” UI ๊ตฌํ˜„๊ณผ ๋ฉ”์ธ ํŽ˜์ด์ง€์˜ ๋™์˜์ƒ ํŽธ์ง‘ 
2. ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ์ตœ์†Œํ™”

 

์ปค๋ฎค๋‹ˆํ‹ฐ ํŽ˜์ด์ง€

1. ์ปค๋ฎค๋‹ˆํ‹ฐ ํŽ˜์ด์ง€์˜ ๊ฒŒ์‹œํŒ UI ๊ตฌํ˜„

2. ์ปค๋ฎค๋‹ˆํ‹ฐ ํŽ˜์ด์ง€์˜ ๊ธฐ๋ณธ์ ์ธ ๊ธ€์“ฐ๊ธฐ, ์ˆ˜์ •, ์‚ญ์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„

 

๋กœ๊ทธ์ธ ํŽ˜์ด์ง€
1. ๋กœ๊ทธ์ธ UI ๊ตฌํ˜„
2. Rest API ํ™œ์šฉํ•œ ์†Œ์…œ ๋กœ๊ทธ์ธ๊ธฐ๋Šฅ (์นด์นด์˜ค, ๋„ค์ด๋ฒ„)
3. ๋กœ๊ทธ์ธ ์‹œ JWTํ† ํฐ ์ƒ์„ฑ์œผ๋กœ ์ž๋™ ๋กœ๊ทธ์ธ ๊ตฌํ˜„
4. ์‹œํ๋ฆฌํ‹ฐ ํ™œ์„ฑํ™”๋กœ ๊ถŒํ•œ๋ณ„ ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ
5. ๋กœ๊ทธ์ธ์˜ ์œ ํšจ๊ธฐ๊ฐ„์ด ๋งŒ๋ฃŒ๋˜๋ฉด ์ž๋™ ๋กœ๊ทธ์•„์›ƒ ๊ตฌํ˜„

 

ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€
1. ํšŒ์›๊ฐ€์ž… ์‹œ Kakao Postcode API๋ฅผ ํ†ตํ•œ ์ฃผ์†Œ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ 
3. ํšŒ์›๊ฐ€์ž… UI ๊ตฌํ˜„

 

Jupyter Notebook
1. Selenium๊ณผ BS4๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ๋ฃŒ ๋ฐ์ดํ„ฐ๋ฅผ ํฌ๋กค๋ง 

๐Ÿ’ฌ ์ž˜ํ•œ ์  / ์•„์‰ฌ์šด ์  / ํ•ด๊ฒฐ or ๊ฐœ์„  ๋ฐฉ๋ฒ•

๐ŸŽ‡ ์ž˜ํ•œ ์ 

ํŒ€์›๊ณผ์˜ ์†Œํ†ต

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

 

๋ฐฑ์—”๋“œ์™€ ํ”„๋ŸฐํŠธ ์—…๋ฌด์˜ ํ†ตํ•ฉ

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

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

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

๐ŸŽ‡ ์•„์‰ฌ์šด ์ 

 

๋ฆฌํŽ™ํ† ๋ง

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

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

๐ŸŽ‡ ํ•ด๊ฒฐ or ๊ฐœ์„  ๋ฐฉ๋ฒ•

 

์ฒœ์ฒœํžˆ ํ™•์‹คํ•œ ๊ฒƒ๋งŒํผ ์ค‘์š”ํ•œ ๊ฒŒ ์—†๋‹ค.

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

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

๐ŸŒ ๊ธฐ๋กํ•˜๊ณ  ์‹ถ์€ ์ฝ”๋“œ / ํ•จ์ˆ˜ / ๋กœ์ง

import  { React,useEffect,useState } from "react";
import "../../styles/Login.css";
import { Link } from 'react-router-dom';
import axios from "axios";
import Kakao from "./Kakao";
import NaverLogin from "./Naver";
import { useNavigate } from 'react-router-dom';
import { API_BASE_URL } from "../../Api-config";



function Login() {
    const navigate =  useNavigate();
    const [memberId, setMemberId] = useState("");
    const [memberPw, setMemberPw] = useState("");
    
    function handleLogin(e){
        e.preventDefault();
        if(memberId === "" || memberPw === ""){
            window.alert("์•„์ด๋””์™€ ํŒจ์Šค์›Œ๋“œ๋ฅผ ํ™•์ธํ•ด ์ฃผ์„ธ์š”")
            return;
        }
        try {   
            axios.post(API_BASE_URL+"/api/Login",null,
                {   
                    params:
                    {
                        memberId:memberId,
                        memberPw:memberPw,
                    },
                })
                .then((res) =>{
                        if(res !== undefined && res !== null){
                            localStorage.setItem('access_token',res.data.accessToken);
                            const {accessToken} = res.data;
                            
                            axios.defaults.baseURL = 'http://localhost:3000';
                            axios.defaults.headers.common['Authorization'] = accessToken;
                            axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

                            if(localStorage.getItem('refresh_token') === null){
                                localStorage.setItem('refresh_token',res.data.refreshToken);
                            }
                            if(res.status === 404 || res.status === 500 || res.status === 403){
                                window.alert("์ž˜๋ชป๋œ ๋กœ๊ทธ์ธ ์ž…๋‹ˆ๋‹ค.");
                                navigate("/");
                            }
                            if(res.status === 200){
                                axios.defaults.headers.common["Authorization"]=`Bearer ${accessToken}`;
                                axios.post(API_BASE_URL+"/api/me")
                                .then((res)=>{
                                    console.log(res);
                                }).catch((error)=>{
                                    console.log(error);
                                })
                                navigate("/");
                            }
                            
                        }else{
                            console.log("Login res localstorage Null Value");
                            window.alert("๋กœ๊ทธ์ธ ํ† ํฐ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค.");
                            document.location = "/Login";
                        } 
                })
        }catch(error){
            alert("๋กœ๊ทธ์ธ ์‹คํŒจ");
            if(error.statusCode === '401'){
                console.log("401 ์˜ค๋ฅ˜ ์ž…๋‹ˆ๋‹ค.");
            }else if(error.statusCode === '403'){
                console.log("403 ์˜ค๋ฅ˜ ์ž…๋‹ˆ๋‹ค.");
            }
        }
    }
    useEffect(()=>{
        console.log("--- ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ๋ Œ๋” ์ค‘ --- ")
    },[])

    return(
        <div className="LoginContainer">
            <div className="MainSection">
                <div>
                    <h1 className="LoginBody">๋กœ๊ทธ์ธ ๋ฐ ํšŒ์›๊ฐ€์ž…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.</h1>
                </div>
                <div className="MainLogin">
                    <input type="text" id="memberEmail" name="memberEmail" placeholder="์•„์ด๋””๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”" maxLength={"30"} 
                     onChange={(e)=>{setMemberId(e.target.value);}}
                     />
                </div>
                <div className="MainLogin">      
                    <input type="password" id="memberPW" name="memberPW" placeholder="๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"
                    onChange={(e)=>{setMemberPw(e.target.value);}}
                    />
                </div>
                <div className="MainLogin">
                    <button id="Membersubmit" type="button" onClick={handleLogin}>๋กœ๊ทธ์ธ</button>
                </div>
                <div className="LoginStartButton">
                    <div className="loginStart">
                         <button type="button"  className="LoginKakao">
                                <Kakao/>                       
                         </button>
                         <NaverLogin className="naver"/>
                	</div>
                	<button type="button" className="LoginEmail">
                         <div className="LoginEmailStart">
                              <Link to="/Registeration" className="LoginEmailStart"> ํšŒ์›๊ฐ€์ž… ์‹œ์ž‘ํ•˜๊ธฐ</Link>
                         </div>  
                    </button>
                </div>
            </div>
        </div>
    )
}
export default Login;

์ฝ”๋“œ์„ค๋ช…

AXOIS๋ฅผ ํ†ตํ•ด  SpringBoot์™€ Rest APIํ†ต์‹ ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋กœ๊ทธ์ธ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.
1. ๋กœ๊ทธ์ธํ–ˆ์„ ๊ฒฝ์šฐ ๋ฐฑ์—”๋“œ์—์„œ AccessToken๊ณผ RefreshToken์ด ์ƒ์„ฑ์ด ๋˜๊ณ  ๊ทธ ์ˆœ๊ฐ„๋ถ€ํ„ฐ ์œ ํšจ๊ธฐ๊ฐ„ ์นด์šดํŠธ๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

2. ๋ฐ›์•„์˜จ AccessToken๋Š” ํ—ค๋”์— RefreshToken๊ฐ’์€ LocalStorege๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
2. ์ €์žฅ๋œ ํ† ํฐ๊ฐ’๋“ค๋กœ ์ž๋™๋กœ๊ทธ์ธ ์ž๋™ ๋กœ๊ทธ์•„์›ƒ์˜ ๊ธฐ๋Šฅ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Axois : Node.js์™€ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์œ„ํ•œ Promise๊ธฐ๋ฐ˜ HTTP ํด๋ผ์ด์–ธํŠธ์ž…๋‹ˆ๋‹ค.

 

 

 

๋ฐ˜์‘ํ˜•