Skip to content

Latest commit

ย 

History

History
159 lines (101 loc) ยท 5.52 KB

File metadata and controls

159 lines (101 loc) ยท 5.52 KB

์˜ค๋Š˜์˜์ง‘ ํด๋ก ์ฝ”๋”ฉ ๐Ÿ 

โญ๏ธ ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„

2023๋…„ 07์›” 21์ผ ~ 2023๋…„ 07์›” 27์ผ

๐Ÿถ ํŒ€ ์›

FE : ๊น€๋‚˜์˜, ์ด์šฉ์šฐ, ํ™์„ฑ๋ฏผ

BE : ํ™์Šนํ˜„, ์ด์ฑ„์›, ์ด์˜ˆ์›, ์ตœํ˜„์„ฑ, ์กฐ์„ฑ๊ทผ

๐Ÿ–ฅ๏ธย ๊ฒฐ๊ณผ๋ฌผ


ํ™ˆํŽ˜์ด์ง€ ์ฃผ์†Œ : https://ohou-clone-fe.vercel.app/

์‹œ์—ฐ ์˜์ƒ : https://www.youtube.com/watch?v=gYafiEdicrk

ํ”„๋กœ์ ํŠธ ๋…ธ์…˜: https://www.notion.so/4-ed1c11e6e80840f78947328d20542b42

ํ”„๋กœ์ ํŠธ github : https://github.com/OHOU-cloneCoding


๐Ÿง‘โ€๐Ÿ’ปย FE ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

๊น€๋‚˜์˜

๋ฌธ์ œ : ์•ก์„ธ์Šค ํ† ํฐ๊ณผ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์ด ๊ฐ๊ฐ ๋”ฐ๋กœ ๋งŒ๋ฃŒ๋ฌ์„ ๋•Œ axios ์ธํ„ฐ์…‰ํ„ฐ๋กœ ํ•ธ๋“ค๋งํ•˜๋Š” ๊ณผ์ •์—์„œ error.response์— ์ ‘๊ทผ์ด ์•ˆ๋จ

ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : ๋ฐฑ์—”๋“œ์™€ ์†Œํ†ตํ•˜์—ฌ ์ƒˆ๋กœ์šด ์•ก์„ธ์Šค ํ† ํฐ์„ success ์‹œ body๋กœ ๋ฐ›์•„ ์ถ”์ถœํ•œ ๋’ค ๋งŒ๋ฃŒ๋œ ํ† ํฐ๊ณผ ๊ตํ™˜ํ•ด์„œ ์ €์žฅํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  error์ผ ๊ฒฝ์šฐ์—๋Š” ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์˜ ๋งŒ๋ฃŒ๋กœ ๊ฐ„์ฃผํ•˜์—ฌ ๋ชจ๋“  ํ† ํฐ์„ ์ง€์šด ๋’ค โ€œ/loginโ€์œผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ• ์„ ํƒํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง€๊ธˆ์€ refresh token ์˜ค๋ฅ˜์™€ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์˜ค๋ฅ˜๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†๊ณ , refresh token์„ ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์ƒ ์ข‹์ง€ ์•Š์•„ ๋งŽ์€ ๊ฐœ์„ ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

์ด์šฉ์šฐ

๋ฌธ์ œ : ๋กœ๊ทธ์ธ ํ›„ ํ† ํฐ์ด ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋˜์ง€ ์•Š์Œ.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : login ํ•จ์ˆ˜์—์„œ ๋กœ๊ทธ์ธ์ด ์„ฑ๊ณตํ•œ ํ›„ ํ—ค๋”๋ถ€๋ถ„์—์„œ ๋ฐ˜ํ™˜๋œ ํ† ํฐ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜์—ฌ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•˜๋Š” ๋ถ€๋ถ„์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

ํ™์„ฑ๋ฏผ

๋ฌธ์ œ : ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ •ํŽ˜์ด์ง€์—์„œ ์›๋ณธ ๊ฒŒ์‹œ๊ธ€ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : ์ด์ „ ์ฃผ์ฐจ์—์„œ๋Š” ์ƒ์„ธํŽ˜์ด์ง€์—์„œ ์ˆ˜์ •ํŽ˜์ด์ง€๋กœ ๊ฒŒ์‹œ๊ธ€์„ state๋กœ ๋„˜๊ฒจ์ค€ ๋‹ค์Œ, ์ˆ˜์ •ํŽ˜์ด์ง€์—์„œ useLocation์„ ์‚ฌ์šฉํ–ˆ๊ณ  ์ด๋ฒˆ์—๋Š” state ๋Œ€์‹  ๊ฒŒ์‹œ๊ธ€ ์•„์ด๋””๋ฅผ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์œผ๋กœ ๋„˜๊ธด ํ›„ ์ˆ˜์ •ํŽ˜์ด์ง€์—์„œ React Query๋กœ ํ•ด๋‹น ๊ฒŒ์‹œ๋ฌผ์„ ๊ฐ€์ ธ์™”๋‹ค.

๐Ÿง‘โ€๐Ÿ’ปย BE ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…

๋ฌธ์ œ :
๊ฒ€์ƒ‰๊ธฐ๋Šฅ & ํ•„ํ„ฐ๋ง & ์ •๋ ฌ์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋™์  ์ฟผ๋ฆฌ ์ž‘์„ฑ ๋‹ค์–‘ํ•œ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ด๋ฅผ JQPL์—์„œ ๋‹ค๋ฃจ๊ธฐ๊ฐ€ ๋งค์šฐ ํž˜๋“ฆ.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : Querydsl์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐ.

์žฅ์  - JPQL์„ ์ด์šฉํ•˜๊ฒŒ ๋˜๋ฉด, compile ์‹œ์ ์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ชป์žก๊ณ , ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์—์„œ RuntimeException์ด ๋ฐœ์ƒํ•œ๋‹ค. ํ•˜์ง€๋งŒ, Querydsl์€ ์ž๋ฐ” ์–ธ์–ด๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— compile์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ ์‹œํ‚จ๋‹ค. - ์กฐ๊ฑด๋ฌธ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. - Querydsl์€ ๋ชจ๋“  ์กฐ๊ฑด์— ๋Œ€ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ๋ฉ”์„œ๋“œ๊ฐ€ null ์ด ์•„๋‹ˆ๋ฉด ์กฐ๊ฑด๋ฌธ์ด ์‹คํ–‰๋œ๋‹ค.

๋ฌธ์ œ :
JWT Access Token์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๋ณด์•ˆ์ ์ธ ์ธก๋ฉด์—์„œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• : Refresh Token ์ ์šฉ.

์žฅ์  -Refresh Token์„ ์ ์šฉํ•˜๊ฒŒ ๋˜๋ฉด Access Token์˜ ์œ ํšจ ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ ์„ค์ •ํ•˜๊ณ , Refresh Token์˜ ์œ ํšจ๊ธฐ๊ฐ„์„ ๊ธธ๊ฒŒ ์„ค์ •ํ•˜์—ฌ ์‚ฌ์šฉ์ž๋Š” Access Token์ด ๋งŒ๋ฃŒ๋˜๋ฉด Refresh Token์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด Access Token์„ ๋ฐœ๊ธ‰๋ฐ›๋Š”๋‹ค. ์ด๋กœ ์ธํ•ด Access Token์ด ํƒˆ์ทจ ๋˜๋”๋ผ๋„ ์งง์€ Access Token์˜ ์œ ํšจ ๊ธฐ๊ฐ„์œผ๋กœ ๊ธˆ๋ฐฉ ๋งŒ๋ฃŒ ๋˜์–ด์„œ ํƒˆ์ทจ์ž๋Š” ํ•ด๋‹น ํ† ํฐ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

๋ฌธ์ œ :
์›นํŽ˜์ด์ง€ ํฌ๋กค๋ง์„ ํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ ํฌ๋กค๋ง์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌ. ๋™์ ํŽ˜์ด์ง€๋ฅผ ํฌ๋กค๋ง ํ•˜๋Š”์ง€, ์ •์  ํŽ˜์ด์ง€๋ฅผ ํฌ๋กค๋งํ•˜๋Š”์ง€์— ๋”ฐ๋ผ ์‚ฌ์šฉ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋‹ค๋ฅด๋‹ค. ์ฒ˜์Œ์— ๋™์  ์›นํŽ˜์ด์ง€ ํฌ๋กค๋ง ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ Jsoup์„ ์‚ฌ์šฉํ•˜์—ฌ ํฌ๋กค๋ง์„ ์‹œ๋„ํ–ˆ์œผ๋‚˜, ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ์ฐพ์•„ ์˜ฌ ์ˆ˜ ์—†์—ˆ์Œ.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ• : ๋™์  ์›นํŽ˜์ด์ง€ ํฌ๋กค๋ง๊ณผ ์ •์  ์›นํŽ˜์ด์ง€ ํฌ๋กค๋ง์˜ ์ฐจ์ด๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , ์ •์  ์›นํŽ˜์ด์ง€๋ฅผ ์ฐพ์•„์„œ Jsoup์„ ์‹œ๋„ํ•จ

๐Ÿ’กย ์ƒˆ๋กญ๊ฒŒ ๋„์ „ํ•œ ๊ธฐ์ˆ 

FE


  • Refresh token
  • ๊ฒ€์ƒ‰์ฐฝ
  • ํŽ˜์ด์ง€๋„ค์ด์…˜
  • ํšŒ์›๊ฐ€์ž… ์‹œ ์ด๋ฉ”์ผ ์ธ์ฆ
  • ๋ฆฌ์•กํŠธ ์ฟผ๋ฆฌ, swal ๋“ฑ ๋ชจ๋“ˆํ™”

BE


  • ์ƒํ’ˆ ์ •๋ณด ํฌ๋กค๋ง : ์˜ค๋Š˜์˜ ์ง‘ ์ƒํ’ˆ ํฌ๋กค๋ง ์‹œ๋„ > ๋™์  ํŽ˜์ด์ง€๋กœ ํฌ๋กค๋ง์ด ์–ด๋ ค์›Œ ์ •์  ํŽ˜์ด์ง€์˜ ๋น„์Šทํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง„ ํŽ˜์ด์ง€์—์„œ ์ƒํ’ˆ ํฌ๋กค๋ง
  • ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ (Querydsl ์‚ฌ์šฉํ•˜์—ฌ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑ)
  • refreshToken
  • github action์„ ์‚ฌ์šฉํ•œ ์ž๋™ ๋ฐฐํฌ ๊ธฐ๋Šฅ ์„ค์ •
  • ํšŒ์›๊ฐ€์ž…์‹œ ๋ฉ”์ผ ์„œ๋ฒ„ ์ธ์ฆ ๊ธฐ๋Šฅ ๊ตฌ์ถ•

๐Ÿ’ช๐Ÿป ์‹œ๊ฐ„์ด ๋” ์žˆ์—ˆ๋‹ค๋ฉด ์‹œ๋„ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๋˜ ๊ฒƒ๋“ค

FE


  • 2์ฐจ๊ธฐ๋Šฅ : ์ฑ…๊ฐˆํ”ผ, ๋งˆ์ดํŽ˜์ด์ง€, ๋‹คํฌ๋ชจ๋“œ
  • ์ตœ์ ํ™” : ์ด๋ฏธ์ง€ ๋ฆฌ์‚ฌ์ด์ง•, ๋ Œ๋”๋ง ์„ฑ๋Šฅ
  • ๋ณด์•ˆ :Refresh token โ†’ http only cookie
  • ์Šคํƒ€์ผ: ๋ฐ˜์‘ํ˜• ์›น (๋ชจ๋ฐ”์ผ, ํƒœ๋ธ”๋ฆฟ)

BE


  • ์‹ค์‹œ๊ฐ„ ์ธ๊ธฐ ๊ฒ€์ƒ‰์–ด
  • ์ฑ…๊ฐˆํ”ผ ๊ธฐ๋Šฅ
  • ์ฑ„ํŒ… ๊ธฐ๋Šฅ์„ ์ด์šฉํ•œ ๊ณ ๊ฐ์„ผํ„ฐ ๋ฌธ์˜
  • ๊ณ ๊ฐ์„ผํ„ฐ ๋ฐ์ดํ„ฐ ํฌ๋กค๋ง
  • EC2 swap memory ์„ค์ •
  • ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ

๐Ÿ”งย ์‚ฌ์šฉ ๊ธฐ์ˆ  (FE)


  • View :ย React,ย React-Router-Dom,ย axios , Styled-components, react-icons
  • State Management :ย Redux,ย react-query,ย Redux-toolkit
  • Build Tool :ย Create React App
  • Other Tools :ย yarn,ย Github,ย notion

๐Ÿ”งย ์‚ฌ์šฉ ๊ธฐ์ˆ  (BE)


  • SpringBoot, SpringData JPA, JDBC, Spring Security, JWT, Querydsl, Jsoup
  • CICD :ย GithubActions, S3, Route 53, CodeDeploy, EC2, RDS
  • Other Tools :ย Git,ย Github,ย notion