Skip to content

Latest commit

ย 

History

History
219 lines (139 loc) ยท 10.4 KB

File metadata and controls

219 lines (139 loc) ยท 10.4 KB

๐Ÿ’ฌ ๋ฉ‹์Ÿ์ด์‚ฌ์ž์ฒ˜๋Ÿผ ํ”„๋กœ์ ํŠธ - CreationStack

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

image

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







์กฐ์› ์†Œ๊ฐœ

๊น€ํฌ์—ฐ ๊น€์ง„์•„ ๊น€์ฑ„์—ฐ ์œคํ˜œ์ง„ ์ด์˜ˆ์€ ์˜ค์„ธ๋ฏผ ์ „ํšจ์ง„
ํ”„๋กœ์ ํŠธ ์ด๊ด„, ๊ฒฐ์ œ ์„œ๋น„์Šค ๊ตฌํ˜„ ์ฝ˜ํ…์ธ  ์„œ๋น„์Šค ๊ตฌํ˜„ SNS ์„œ๋น„์Šค ๊ตฌํ˜„ JWT ์ด์šฉํ•œ ์ด๋ฉ”์ผ&์นด์นด์˜ค ๋กœ๊ทธ์ธ ๋ฐ ์ง€๋„ ํ™”๋ฉด ๊ตฌํ˜„ ๊ตฌ๋… ์„œ๋น„์Šค ๊ตฌํ˜„ ๊ฒ€์ƒ‰ ์„œ๋น„์Šค ๊ตฌํ˜„ ๊ณต์ง€ ์„œ๋น„์Šค ๊ตฌํ˜„







๊ธฐ์ˆ  ์Šคํƒ












๊ธฐ๋Šฅ

1. ํšŒ์› ๊ด€๋ฆฌ ๋ฐ ์ธ์ฆ

๐Ÿ“ง ์ด๋ฉ”์ผ ๋กœ๊ทธ์ธ

  • Spring Security ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ์ธ ์‹œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋กœ Access Token / Refresh Token ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • Access Token: ํด๋ผ์ด์–ธํŠธ์—์„œ ์š”์ฒญ ์‹œ Authorization ํ—ค๋”์— Bearer ๋ฐฉ์‹์œผ๋กœ ์ „๋‹ฌ
    • Refresh Token: ์„œ๋ฒ„ DB์— ์ €์žฅ ๋ฐ ๋งŒ๋ฃŒ ์‹œ ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ์š”์ฒญ ์ฒ˜๋ฆฌ
  • JWT ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋Š” JwtAuthenticationFilter์—์„œ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. -์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด๋Š” SecurityContextHolder์— ์ €์žฅ๋˜์–ด ์ „์—ญ ์ธ์ฆ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

๐ŸŸก ์นด์นด์˜ค ๋กœ๊ทธ์ธ

  • ์นด์นด์˜ค OAuth 2.0 ์ธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด Access Token ๋ฐœ๊ธ‰ (RestTemplate ๋˜๋Š” WebClient ์‚ฌ์šฉ)๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ๋ฐœ๊ธ‰๋ฐ›์€ ์นด์นด์˜ค Access Token์œผ๋กœ ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์š”์ฒญ (์นด์นด์˜ค API)ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฉ”์ผ ๊ธฐ์ค€์œผ๋กœ ๊ธฐ์กด ํšŒ์› ์—ฌ๋ถ€ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.
  • ์ดํ›„ JWT ํ† ํฐ ๋ฐœ๊ธ‰ ๋ฐฉ์‹์€ ์ด๋ฉ”์ผ ๋กœ๊ทธ์ธ๊ณผ ๋™์ผํ•˜๊ฒŒ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ–Š๏ธ ํšŒ์› ์ •๋ณด ์กฐํšŒ ๋ฐ ์ˆ˜์ •

  • ํšŒ์› ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํšŒ์›์˜ ์—ญํ• ์ด ์ฐฝ์ž‘์ž์ธ์ง€ ์ผ๋ฐ˜ ํšŒ์›์ธ์ง€ ๊ตฌ๋ถ„ํ•ด ์ œ๊ณต๋˜๋Š” ์„œ๋น„์Šค๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•˜์—ฟ์Šต๋‹ˆ๋‹ค.




2. ์ฝ˜ํ…์ธ  ๊ด€๋ฆฌ

๐Ÿ’ฌ Toast UI Editor ์ด์šฉํ•œ ์ฝ˜ํ…์ธ  ์ž‘์„ฑ

  • Toast UI Editor์„ ์ด์šฉํ•ด ์ฝ˜ํ…์ธ  ๋ณธ๋ฌธ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋งˆํฌ๋‹ค์šด ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ณ  ์ผ๋ฐ˜ ํ…์ŠคํŠธ ํ˜•์‹์œผ๋กœ๋„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์ง„์ด ํฌํ•จ๋œ ๊ฒŒ์‹œ๋ฌผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ–ผ๏ธ AWS S3 ์ด์šฉํ•œ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ

  • AWS S3 ์Šคํ† ๋ฆฌ์ง€ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • S3์— ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•˜๊ณ  URL์„ ๋ฐ˜ํ™˜๋ฐ›์•„ DB์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฏธ์ง€๊ฐ€ ํฌํ•จ๋œ ์ฝ˜ํ…์ธ ๋ฅผ ์กฐํšŒํ•  ๊ฒฝ์šฐ DB์— ์ €์žฅ๋œ URL์„ ํ†ตํ•ด S3 ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋œ ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’Ž ๊ตฌ๋…์ž ์ „์šฉ ์ฝ˜ํ…์ธ  ์ ‘๊ทผ ์ œ์–ด

  • ํŠน์ • ์ฝ˜ํ…์ธ ๋Š” ์ฐฝ์ž‘์ž๊ฐ€ ๊ตฌ๋…์ž ์ „์šฉ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฐฝ์ž‘์ž๋ฅผ ๊ตฌ๋…ํ•œ ์ผ๋ฐ˜ ํšŒ์›๋งŒ ์—ด๋žŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ตฌ๋… ์ „์šฉ ์ฝ˜ํ…์ธ ์ผ ๊ฒฝ์šฐ ๋‹ค์ด์•„๋ชฌ๋“œ ํ‘œ์‹œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.




3. ๊ตฌ๋… ๋ฐ ๊ฒฐ์ œ

๐Ÿงพ ๊ตฌ๋… ์„œ๋น„์Šค

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

๐Ÿ’ณ PortOne SDK ๊ฒฐ์ œ ์ˆ˜๋‹จ ๋“ฑ๋ก

  • PortOne SDK๋ฅผ ์ด์šฉํ•ด ๊ฒฐ์ œ ์ˆ˜๋‹จ์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐœ๊ธ‰๋œ BillingKey๋ฅผ ์ด์šฉํ•ด DB์— ๊ฒฐ์ œ์ˆ˜๋‹จ์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
  • ๋“ฑ๋ก๋œ ๊ฒฐ์ œ์ˆ˜๋‹จ์€ ๊ตฌ๋… ์‹œ ๊ฒฐ์ œ ์ˆ˜๋‹จ์„ ์„ ํƒํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

โฑ๏ธ PortOne REST API V2์™€ Spring Scheduler ์ด์šฉํ•œ ์ •๊ธฐ ๊ฒฐ์ œ

  • API ์š”์ฒญ์„ ํ†ตํ•ด ๊ฒฐ์ œ๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฒฐ์ œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๊ฒฐ์ œ ๋‚ด์—ญ๊ณผ ๊ตฌ๋… ๋‚ด์—ญ์„ ์—…๋ฐ์ดํŠธ ํ•ด ๋‹ค์Œ ๊ฒฐ์ œ์ผ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ตฌ๋… ๋‚ด์—ญ์— ์ €์žฅ๋œ ๋‹ค์Œ ๊ฒฐ์ œ์ผ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ๋งค์›” 00์‹œ์— ์ž๋™ ๊ฒฐ์ œ๊ฐ€ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์Œ ๊ตฌ๋… ์ƒํƒœ์— ๋”ฐ๋ผ ๊ฒฐ์ œ๊ฐ€ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.
    • ACTIVE : ๊ฒฐ์ œ ์š”์ฒญ
    • CANCELLED : ์ƒํƒœ๋ฅผ EXPIRED๋กœ ๋ณ€๊ฒฝ
    • EXPIRED : ์ผ์ฃผ์ผ์ด ์ง€๋‚œ ๊ตฌ๋… ๋‚ด์—ญ์ผ ๊ฒฝ์šฐ ๊ตฌ๋… ๋‚ด์—ญ DB์—์„œ ์‚ญ์ œ




4. ๋Œ“๊ธ€ ๋ฐ ์ข‹์•„์š” ๊ด€๋ฆฌ

๐Ÿ—จ๏ธ ๋Œ“๊ธ€ ๊ด€๋ฆฌ

  • ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์€ ๊ฒŒ์‹œ๋ฌผ์— ๋Œ€ํ•ด ๋Œ“๊ธ€์„ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•œ ๋Œ“๊ธ€์— ๋Œ€ํ•ด ์ถ”๊ฐ€๋กœ ๋Œ“๊ธ€์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋Œ“๊ธ€์„ ์‚ญ์ œํ•  ๊ฒฝ์šฐ "์‚ญ์ œ๋œ ๋Œ“๊ธ€์ž…๋‹ˆ๋‹ค" ๋ผ๊ณ  ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

โค๏ธ ์ข‹์•„์š” ๊ด€๋ฆฌ

  • ๋Œ“๊ธ€์— ํ•˜ํŠธ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด ์ข‹์•„์š” ๋ฐ˜์‘์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋งˆ์ดํŽ˜์ด์ง€์—์„œ ์ž์‹ ์ด ์ข‹์•„์š” ๋ˆ„๋ฅธ ์ฝ˜ํ…์ธ  ๋ชฉ๋ก์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.




5. ๊ฒ€์ƒ‰ ๊ด€๋ฆฌ

๐Ÿ‘ค ํฌ๋ฆฌ์—์ดํ„ฐ๋ณ„ ๊ฒ€์ƒ‰

  • ํšŒ์›์€ ํฌ๋ฆฌ์—์ดํ„ฐ์— ํ•œ์ •ํ•ด ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•„ํ„ฐ๋ฅผ ์„ ํƒํ•ด ์ž์‹ ์ด ์›ํ•˜๋Š” ํฌ๋ฆฌ์—์ดํ„ฐ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“š ์ฝ˜ํ…์ธ  ๊ฒ€์ƒ‰

  • ํšŒ์›์€ ์ฝ˜ํ…์ธ ์— ํ•œ์ •ํ•ด ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํšŒ์›์€ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์„ ํƒํ•ด ์›ํ•˜๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โžก๏ธ ํŽ˜์ด์ง€๋„ค์ด์…˜

  • ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ํ†ตํ•ด ๊ฒ€์ƒ‰ ๊ณผ์ •์—์„œ ์„œ๋ฒ„ ๋ถ€ํ•˜๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.







ํ”„๋กœ์ ํŠธ ์„ค์ •

โœ… 1. React + Spring Boot ๋นŒ๋“œ ๊ตฌ์กฐ

creationstack/
โ”œโ”€โ”€ backend/           โ† Spring Boot ํ”„๋กœ์ ํŠธ
โ”‚   โ””โ”€โ”€ target    โ† .jar ํŒŒ์ผ ์ƒ์„ฑ ์œ„์น˜
โ”œโ”€โ”€ frontend/          โ† React ํ”„๋กœ์ ํŠธ
โ”‚   โ””โ”€โ”€ dist/         โ† ์ •์  ๋ฆฌ์†Œ์Šค(build๋œ React)


โœ… 2. React + Spring Boot ๋นŒ๋“œ ๊ตฌ์กฐ

  1. React ์•ฑ์„ buildํ•ด์„œ ์ •์  ํŒŒ์ผ๋กœ ๋งŒ๋“ฌ

  2. Spring Boot ํ”„๋กœ์ ํŠธ์˜ resources/static์— React build ๊ฒฐ๊ณผ๋ฌผ์„ ๋„ฃ์Œ

  3. Spring Boot ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•ด์„œ .jar ์ƒ์„ฑ

  4. .jar ํŒŒ์ผ ์‹คํ–‰


โœ… 3. ๋‹จ๊ณ„๋ณ„ ์‹คํ–‰

[1] React ํ”„๋กœ์ ํŠธ build

cd frontend
npm run build

โ†’ frontend/dist ํด๋”๊ฐ€ ์ƒ์„ฑ๋จ


[2] React ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์„ Spring์— ๋„ฃ๊ธฐ ์•„๋ž˜ ๋ช…๋ น์œผ๋กœ React ๊ฒฐ๊ณผ๋ฌผ์„ Spring Boot ํ”„๋กœ์ ํŠธ์— ๋ณต์‚ฌํ•˜์„ธ์š”:

# frontend/build๋ฅผ backend์˜ static ํด๋”๋กœ ๋ณต์‚ฌ
rm -rf ../backend/src/main/resources/static/*
cp -r dist/* ../backend/src/main/resources/static/

[3] Spring Boot ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ (JAR ๋งŒ๋“ค๊ธฐ)

cd ../backend
./mvn clean package
โ†’ target/ ์•„๋ž˜์— .jar ์ƒ์„ฑ๋จ

์˜ˆ์‹œ: target/backend-0.0.1-SNAPSHOT.jar


[4] JAR ํŒŒ์ผ ์‹คํ–‰

cd target
java -jar backend-0.0.1-SNAPSHOT.jar

์‹คํ–‰ ํ›„ ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:8080 ์ ‘์†ํ•˜๋ฉด React๊ฐ€ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.