Skip to content

1-6P/goat-gam

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿฑ ๊ณง๊ฐ (GoatGam)

์Œ์‹ ๋ฐฐ๋‹ฌ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค

image

โ‡๏ธ ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

๊ฐœ๋ฐœ ๊ธฐ๊ฐ„ ๋ฐ ์ธ์›

  • 2025.09.26 ~ 2025.10.20 (4์ฃผ)
  • ์ด 6๋ช… (๋ฐฑ์—”๋“œ 6๋ช…)

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

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

๊ณณ๊ฐ์€ ์ด๋ฉ”์ผ์„ ํ†ตํ•œ ๊ฐ€์ž…์„ ์ง€์›ํ•˜๋ฉฐ ๊ฐ€์ž… ์‹œ Customer, Owner ๋“ฑ ์‚ฌ์šฉ์ž ์œ ํ˜•์„ ์„ ํƒํ•˜์—ฌ ๊ฐ€์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

'Master' ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ 'Manager'๋ฅผ ์ง€์ •ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ง€์ •๋œ 'Manager'๋Š” 'Customer'๊ณผ 'Owner' ์‚ฌ์šฉ์ž๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์‚ฌ์šฉ์ž์˜ ์ฃผ๋ฌธ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์‚ญ์ œ๋œ ์‹๋‹น์„ ๋‹ค์‹œ ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋œ ์‚ฌ์šฉ์ž๋ฅผ ๋‹ค์‹œ ๊ฐ€์ž…์‹œ์ผœ์ฃผ๋Š” ๋“ฑ ์‚ญ์ œ๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๋งํฌ

๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ ํŒ€์› ์†Œ๊ฐœ

MVP ๊ธฐ๋Šฅ ๊ตฌํ˜„
์žฅ๋ฐ”๊ตฌ๋‹ˆ
์ฃผ๋ฌธ ๋‚ด์—ญ
๊ณตํ†ต
์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ•ธ๋“ค๋Ÿฌ
๊ทธ ์™ธ
๊ธฐ๋Šฅ ๊ฒ€์ฆ ๋ฐ ๋ณด์™„
์‹๋‹น
์‹๋‹น API ๊ฐœ๋ฐœ
ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ
์นดํŠธ ํ…Œ์ŠคํŠธ
๊ณตํ†ต
์ฝ”๋“œ ๋ฆฌ๋ทฐ
ํŒ”๋กœ์šฐ & ๋ฆฌ๋ทฐ
ํŒ”๋กœ์šฐ API ๊ฐœ๋ฐœ
๋ฆฌ๋ทฐ API ๊ฐœ๋ฐœ
ERD ์—ฐ๊ด€๊ด€๊ณ„ ์ •์˜
ํ…Œ์ŠคํŠธ
ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ
์‹๋‹น
์‹๋‹น API ๊ฐœ๋ฐœ
ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ
๊ณตํ†ต
์˜ˆ์™ธ ์ฒ˜๋ฆฌ
๋ฌธ์„œํ™”
์ธ์ฆ/์ธ๊ฐ€
JWT ์ธ์ฆ ๊ตฌํ˜„
Spring Security
์ธํ”„๋ผ
AWS EC2/RDS/IAM
์ฃผ์†Œ/์ง€์—ญ ๊ด€๋ฆฌ
์Œ์‹/์˜ต์…˜
์Œ์‹, ์˜ต์…˜ API ๊ฐœ๋ฐœ
์ฃผ๋ฌธ์ฒ˜๋ฆฌ
์ฃผ๋ฌธ์ฒ˜๋ฆฌ ๊ตฌํ˜„
AI
AI์„œ๋น„์Šค ๊ตฌํ˜„
๊ฒฐ์ œ
๊ฒฐ์ œ ์‹œ์Šคํ…œ ๊ตฌํ˜„
๋ฐฐํฌ
Docker
GitHub Actions

ํ”„๋กœ์ ํŠธ ์„ค๊ณ„

ERD

https://github.com/user-attachments/assets/4cf8cebe-855f-46eb-b15d-9280efe31bcb

๐Ÿš€ ๊ธฐ์ˆ  ์Šคํƒ

Category Stack
Language Java
IDE intellij-idea
Framework Spring Boot
Build Tool gradle
Database PostgreSQL
Library Spring Security JPA JUnit5 Mockito
API Swagger Google Gemini RestClient
DevOps GitHub Actions Docker Amazon Web Services amazon ec2 amazon rds
Tools GitHub git slack notion discord
๐Ÿ“ฃ๊ธฐ์ˆ  & ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ ์ • ์ด์œ 

1๏ธโƒฃ Spring Boot 3.5.6
1. ์ž๋™ ์„ค์ • ๊ธฐ๋Šฅ์œผ๋กœ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
2. ์Šคํƒ€ํ„ฐ ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.
3. ๋‚ด์žฅ ์„œ๋ฒ„๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋ณ„๋„์˜ WAS ์„ค์ • ์—†์ด ๋ฐ”๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
4. ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ๋ณด์•ˆ ํŒจ์น˜์™€ ์„ฑ๋Šฅ ๊ฐœ์„ ์ด ๋ฐ˜์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
2๏ธโƒฃ PostgreSQL
1. ๋ฌด๋ฃŒ๋กœ ์ œ๊ณต๋˜๋Š” ์˜คํ”ˆ์†Œ์Šค RDBMS์ž…๋‹ˆ๋‹ค.
2. ์•ˆ์ •์„ฑ๊ณผ ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚˜๋ฉฐ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
3. JSON ํƒ€์ž… ์ง€์› ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
4. ACID ํŠน์„ฑ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
3๏ธโƒฃ JWT & Spring Security
1. Statelessํ•œ ์ธ์ฆ ๋ฐฉ์‹์œผ๋กœ ์„œ๋ฒ„ ํ™•์žฅ์„ฑ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
2. Spring Security์™€์˜ ์™„๋ฒฝํ•œ ํ†ตํ•ฉ์œผ๋กœ ๋ณด์•ˆ ๊ตฌํ˜„์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.
3. ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์œผ๋กœ ์„ธ์…˜ ๊ด€๋ฆฌ ๋ถ€๋‹ด์ด ์—†์Šต๋‹ˆ๋‹ค.
4. ์—ญํ•  ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด(RBAC)๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
4๏ธโƒฃ Docker
1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ ์šด์˜ ํ™˜๊ฒฝ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
2. ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜์—ฌ ์‹œ์Šคํ…œ ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
3. ์ด๋ฏธ์ง€ ๊ธฐ๋ฐ˜์œผ๋กœ ๋น ๋ฅธ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
4. ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋กœ์˜ ํ™•์žฅ์ด ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.
5๏ธโƒฃ GitHub Actions
1. GitHub์™€ ์™„๋ฒฝํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜์–ด ๋ณ„๋„์˜ CI/CD ๋„๊ตฌ ์„ค์ •์ด ๋ถˆํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
2. YAML ํŒŒ์ผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
3. ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ์™€ ๋ฐฐํฌ๋กœ ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
4. ๋ฌด๋ฃŒ ํ‹ฐ์–ด์—์„œ๋„ ์ถฉ๋ถ„ํ•œ ๋นŒ๋“œ ์‹œ๊ฐ„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
6๏ธโƒฃ RestClient
1. RestTemplate์˜ ํ›„์† ๋ฒ„์ „์œผ๋กœ ๋” ๋‚˜์€ ์„ฑ๋Šฅ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
2. ๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๊ณ  ํ•™์Šต ๊ณก์„ ์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค.
3. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ  ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.
4. ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์—์„œ๋Š” ๋น„๋™๊ธฐ๋ณด๋‹ค ๋™๊ธฐ ๋ฐฉ์‹์ด ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
7๏ธโƒฃ Google Gemini API
1. ๋ฉ”๋‰ด ์„ค๋ช… ์ž๋™ ์ƒ์„ฑ์œผ๋กœ ์‚ฌ์žฅ๋‹˜์˜ ์—…๋ฌด ๋ถ€๋‹ด์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
2. ์ž์—ฐ์Šค๋Ÿฌ์šด ํ•œ๊ตญ์–ด ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
3. API ํ˜ธ์ถœ์ด ๊ฐ„๋‹จํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
4. ๋ฌด๋ฃŒ ํ‹ฐ์–ด๋กœ ํ”„๋กœ์ ํŠธ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
8๏ธโƒฃ JUnit5 & Mockito
1. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์œผ๋กœ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
2. Mock ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ๊ฒฉ๋ฆฌํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
3. ํ…Œ์ŠคํŠธ ์ž๋™ํ™”๋กœ ๋ฆฌํŒฉํ† ๋ง ์‹œ ์•ˆ์ „์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
4. Spring Boot์™€์˜ ํ†ตํ•ฉ์ด ์šฐ์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ ์•„ํ‚คํ…์ฒ˜

architecture

๊ณง๊ฐ ์•„ํ‚คํ…์ฒ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:
- GitHub Actions๋ฅผ ํ†ตํ•œ ์ž๋™ ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ
- Docker ์ปจํ…Œ์ด๋„ˆํ™”๋กœ ์ผ๊ด€๋œ ์‹คํ–‰ ํ™˜๊ฒฝ ์ œ๊ณต
- AWS EC2์— ์ž๋™ ๋ฐฐํฌ
- PostgreSQL RDS๋กœ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ
- EC2 ์ธ๋ฐ”์šด๋“œ ๊ทœ์น™์„ ํ†ตํ•œ ์ ‘๊ทผ ์ œ์–ด

ํ…Œ์ด๋ธ” ๊ตฌ์กฐ (์ด 19๊ฐœ)

์ƒ์„ธ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ

๐Ÿ‘ค ์œ ์ € ๊ด€๋ จ (4๊ฐœ)

  • ์œ ์ € (Users)
  • ์ฃผ์†Œ (Address)
  • ์ง€์—ญ (Region)
  • ์ฐœ (Favorite)

๐Ÿช ์‹๋‹น ๊ด€๋ จ (6๊ฐœ)

  • ์‹๋‹น (Restaurant)
  • ์‹๋‹น ๋ถ„๋ฅ˜ ์นดํ…Œ๊ณ ๋ฆฌ (Category)
  • ๋ฉ”๋‰ด (Menu)
  • ์Œ์‹ (Food)
  • ์ถ”๊ฐ€ ์˜ต์…˜ (FoodOption)
  • ๋ฆฌ๋ทฐ (Review)

๐Ÿ›’ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๊ด€๋ จ (3๊ฐœ)

  • ์žฅ๋ฐ”๊ตฌ๋‹ˆ (Cart)
  • ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ณ„ ์Œ์‹ ์ •๋ณด (CartFood)
  • ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‚ด ์Œ์‹ ๋ณ„ ์˜ต์…˜ ์ •๋ณด (CartFoodOption)

๐Ÿ“ฆ ์ฃผ๋ฌธ ๊ด€๋ จ (3๊ฐœ)

  • ์ฃผ๋ฌธ ๋‚ด์—ญ (Order)
  • ์ฃผ๋ฌธ ๋‚ด์—ญ ๋ณ„ ์Œ์‹ ์ •๋ณด (OrderFood)
  • ๊ฒฐ์ œ (Payment)

๐Ÿค– AI (1๊ฐœ)

  • AI ๋กœ๊ทธ (AI)

๋„๋ฉ”์ธ ๊ตฌ์„ฑ

โœ… ์ธ์ฆ/์ธ๊ฐ€: JWT ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž…
โœ… ์ฃผ์†Œ ๊ด€๋ฆฌ: ๋ฒ•์ •๋™ ์ฃผ์†Œ ๋ฐ์ดํ„ฐ ์—ฐ๋™, ์‚ฌ์šฉ์ž ์ฃผ์†Œ ๊ด€๋ฆฌ
โœ… ์‹๋‹น/๋ฉ”๋‰ด: ์กฐํšŒ, ๊ฒ€์ƒ‰, ํŽ˜์ด์ง•, ์‚ฌ์žฅ๋‹˜ ์ „์šฉ ๊ด€๋ฆฌ
โœ… ์žฅ๋ฐ”๊ตฌ๋‹ˆ: ๋‹ด๊ธฐ/์ˆ˜์ •/์‚ญ์ œ ๋ฐ ํ•ฉ๊ณ„ ๊ณ„์‚ฐ
โœ… ์ฃผ๋ฌธ/๊ฒฐ์ œ: ์ฃผ๋ฌธ ์ƒ์„ฑ/์ƒํƒœ ๊ด€๋ฆฌ, ๊ฒฐ์ œ ๋ชจ๋“ˆ ์—ฐ๋™
โœ… ๋ฆฌ๋ทฐ/ํŒ”๋กœ์šฐ: ๊ฐ€๊ฒŒ ๋ฆฌ๋ทฐ ์ž‘์„ฑ/์กฐํšŒ, ํŒ”๋กœ์šฐ ๊ธฐ๋ฐ˜ ํ”ผ๋“œ
โœ… AI: Google Gemini API๋ฅผ ํ™œ์šฉํ•œ ๋ฉ”๋‰ด ์„ค๋ช… ์ƒ์„ฑ

๐Ÿ›  ์ฃผ์š” ๊ธฐ๋Šฅ

๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง ์œ ์ €: ๋กœ๊ทธ์ธ | ํšŒ์›๊ฐ€์ž… | JWT ์ธ์ฆ | ๊ถŒํ•œ ๊ด€๋ฆฌ
๐Ÿช ์‹๋‹น: ๊ฒ€์ƒ‰ | ์กฐํšŒ | ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํ•„ํ„ฐ๋ง | ํŽ˜์ด์ง• | ์‚ฌ์žฅ๋‹˜ ์ „์šฉ ๊ด€๋ฆฌ
๐Ÿฑ ๋ฉ”๋‰ด: ์Œ์‹ ์กฐํšŒ | ์˜ต์…˜ ์„ ํƒ | AI ์„ค๋ช… ์ƒ์„ฑ
๐Ÿ›’ ์žฅ๋ฐ”๊ตฌ๋‹ˆ: ๋‹ด๊ธฐ | ์ˆ˜์ • | ์‚ญ์ œ
๐Ÿ“ฆ ์ฃผ๋ฌธ: ์ฃผ๋ฌธ ์ƒ์„ฑ | ์ƒํƒœ ๊ด€๋ฆฌ | ์ฃผ๋ฌธ ๋‚ด์—ญ ์กฐํšŒ
๐Ÿ’ณ ๊ฒฐ์ œ: ๊ฒฐ์ œ ์ฒ˜๋ฆฌ | ๊ฒฐ์ œ ๋‚ด์—ญ ๊ด€๋ฆฌ
โญ ๋ฆฌ๋ทฐ: ๋ฆฌ๋ทฐ ์ž‘์„ฑ | ์กฐํšŒ | ํ‰์  ๊ด€๋ฆฌ
โค๏ธ ํŒ”๋กœ์šฐ: ์‹๋‹น ํŒ”๋กœ์šฐ | ํ”ผ๋“œ ์กฐํšŒ
๐Ÿ“ ์ฃผ์†Œ: ์ฃผ์†Œ ๋“ฑ๋ก | ๊ด€๋ฆฌ | ๋ฒ•์ •๋™ ์ฃผ์†Œ ์—ฐ๋™
1๏ธโƒฃ JWT ์ธ์ฆ/์ธ๊ฐ€
  • Spring Security์™€ JWT๋ฅผ ํ™œ์šฉํ•œ Stateless ์ธ์ฆ
  • Customer์™€ Owner ์—ญํ•  ๊ตฌ๋ถ„
  • ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์œผ๋กœ ํ™•์žฅ์„ฑ ํ™•๋ณด
  • @PreAuthorize๋ฅผ ํ†ตํ•œ ์„ธ๋ฐ€ํ•œ ๊ถŒํ•œ ์ œ์–ด
2๏ธโƒฃ ์‹๋‹น ๊ด€๋ฆฌ
  • ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์‹๋‹น ์กฐํšŒ
  • ๊ฒ€์ƒ‰ ๋ฐ ํŽ˜์ด์ง• ๊ธฐ๋Šฅ
  • ์‚ฌ์žฅ๋‹˜ ์ „์šฉ ์‹๋‹น ๋“ฑ๋ก/์ˆ˜์ •/์‚ญ์ œ
  • ์‹๋‹น ์ƒํƒœ ๊ด€๋ฆฌ (์˜คํ”ˆ/๋งˆ๊ฐ)
3๏ธโƒฃ ์žฅ๋ฐ”๊ตฌ๋‹ˆ & ์ฃผ๋ฌธ
  • ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์Œ์‹ ๋ฐ ์˜ต์…˜ ์ถ”๊ฐ€
  • ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ˆ˜์ •/์‚ญ์ œ ๊ธฐ๋Šฅ
  • ์ฃผ๋ฌธ ์ƒ์„ฑ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ
  • ์ฃผ๋ฌธ ๋‚ด์—ญ ์กฐํšŒ ๋ฐ ์ƒ์„ธ ์ •๋ณด ํ™•์ธ
4๏ธโƒฃ AI ๋ฉ”๋‰ด ์„ค๋ช…
  • Google Gemini API ์—ฐ๋™
  • ๋ฉ”๋‰ด๋ช… ๊ธฐ๋ฐ˜ ์ž๋™ ์„ค๋ช… ์ƒ์„ฑ
  • ์‚ฌ์žฅ๋‹˜์˜ ์—…๋ฌด ํšจ์œจํ™”
  • AI ํ˜ธ์ถœ ๋กœ๊ทธ ์ €์žฅ
5๏ธโƒฃ ๋ฆฌ๋ทฐ ์‹œ์Šคํ…œ
  • ๋ฐฐ๋‹ฌ ์™„๋ฃŒ๋œ ์ฃผ๋ฌธ์— ๋Œ€ํ•œ ๋ฆฌ๋ทฐ ์ž‘์„ฑ
  • ๋ฆฌ๋ทฐ ์ˆ˜์ •/์‚ญ์ œ (Soft Delete)
  • ์ฃผ๋ฌธ๋ณ„ ๋ฆฌ๋ทฐ ๊ด€๋ฆฌ
  • ๋ฆฌ๋ทฐ ์กฐํšŒ ๊ธฐ๋Šฅ
6๏ธโƒฃ ์ฃผ์†Œ ๊ด€๋ฆฌ
  • ๋ฒ•์ •๋™ ์ฃผ์†Œ ๋ฐ์ดํ„ฐ CSV ๋กœ๋”ฉ
  • ์‹œ๋„/์‹œ๊ตฐ๊ตฌ/๋ฒ•์ •๋™ ๊ณ„์ธต ๊ตฌ์กฐ
  • ์‚ฌ์šฉ์ž๋ณ„ ์ฃผ์†Œ ๋“ฑ๋ก/๊ด€๋ฆฌ
  • ๊ธฐ๋ณธ ๋ฐฐ์†ก์ง€ ์„ค์ •
7๏ธโƒฃ ํŒ”๋กœ์šฐ
  • ์‹๋‹น ํŒ”๋กœ์šฐ/์–ธํŒ”๋กœ์šฐ
  • ํŒ”๋กœ์šฐํ•œ ์‹๋‹น ๋ชฉ๋ก ์กฐํšŒ
  • ํŒ”๋กœ์šฐ ์ƒํƒœ ํ™•์ธ

โญ CI/CD

GitHub Actions

main ๋ธŒ๋žœ์น˜์— Push ์‹œ ์ž๋™์œผ๋กœ ๋นŒ๋“œ/ํ…Œ์ŠคํŠธ/๋ฐฐํฌ๊ฐ€ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค

  ```yaml
  - ์ฝ”๋“œ ์ฒดํฌ์•„์›ƒ
  - Gradle ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ
  - Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ
  - EC2๋กœ ์ด๋ฏธ์ง€ ์ „์†ก
  - ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
  ```

โœ… ํ…Œ์ŠคํŠธ ํ†ต๊ณผ ํ›„ ์ž๋™ ๋ฐฐํฌ

โœ… Docker๋ฅผ ํ†ตํ•œ ์ผ๊ด€๋œ ์‹คํ–‰ ํ™˜๊ฒฝ

โœ… EC2์—์„œ ์•ˆ์ •์ ์ธ ์„œ๋น„์Šค ์ œ๊ณต

Docker

Dockerfile์„ ํ†ตํ•œ ์ปจํ…Œ์ด๋„ˆ ๋นŒ๋“œ๋กœ ํ™˜๊ฒฝ ์ผ๊ด€์„ฑ ์œ ์ง€

    ```dockerfile
    FROM openjdk:17-jdk-slim
    COPY build/libs/*.jar app.jar
    ENTRYPOINT ["java","-jar","/app.jar"]
    ```

โœ… ๊ฐœ๋ฐœ/์šด์˜ ํ™˜๊ฒฝ ๋™์ผํ™”

โœ… ๋น ๋ฅธ ๋ฐฐํฌ์™€ ๋กค๋ฐฑ

๐Ÿž Trouble Shooting

1๏ธโƒฃ PostgreSQL ์„ค์น˜ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

๋ฌธ์ œ

  • PostgreSQL์„ ๋กœ์ปฌ์— ์„ค์น˜ํ•˜๋Š” ๊ณผ์ •์—์„œ ์—๋Ÿฌ ์ฝ”๋“œ 1 ๋ฐœ์ƒ
  • ์„ค์น˜ ๊ฒฝ๋กœ์— ํ•œ๊ธ€์ด ํฌํ•จ๋˜์–ด ์„ค์น˜ ์‹คํŒจ

์›์ธ

  • ํ•œ๊ธ€ ๊ฒฝ๋กœ๋กœ ์ธํ•œ ์„ค์น˜ ์˜ค๋ฅ˜

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

  • DBeaver๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›๊ฒฉ RDS์— ์ง์ ‘ ์ ‘๊ทผ
  • ๋กœ์ปฌ ์„ค์น˜ ์—†์ด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์„ฑ

๊ฒฐ๊ณผ

  • โœ… ํŒ€์› ๋ชจ๋‘ ๋™์ผํ•œ DB ํ™˜๊ฒฝ์—์„œ ์ž‘์—… ๊ฐ€๋Šฅ
  • โœ… ์ดˆ๊ธฐ ํ™˜๊ฒฝ ๊ตฌ์ถ• ์‹œ๊ฐ„ ๋‹จ์ถ•
  • โœ… ๊ฒฝ๋กœ ์˜ค๋ฅ˜ ๊ทผ๋ณธ์  ํ•ด๊ฒฐ
2๏ธโƒฃ Spring Security ๊ถŒํ•œ ๊ฑฐ๋ถ€ ์‘๋‹ต ๊ฐœ์„ 

๋ฌธ์ œ

  • @PreAuthorize๋กœ ๊ถŒํ•œ ์ œ์–ด ์‹œ 403 ์—๋Ÿฌ๋งŒ ๋ฐ˜ํ™˜
  • Swagger์—์„œ ์—๋Ÿฌ ์ƒ์„ธ ์ •๋ณด ํ™•์ธ ๋ถˆ๊ฐ€

์›์ธ

  • ๊ธฐ๋ณธ AccessDeniedHandler๊ฐ€ HTML ๊ธฐ๋ฐ˜ ์—๋Ÿฌ ํŽ˜์ด์ง€ ๋ฐ˜ํ™˜
  • API ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ๋‹จ์ˆœ 403๋งŒ ํ‘œ์‹œ๋จ

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

  • ์ปค์Šคํ…€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ•ธ๋“ค๋Ÿฌ ๊ตฌํ˜„
  • JSON ํ˜•ํƒœ์˜ ์ƒ์„ธ ์—๋Ÿฌ ์‘๋‹ต ๋ฐ˜ํ™˜

๊ฒฐ๊ณผ

{
  "status": 403,
  "error": "Forbidden",
  "message": "์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค.",
  "path": "/api/v1/user"
}
  • โœ… ๋ช…ํ™•ํ•œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ œ๊ณต
  • โœ… ๋””๋ฒ„๊น… ํšจ์œจ ํ–ฅ์ƒ
  • โœ… API ์‘๋‹ต ์ผ๊ด€์„ฑ ํ™•๋ณด
3๏ธโƒฃ ์ฃผ๋ฌธ ์ƒ์„ฑ ์‹œ ๋‹ค์ค‘ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

๋ฌธ์ œ

  • POST /api/orders ํ˜ธ์ถœ ์‹œ ์ˆœ์ฐจ์  ์˜ค๋ฅ˜ ๋ฐœ์ƒ
    1. HttpMediaTypeNotAcceptableException
    2. HttpMessageNotReadableException
    3. SQL NOT NULL ์ œ์•ฝ ์กฐ๊ฑด ์œ„๋ฐ˜

์›์ธ

  1. DTO์— getter ์—†์–ด JSON ๋ณ€ํ™˜ ๋ถˆ๊ฐ€
  2. @RequestBody String ํƒ€์ž… ๋ถˆ์ผ์น˜
  3. ํด๋ž˜์Šค ๋ ˆ๋ฒจ @Transactional(readOnly = true)๋กœ INSERT ๋ฌด์‹œ
  4. ์—”ํ‹ฐํ‹ฐ์™€ DB ์Šคํ‚ค๋งˆ ๋ถˆ์ผ์น˜

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

  1. DTO๋ฅผ record๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ž๋™ getter ์ƒ์„ฑ
  2. ์š”์ฒญ DTO ํƒ€์ž…์„ ์ ์ ˆํ•œ ๊ฐ์ฒด๋กœ ๋ณ€๊ฒฝ
  3. ์“ฐ๊ธฐ ๋ฉ”์„œ๋“œ์— @Transactional ์˜ค๋ฒ„๋ผ์ด๋“œ
  4. DB ์Šคํ‚ค๋งˆ์™€ ์—”ํ‹ฐํ‹ฐ ๋™๊ธฐํ™”

๊ฒฐ๊ณผ

  • โœ… JSON ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™” ์ •์ƒ ์ž‘๋™
  • โœ… ํŠธ๋žœ์žญ์…˜ ์ •์ƒ ์ปค๋ฐ‹
  • โœ… ๋ถˆํ•„์š”ํ•œ ์ปฌ๋Ÿผ ์ œ๊ฑฐ
  • โœ… ์•ˆ์ •์ ์ธ ์ฃผ๋ฌธ ์ƒ์„ฑ ๊ธฐ๋Šฅ
4๏ธโƒฃ ํšŒ์›๊ฐ€์ž… ์‹œ ์ธ์ฆ ์ •๋ณด ์˜ค๋ฅ˜

๋ฌธ์ œ

  • ํšŒ์›๊ฐ€์ž… ์‹œ UserDetailsImpl ์บ์ŠคํŒ… ์˜ค๋ฅ˜ ๋ฐœ์ƒ
  • SecurityContextHolder๊ฐ€ ์ธ์ฆ์ •๋ณด๋ฅผ ์ฐพ์ง€ ๋ชปํ•จ

์›์ธ

  • ํšŒ์›๊ฐ€์ž…์€ ์ธ์ฆ ์—†์ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ API
  • principal์ด "anonymous" ๋ฌธ์ž์—ด์ด๋ผ ์บ์ŠคํŒ… ๋ถˆ๊ฐ€

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

if(principal instanceof UserDetailsImpl){
        return((UserDetailsImpl)principal).

getUsername();
}
        return"SYSTEM";

๊ฒฐ๊ณผ

  • โœ… ๋ฏธ์ธ์ฆ ์‚ฌ์šฉ์ž ์ž‘์—… ์‹œ "SYSTEM" ๊ธฐ๋ก
  • โœ… ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋Š” ๋‹‰๋„ค์ž„ ๊ธฐ๋ก
  • โœ… created_by, updated_by ์ถ”์  ๊ฐ€๋Šฅ
5๏ธโƒฃ Soft Delete ๋ฐ์ดํ„ฐ ์กฐํšŒ ๋ฌธ์ œ

๋ฌธ์ œ

  • Cart ์กฐํšŒ ์‹œ ์‚ญ์ œ๋œ CartFood์™€ CartFoodOption๊นŒ์ง€ ์กฐํšŒ๋จ
  • Soft Deleteํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•จ๊ป˜ ๋ฐ˜ํ™˜๋จ

์›์ธ

  • ์—ฐ๊ด€ ์—”ํ‹ฐํ‹ฐ์— ์กฐํšŒ ์กฐ๊ฑด์ด ์ ์šฉ๋˜์ง€ ์•Š์Œ
  • is_deleted = true์ธ ๋ฐ์ดํ„ฐ๊นŒ์ง€ ์ „๋ถ€ ์กฐํšŒ

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

@OneToMany(mappedBy = "cart")
@SQLRestriction("is_deleted = false")
private List<CartFood> cartFoods;

๊ฒฐ๊ณผ

  • โœ… ์‚ญ์ œ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋งŒ ์กฐํšŒ
  • โœ… ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ์œ ์ง€
  • โœ… ๋ถˆํ•„์š”ํ•œ ํ•„ํ„ฐ๋ง ๋กœ์ง ์ œ๊ฑฐ
6๏ธโƒฃ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์Œ์‹ ์ถ”๊ฐ€ ์‹œ ID ๋ฏธ์ƒ์„ฑ ์˜ค๋ฅ˜

๋ฌธ์ œ

  • ์ƒˆ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒ์„ฑ ํ›„ ์Œ์‹ ์ถ”๊ฐ€ ์‹œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ
  • ์™ธ๋ž˜ํ‚ค ์ฐธ์กฐ ์‹คํŒจ

์›์ธ

  • Cart.create()๋กœ ์ƒ์„ฑํ•œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉ
  • ID๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์ฐธ์กฐ ์‹œ๋„

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

Cart newCart = Cart.create(user, restaurant);
cartRepository.

save(newCart); // ์ €์žฅ ํ›„ ์‚ฌ์šฉ

๊ฒฐ๊ณผ

  • โœ… ์•ˆ์ „ํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ์กฐํšŒ
  • โœ… ์™ธ๋ž˜ํ‚ค ์ฐธ์กฐ ์ •์ƒ ์ž‘๋™
  • โœ… ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๊ธฐ๋Šฅ ์•ˆ์ •ํ™”
7๏ธโƒฃ ์‹๋‹น ์ •๋ณด ์ ‘๊ทผ ๊ถŒํ•œ ๋ฌธ์ œ

๋ฌธ์ œ

  • ์‹๋‹น ๋“ฑ๋ก/์ˆ˜์ •/์‚ญ์ œ ์‹œ ๋ณธ์ธ ํ™•์ธ ์—†์ด ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ๋‹ค๋ฅธ ์‚ฌ์žฅ๋‹˜์˜ ์‹๋‹น ์ •๋ณด ์ˆ˜์ • ๊ฐ€๋Šฅ

์›์ธ

  • ๋ณธ์ธ ID ์ฒดํฌ ๋กœ์ง ๋ถ€์žฌ
  • ๊ถŒํ•œ๋งŒ ํ™•์ธํ•˜๊ณ  ์†Œ์œ ๊ถŒ์€ ๋ฏธํ™•์ธ

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

if(!restaurant.getOwnerId().

equals(user.getId())){
        throw new

UnauthorizedException("๋ณธ์ธ์˜ ์‹๋‹น๋งŒ ์ˆ˜์ • ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค");
}

๊ฒฐ๊ณผ

  • โœ… ๋ณธ์ธ ์‹๋‹น๋งŒ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
  • โœ… ๊ถŒํ•œ๊ณผ ์†Œ์œ ๊ถŒ ์ด์ค‘ ๊ฒ€์ฆ
  • โœ… ๋ฐ์ดํ„ฐ ๋ณด์•ˆ ๊ฐ•ํ™”
8๏ธโƒฃ ๋ฆฌ๋ทฐ ์žฌ์ž‘์„ฑ ์‹œ Unique ์ œ์•ฝ ์กฐ๊ฑด ์œ„๋ฐ˜

๋ฌธ์ œ

  • ๋ฆฌ๋ทฐ ์ž‘์„ฑ โ†’ ์‚ญ์ œ โ†’ ์žฌ์ž‘์„ฑ ์‹œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ
  • Soft Delete๋กœ ์ธํ•ด ์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” ๋‚จ์•„์žˆ์–ด Unique ์ œ์•ฝ ์œ„๋ฐ˜

์›์ธ

  • ์ฃผ๋ฌธ๊ณผ ๋ฆฌ๋ทฐ๊ฐ€ 1:1 ๊ด€๊ณ„
  • ์™ธ๋ž˜ํ‚ค์— Unique ์ œ์•ฝ ์กฐ๊ฑด ์กด์žฌ

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

  1. ์ฃผ๋ฌธ๊ณผ ๋ฆฌ๋ทฐ ๊ด€๊ณ„๋ฅผ 1:N์œผ๋กœ ๋ณ€๊ฒฝ
  2. ๋ฆฌ๋ทฐ ์ƒ์„ฑ ์‹œ ํ™œ์„ฑ ์ƒํƒœ ํ™•์ธ ๋กœ์ง ์ถ”๊ฐ€
if(reviewRepository.existsByOrderIdAndStatusTrue(orderId))

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 7