๐Ÿ’ป PROJECT/[Spring Boot, React] ๋…์„œ ์Šต๊ด€ ๊ด€๋ฆฌ ์„œ๋น„์Šค

[ํ”„๋กœ์ ํŠธ ๊ฐœ์š”] ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ ๋ฐ ๊ธฐํš

devCloud 2026. 5. 12. 11:37
728x90

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

GitHub ๋ฐ”๋กœ๊ฐ€๊ธฐ

 ๊ธฐํš ๋ฐฐ๊ฒฝ

ํ‰์†Œ ๋…์„œ๋ฅผ ์ข‹์•„ํ•˜๊ณ  ์ฝ์€ ์ฑ…์„ ๊ธฐ๋กํ•˜๋Š” ์Šต๊ด€์ด ์žˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ง‰์ƒ ๊พธ์ค€ํžˆ ๊ธฐ๋กํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋งˆ๋•…ํ•œ ๊ณต๊ฐ„์ด ์—†์—ˆ๋‹ค. ๋ฉ”๋ชจ ์•ฑ, ๋…ธํŠธ, ์‚ฌ์ง„ ๋“ฑ ์—ฌ๋Ÿฌ ๊ณณ์— ๋‚˜๋ˆ ์„œ ์ ๋‹ค ๋ณด๋ฉด ์–ด๋А ์ˆœ๊ฐ„ ํ๋ฆ„์ด ๋Š๊ธฐ๊ณ  ๊ธฐ๋ก ์ž์ฒด๋ฅผ ํฌ๊ธฐํ•˜๊ฒŒ ๋œ๋‹ค. ๊ธฐ๋ก์€ ์žˆ๋Š”๋ฐ ํ•œ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š์œผ๋‹ˆ ๋‚ด๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ฝ์—ˆ๋Š”์ง€, ์–ด๋–ค ์ฑ…์„ ์ข‹์•„ํ•˜๋Š”์ง€๋„ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

 

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

 ์„œ๋น„์Šค ๋ชฉํ‘œ

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

 ํƒ€๊ฒŸ ์‚ฌ์šฉ์ž

  • ๋…์„œ๋ฅผ ์ข‹์•„ํ•˜๊ณ  ์ฝ์€ ์ฑ…์„ ๊ธฐ๋กํ•˜๋Š” ์Šต๊ด€์ด ์žˆ๋Š” ์‚ฌ๋žŒ
  • ๋…์„œ ๋ชฉํ‘œ๋ฅผ ์„ธ์šฐ๊ณ  ๊พธ์ค€ํžˆ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์€ ์‚ฌ๋žŒ

 ๊ธฐ๋Šฅ ๋ฒ”์œ„ ๊ฒฐ์ • ๊ณผ์ •

๊ธฐ๋Šฅ์„ P1 / P2 / P3 ์„ธ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ  ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ–ˆ๋‹ค.

 

P1 - ํ•ต์‹ฌ ๊ธฐ๋Šฅ (๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„)

๋…์„œ ๊ธฐ๋ก ์„œ๋น„์Šค์˜ ๋ณธ์งˆ์— ํ•ด๋‹นํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์ด๋‹ค. ํšŒ์›๊ฐ€์ž…·๋กœ๊ทธ์ธ, ๊ฒŒ์‹œ๋ฌผ CRUD, ๋ฉ”๋ชจ CRUD, ๋ชฉํ‘œ ์„ค์ •, ๊ธฐ๋ณธ ํ†ต๊ณ„๊ฐ€ ์—ฌ๊ธฐ์— ํ•ด๋‹นํ•œ๋‹ค. ์ด ๊ธฐ๋Šฅ๋“ค ์—†์ด๋Š” ์„œ๋น„์Šค ์ž์ฒด๊ฐ€ ์„ฑ๋ฆฝํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

 

P2 - ๋ณด์™„ ๊ธฐ๋Šฅ (์žˆ์œผ๋ฉด ์ข‹์€ ๊ธฐ๋Šฅ)

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

 

P3 - ํ™•์žฅ ๊ธฐ๋Šฅ (์‹œ๊ฐ„์ด ๋‚จ์œผ๋ฉด ๊ตฌํ˜„)

์ปค๋ฎค๋‹ˆํ‹ฐ, ๋ฆฌ๋งˆ์ธ๋”, ๊ด€๋ฆฌ์ž ๊ธฐ๋Šฅ์€ ๋…์„œ ๊ธฐ๋ก ์„œ๋น„์Šค์˜ ํ•ต์‹ฌ๊ณผ๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•ด P3๋กœ ๋ฏธ๋ค˜๋‹ค. ์„œ๋น„์Šค์˜ ๋ณธ์งˆ์ ์ธ ๊ธฐ๋Šฅ์„ ๋จผ์ € ์™„์„ฑํ•œ ๋’ค ์‹œ๊ฐ„์ด ๋‚จ์„ ๋•Œ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค. ๋…์„œ ์ฑŒ๋ฆฐ์ง€๋Š” ๊ธฐํš์€ ํ•ด๋’€์ง€๋งŒ ์ตœ์ข…์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜๋‹ค.


 ๊ฐœ๋ฐœ ์ผ์ • ์„ค๊ณ„

๋ฐฑ์—”๋“œ๋ฅผ ๋จผ์ € ์™„๋ฒฝํ•˜๊ฒŒ ๊ตฌํ˜„ํ•œ ๋’ค ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์›์น™์œผ๋กœ ์žก์•˜๋‹ค. ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋ฅผ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ๋งŒํผ ๋ฐฑ์—”๋“œ์— ์‹œ๊ฐ„์„ ์ถฉ๋ถ„ํžˆ ํˆฌ์žํ•˜๊ณ , ํ”„๋ก ํŠธ๋Š” ๋ฐฑ์—”๋“œ๊ฐ€ ์™„์„ฑ๋œ ์ƒํƒœ์—์„œ ์—ฐ๊ฒฐ์— ์ง‘์ค‘ํ•˜๋Š” ๋ฐฉ์‹์ด์—ˆ๋‹ค.

D1 ~ D9๋Š” ๋ฐฑ์—”๋“œ ์ „์ฒด ๊ตฌํ˜„, D9-1์€ ๋ฆฌํŒฉํ† ๋ง, D10 ~ D12๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ตฌํ˜„, D13 ~ D14๋Š” ๋ฐฐํฌ ๋ฐ ๋งˆ๋ฌด๋ฆฌ๋กœ ์ผ์ •์„ ๊ตฌ์„ฑํ–ˆ๋‹ค.

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

๊ธฐ๋Šฅ ์„ค๋ช…
๋…์„œ ๊ธฐ๋ก (Book Note) ๋…์„œ ์ƒํƒœ(์ฝ๋Š” ์ค‘ / ์™„๋… / ์ผ์‹œ์ •์ง€ / ์ฝ๊ณ  ์‹ถ์Œ) ๊ด€๋ฆฌ, ๋ณ„์ ·ํ•œ์ค„ํ‰·์žฅ๋ฅด ๊ธฐ๋ฐ˜ ๋…ธํŠธ ์ž‘์„ฑ
๋ฉ”๋ชจ ๊ด€๋ฆฌ ๋„์„œ ๋‹จ์œ„๋กœ ๋ฉ”๋ชจ ์ž‘์„ฑ·์ˆ˜์ •·์‚ญ์ œ, ์ฑ…์„ ์ฝ์œผ๋ฉฐ ๋‚จ๊ธด ๋ฌธ์žฅ·๊ฐ์ƒ·์š”์•ฝ ์ •๋ฆฌ
๋ชฉํ‘œ ๋ฐ ํ†ต๊ณ„ (Progress) ์›”๊ฐ„·์—ฐ๊ฐ„ ๋…์„œ ๋ชฉํ‘œ ์„ค์ •, ์žฅ๋ฅด ๋ถ„ํฌ·์›”๋ณ„ ์™„๋…·์—ฐ๊ฐ„ ์š”์•ฝ ์‹œ๊ฐํ™”
๋„์„œ ์ถ”์ฒœ ์•Œ๋ผ๋”˜ API ์—ฐ๋™, ๋ฒ ์ŠคํŠธ์…€๋Ÿฌ·์žฅ๋ฅด ๊ธฐ๋ฐ˜ ์ถ”์ฒœ, ์ €์žฅ ๋ฐ ๋ชฉ๋ก ๊ด€๋ฆฌ
๋…์„œ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ·์ˆ˜์ •·์‚ญ์ œ, ๋Œ“๊ธ€·๋Œ€๋Œ“๊ธ€·์ข‹์•„์š”
๋ฆฌ๋งˆ์ธ๋” ๋…์„œ ๋ฆฌ๋งˆ์ธ๋” ๋“ฑ๋ก, SSE ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ์ˆ˜์‹ 
๊ด€๋ฆฌ์ž ์‚ฌ์šฉ์ž·๊ฒŒ์‹œ๊ธ€·์žฅ๋ฅด·๋ฌธ์˜ ๋ชฉ๋ก ์กฐํšŒ, ์žฅ๋ฅด ์ถ”๊ฐ€·์‚ญ์ œ

๊ธฐ์ˆ  ์Šคํƒ

 Backend

๊ตฌ๋ถ„ ๊ธฐ์ˆ  ์„ ํƒ ์ด์œ 
Language Java 21 GraalVM Record, Switch Expression ๋“ฑ ์ตœ์‹  ๋ฌธ๋ฒ• ํ™œ์šฉ, GraalVM ๋„ค์ดํ‹ฐ๋ธŒ ์ด๋ฏธ์ง€๋กœ ์‹œ์ž‘ ์‹œ๊ฐ„ ๋‹จ์ถ•
Framework Spring Boot 3.3 Spring Security 6, Virtual Thread ๋“ฑ ์ตœ์‹  ๊ธฐ๋Šฅ ํ™œ์šฉ
Persistence Spring Data JPA QueryDSL ๋™์  ์ฟผ๋ฆฌ๋ฅผ ํƒ€์ž… ์•ˆ์ „ํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด QueryDSL ๋„์ž…
Database MySQL 8 H2 ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ์ ํ•ฉ, ๋กœ์ปฌ์—์„œ๋Š” H2๋กœ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ฆ
Auth JWT Redis Stateless ์ธ์ฆ ๊ตฌ์กฐ, Redis๋กœ Refresh Token ๋ฐ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๊ด€๋ฆฌ
Storage AWS S3 ํ”„๋กœํ•„ ์ด๋ฏธ์ง€, ๊ฒŒ์‹œ๋ฌผ ํ‘œ์ง€ ์ด๋ฏธ์ง€ ์ €์žฅ
External Aladin API SMTP ๋„์„œ ๊ฒ€์ƒ‰·์ถ”์ฒœ ์—ฐ๋™, ์ด๋ฉ”์ผ ์ธ์ฆ·๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ •

 Frontend

๊ตฌ๋ถ„ ๊ธฐ์ˆ  ์„ ํƒ ์ด์œ 
Framework React 18 TypeScript ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ํƒ€์ž… ์•ˆ์ „์„ฑ ํ™•๋ณด
Styling Tailwind CSS v3 shadcn/ui ์œ ํ‹ธ๋ฆฌํ‹ฐ ๊ธฐ๋ฐ˜์œผ๋กœ ๋น ๋ฅธ UI ๊ตฌ์„ฑ, shadcn/ui๋กœ ์ผ๊ด€๋œ ์ปดํฌ๋„ŒํŠธ ๊ด€๋ฆฌ
HTTP Axios ์ธํ„ฐ์…‰ํ„ฐ๋กœ Bearer Token ์ž๋™ ์ฃผ์ž… ๋ฐ ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ์ฒ˜๋ฆฌ

 Infra

๊ตฌ๋ถ„ ๊ธฐ์ˆ  ์„ ํƒ ์ด์œ 
Compute AWS EC2 Docker ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜์œผ๋กœ ์šด์˜ ํ™˜๊ฒฝ ์ผ๊ด€์„ฑ ํ™•๋ณด
Database AWS RDS MySQL 8 ๊ด€๋ฆฌํ˜• DB๋กœ ์šด์˜ ๋ถ€๋‹ด ์ตœ์†Œํ™”
Cache AWS ElastiCache Redis ํ† ํฐ ์ €์žฅ, ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ, ์ธ์ฆ ์ฝ”๋“œ, ์‹คํŒจ/์ž ๊ธˆ ์ •๋ณด ๊ด€๋ฆฌ
Storage / CDN AWS S3 CloudFront ์ •์  ํŒŒ์ผ ์„œ๋น™ ๋ฐ ์ด๋ฏธ์ง€ CDN ์ฒ˜๋ฆฌ
Network ALB HTTPS ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…, SSL ์ธ์ฆ์„œ ์ ์šฉ

์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

ํด๋ผ์ด์–ธํŠธ(React)๋Š” CloudFront๋ฅผ ํ†ตํ•ด ์ •์  ํŒŒ์ผ์„ ์„œ๋น™๋ฐ›๊ณ , API ์š”์ฒญ์€ ALB๋ฅผ ๊ฑฐ์ณ EC2์˜ Spring Boot ์ปจํ…Œ์ด๋„ˆ๋กœ ์ „๋‹ฌ๋œ๋‹ค. ๋ชจ๋“  ์š”์ฒญ์€ JwtFilter์—์„œ ํ† ํฐ ๊ฒ€์ฆ ๋ฐ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ํ™•์ธ์„ ๊ฑฐ์น˜๊ณ , Spring Security์—์„œ ์ธ์ฆ·์ธ๊ฐ€๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋ฆฌ๋งˆ์ธ๋” ์•Œ๋ฆผ์€ SSE๋กœ ํด๋ผ์ด์–ธํŠธ์™€ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜๋ฉฐ, ์™ธ๋ถ€ ์—ฐ๋™์œผ๋กœ Google OAuth2, ์•Œ๋ผ๋”˜ API, SMTP, AWS S3๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.


ERD

์ด 11๊ฐœ ํ…Œ์ด๋ธ”๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. users๋ฅผ ์ค‘์‹ฌ์œผ๋กœ posts, memos, monthly_goals, annual_goals, reminders, recommendations, inquiries๊ฐ€ ์—ฐ๊ฒฐ๋˜๊ณ , ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ๋Šฅ์€ community_posts, community_comments, community_likes๋กœ ๋ถ„๋ฆฌํ–ˆ๋‹ค. ์žฅ๋ฅด๋Š” genres ํ…Œ์ด๋ธ”๋กœ ๋…๋ฆฝ ๊ด€๋ฆฌํ•˜๋ฉฐ ๊ด€๋ฆฌ์ž๊ฐ€ ์ถ”๊ฐ€·์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.


1์ฐจ ๊ฐœ๋ฐœ ๋Œ์•„๋ณด๊ธฐ

2025๋…„ ์ดˆ์— Java 17, Spring Boot 3.3, React 18๋กœ ๊ฐ™์€ ์ฃผ์ œ๋ฅผ ํ•œ ๋ฒˆ ๊ตฌํ˜„ํ•œ ์ ์ด ์žˆ๋‹ค. ๋‹น์‹œ์—๋Š” ์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ, Thymeleaf ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง, Render ๋ฌด๋ฃŒ ๋ฐฐํฌ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ , ์„ค๊ณ„๋ณด๋‹ค ๊ตฌํ˜„์— ๊ธ‰ํ–ˆ๋˜ ์ฝ”๋“œ์˜€๋‹ค. 1์ฐจ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๋ดค์„ ๋•Œ ์ˆ˜์ •์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์ด ์•„๋‹ˆ๋ผ๊ณ  ํŒ๋‹จํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฝ”๋“œ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์งฐ๋‹ค. JWT ์ธ์ฆ, AWS ์ธํ”„๋ผ, ๋„๋ฉ”์ธ ์ค‘์‹ฌ ์„ค๊ณ„, ๋ณด์•ˆ ์ ๊ฒ€๊นŒ์ง€ ์ด๋ฒˆ 2์ฐจ ๊ฐœ๋ฐœ์—์„œ ๋‹ฌ๋ผ์ง„ ๋ถ€๋ถ„๋“ค์ด๋‹ค.

 

1์ฐจ ๊ฐœ๋ฐœ ๊ธฐ๋ก์€ ์•„๋ž˜ ๋งํฌ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

1์ฐจ ๊ฐœ๋ฐœ ๊ธฐ๋ก ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

728x90