Skip to content

Momentory/Momentory_BackEnd

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Momentory Backend

์ถ”์–ต์„ ์ˆœ๊ฐ„์ˆœ๊ฐ„ ๊ธฐ๋กํ•˜๊ณ  ๊ณต์œ ํ•˜๋Š” ์œ„์น˜ ๊ธฐ๋ฐ˜ ์‚ฌ์ง„ SNS ํ”Œ๋žซํผ

icon

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

Momentory๋Š” ์‚ฌ์ง„์„ ํ†ตํ•ด ์ถ”์–ต์„ ๊ธฐ๋กํ•˜๊ณ , ์ง€์—ญ ๊ธฐ๋ฐ˜ ์Šคํƒฌํ”„๋ฅผ ์ˆ˜์ง‘ํ•˜๋ฉฐ, ์บ๋ฆญํ„ฐ๋ฅผ ์„ฑ์žฅ์‹œํ‚ค๋Š” ์†Œ์…œ ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์—ฌํ–‰์ง€์—์„œ ์ฐ์€ ์‚ฌ์ง„์„ ์—…๋กœ๋“œํ•˜๊ณ , ์ง€์—ญ ์Šคํƒฌํ”„์™€ ๋ฌธํ™” ์Šคํƒฌํ”„๋ฅผ ์ˆ˜์ง‘ํ•˜๋ฉฐ, ํฌ์ธํŠธ๋ฅผ ํš๋“ํ•˜์—ฌ ์บ๋ฆญํ„ฐ๋ฅผ ๊พธ๋ฐ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๐Ÿ“ธ ์‚ฌ์ง„ ๊ด€๋ฆฌ

  • ์‚ฌ์ง„ ์—…๋กœ๋“œ ๋ฐ ์œ„์น˜ ์ •๋ณด ์ž๋™ ์ถ”์ถœ
  • ์•จ๋ฒ”๋ณ„ ์‚ฌ์ง„ ๊ด€๋ฆฌ ๋ฐ ๊ณต์œ 
  • ์‚ฌ์ง„ ๊ณต๊ฐœ/๋น„๊ณต๊ฐœ ์„ค์ •
  • ์ปค์„œ ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง€๋„ค์ด์…˜

๐Ÿ—บ๏ธ ์ง€์—ญ ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ

  • GPS ๊ธฐ๋ฐ˜ ์ง€์—ญ ์Šคํƒฌํ”„ ์ž๋™ ์ˆ˜์ง‘
  • ๋ฌธํ™”์‹œ์„ค ๊ทผ์ฒ˜ ์‚ฌ์ง„ ์ดฌ์˜ ์‹œ ๋ฌธํ™” ์Šคํƒฌํ”„ ํš๋“
  • ์ค‘๋ณต ์Šคํƒฌํ”„ ์ž๋™ ํ•„ํ„ฐ๋ง
  • Tour API ์—ฐ๋™ ๋ฌธํ™”์‹œ์„ค ์ •๋ณด ์ œ๊ณต

๐ŸŽฏ ํฌ์ธํŠธ & ๋ ˆ๋ฒจ

  • ํ™œ๋™๋ณ„ ํฌ์ธํŠธ ํš๋“ (์‚ฌ์ง„ ์—…๋กœ๋“œ, ์ข‹์•„์š”, ํŒ”๋กœ์šฐ ๋“ฑ)
  • ์ผ์ผ ์ œํ•œ์œผ๋กœ ๊ณต์ •ํ•œ ํฌ์ธํŠธ ์‹œ์Šคํ…œ
  • ๋ˆ„์  ํฌ์ธํŠธ ๊ธฐ๋ฐ˜ ๋ ˆ๋ฒจ ์ž๋™ ๊ณ„์‚ฐ
  • ๋ ˆ๋ฒจ์—… ์‹œ ๋ณด๋„ˆ์Šค ํฌ์ธํŠธ ์ง€๊ธ‰
  • ๋™์‹œ์„ฑ ์ œ์–ด๋กœ ์ค‘๋ณต ๋ณด์ƒ ๋ฐฉ์ง€

๐ŸŽฎ ์บ๋ฆญํ„ฐ ์‹œ์Šคํ…œ

  • ๋‹ค์–‘ํ•œ ์บ๋ฆญํ„ฐ ํƒ€์ž… (๊ณ ์–‘์ด, ๊ฐ•์•„์ง€ ๋“ฑ)
  • ํฌ์ธํŠธ๋กœ ์•„์ดํ…œ ๊ตฌ๋งค ๋ฐ ์บ๋ฆญํ„ฐ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•
  • ์˜์ƒ, ํ‘œ์ •, ํšจ๊ณผ, ์žฅ์‹ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์•„์ดํ…œ ์žฅ์ฐฉ
  • ๋ ˆ๋ฒจ์— ๋”ฐ๋ฅธ ์บ๋ฆญํ„ฐ ์„ฑ์žฅ

๐ŸŽฒ ๋ฃฐ๋ › ์ด๋ฒคํŠธ

  • ํฌ์ธํŠธ๋ฅผ ์†Œ๋น„ํ•˜์—ฌ ๋ฃฐ๋ › ์‹คํ–‰
  • ์ง€์—ญ ์Šคํƒฌํ”„ ์ธ์ฆ์œผ๋กœ ์ถ”๊ฐ€ ๋ณด์ƒ ํš๋“
  • ํ™•๋ฅ  ๊ธฐ๋ฐ˜ ๋ฆฌ์›Œ๋“œ ์‹œ์Šคํ…œ

๐Ÿ‘ฅ ์ปค๋ฎค๋‹ˆํ‹ฐ

  • ํŒ”๋กœ์šฐ/ํŒ”๋กœ์›Œ ์‹œ์Šคํ…œ
  • ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ์กฐํšŒ ๋ฐ ๊ด€๋ฆฌ
  • ์ข‹์•„์š” ๋ฐ ๋Œ“๊ธ€ ๊ธฐ๋Šฅ

๐Ÿ”” ์•Œ๋ฆผ

  • ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ (WebSocket)
  • ๋ ˆ๋ฒจ์—…, ํŒ”๋กœ์šฐ, ์ข‹์•„์š” ๋“ฑ ๋‹ค์–‘ํ•œ ์•Œ๋ฆผ ํƒ€์ž…
  • ์•Œ๋ฆผ ์„ค์ • ๊ด€๋ฆฌ

๐Ÿ” ์ธ์ฆ & ๋ณด์•ˆ

  • JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ
  • ์นด์นด์˜ค ์†Œ์…œ ๋กœ๊ทธ์ธ
  • ์ด๋ฉ”์ผ ์ธ์ฆ (ํšŒ์›๊ฐ€์ž… ์‹œ)
  • Refresh Token ์ž๋™ ๊ฐฑ์‹ 

๊ธฐ์ˆ  ์Šคํƒ

Backend

  • Java 17
  • Spring Boot 3.3.4
  • Spring Data JPA - ORM ๋ฐ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ
  • QueryDSL - ํƒ€์ž… ์•ˆ์ „ํ•œ ์ฟผ๋ฆฌ ์ž‘์„ฑ
  • Spring Security - ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๊ด€๋ฆฌ
  • JWT - ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ
  • OAuth2 - ์นด์นด์˜ค ์†Œ์…œ ๋กœ๊ทธ์ธ

Database

  • MySQL 8 - ๋ฉ”์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
  • Hibernate - JPA ๊ตฌํ˜„์ฒด

Infrastructure

  • AWS S3 - ์ด๋ฏธ์ง€ ํŒŒ์ผ ์Šคํ† ๋ฆฌ์ง€
  • WebSocket - ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ

API Documentation

  • SpringDoc OpenAPI (Swagger) - API ๋ฌธ์„œ ์ž๋™ํ™”

External APIs

  • ์นด์นด์˜ค ๋งต API - ์œ„์น˜ ์ •๋ณด ๋ณ€ํ™˜
  • Tour API - ๋ฌธํ™”์‹œ์„ค ์ •๋ณด
image

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

src/main/java/com/example/momentory
โ”œโ”€โ”€ domain
โ”‚   โ”œโ”€โ”€ auth          # ์ธ์ฆ/์ธ๊ฐ€
โ”‚   โ”œโ”€โ”€ user          # ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ
โ”‚   โ”œโ”€โ”€ photo         # ์‚ฌ์ง„ ๊ด€๋ฆฌ
โ”‚   โ”œโ”€โ”€ album         # ์•จ๋ฒ” ๊ด€๋ฆฌ
โ”‚   โ”œโ”€โ”€ character     # ์บ๋ฆญํ„ฐ ์‹œ์Šคํ…œ
โ”‚   โ”œโ”€โ”€ point         # ํฌ์ธํŠธ ์‹œ์Šคํ…œ
โ”‚   โ”œโ”€โ”€ stamp         # ์Šคํƒฌํ”„ ์ˆ˜์ง‘
โ”‚   โ”œโ”€โ”€ map           # ์ง€์—ญ/์ง€๋„ ๊ธฐ๋Šฅ
โ”‚   โ”œโ”€โ”€ roulette      # ๋ฃฐ๋ › ๊ฒŒ์ž„
โ”‚   โ”œโ”€โ”€ community     # ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ๋Šฅ
โ”‚   โ”œโ”€โ”€ notification  # ์•Œ๋ฆผ
โ”‚   โ”œโ”€โ”€ home          # ํ™ˆ ํ™”๋ฉด
โ”‚   โ”œโ”€โ”€ file          # ํŒŒ์ผ ์—…๋กœ๋“œ (S3)
โ”‚   โ””โ”€โ”€ tag           # ํƒœ๊ทธ ์‹œ์Šคํ…œ
โ””โ”€โ”€ global
    โ”œโ”€โ”€ config        # ์„ค์ •
    โ”œโ”€โ”€ security      # ๋ณด์•ˆ ์„ค์ •
    โ”œโ”€โ”€ exception     # ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
    โ””โ”€โ”€ common        # ๊ณตํ†ต ์œ ํ‹ธ๋ฆฌํ‹ฐ

์‹œ์ž‘ํ•˜๊ธฐ

ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ

  • Java 17 ์ด์ƒ
  • MySQL 8.0 ์ด์ƒ
  • Gradle 7.0 ์ด์ƒ

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— .env ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋‹ค์Œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:

# Database
DB_URL=jdbc:mysql://localhost:3306/momentory
DB_USERNAME=your_db_username
DB_PASSWORD=your_db_password

# JWT
JWT_SECRET=your_jwt_secret_key
JWT_EXPIRATION=86400000
REFRESH_TOKEN_EXPIRATION=604800000

# AWS S3
AWS_ACCESS_KEY=your_aws_access_key
AWS_SECRET_KEY=your_aws_secret_key
AWS_REGION=ap-northeast-2
AWS_BUCKET=your_bucket_name

# Kakao OAuth
KAKAO_CLIENT_ID=your_kakao_client_id
KAKAO_CLIENT_SECRET=your_kakao_client_secret

# Email
APP_EMAIL[email protected]
APP_PASSWORD=your_email_app_password

# Kakao Map API
KAKAO_REST_API_KEY=your_kakao_rest_api_key

# Tour API
TOUR_API_KEY=your_tour_api_key

๋นŒ๋“œ ๋ฐ ์‹คํ–‰

# ํ”„๋กœ์ ํŠธ ํด๋ก 
git clone https://github.com/your-username/momentory-backend.git
cd momentory-backend

# ์˜์กด์„ฑ ์„ค์น˜ ๋ฐ ๋นŒ๋“œ
./gradlew clean build

# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰
./gradlew bootRun

์„œ๋ฒ„๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ http://localhost:8080์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

API ๋ฌธ์„œ ํ™•์ธ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ํ›„ Swagger UI์—์„œ API ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

http://localhost:8080/swagger-ui/index.html

์ฃผ์š” API ์—”๋“œํฌ์ธํŠธ

์ธ์ฆ

  • POST /api/auth/signup - ํšŒ์›๊ฐ€์ž…
  • POST /api/auth/signin - ๋กœ๊ทธ์ธ
  • POST /api/auth/refresh - ํ† ํฐ ๊ฐฑ์‹ 
  • GET /login/oauth2/code/kakao - ์นด์นด์˜ค ๋กœ๊ทธ์ธ ์ฝœ๋ฐฑ

์‚ฌ์ง„

  • POST /api/photos - ์‚ฌ์ง„ ์—…๋กœ๋“œ
  • GET /api/photos/{photoId} - ์‚ฌ์ง„ ์กฐํšŒ
  • PUT /api/photos/{photoId} - ์‚ฌ์ง„ ์ˆ˜์ •
  • DELETE /api/photos/{photoId} - ์‚ฌ์ง„ ์‚ญ์ œ

์Šคํƒฌํ”„

  • GET /api/stamps - ๋‚ด ์Šคํƒฌํ”„ ๋ชฉ๋ก ์กฐํšŒ
  • POST /api/stamps/cultural - ๋ฌธํ™” ์Šคํƒฌํ”„ ํš๋“

์บ๋ฆญํ„ฐ

  • GET /api/characters/current - ํ˜„์žฌ ์บ๋ฆญํ„ฐ ์กฐํšŒ
  • POST /api/characters - ์บ๋ฆญํ„ฐ ์ƒ์„ฑ
  • POST /api/characters/{characterId}/select - ์บ๋ฆญํ„ฐ ์„ ํƒ
  • POST /api/characters/{characterId}/equip/{itemId} - ์•„์ดํ…œ ์žฅ์ฐฉ

ํฌ์ธํŠธ

  • GET /api/points - ํฌ์ธํŠธ ์กฐํšŒ
  • GET /api/points/history - ํฌ์ธํŠธ ๋‚ด์—ญ ์กฐํšŒ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ

์ฃผ์š” ํ…Œ์ด๋ธ”:

  • users - ์‚ฌ์šฉ์ž ์ •๋ณด
  • user_profiles - ์‚ฌ์šฉ์ž ํ”„๋กœํ•„
  • photos - ์‚ฌ์ง„ ์ •๋ณด
  • albums - ์•จ๋ฒ”
  • characters - ์บ๋ฆญํ„ฐ
  • items - ์•„์ดํ…œ
  • user_items - ์‚ฌ์šฉ์ž ๋ณด์œ  ์•„์ดํ…œ
  • stamps - ์Šคํƒฌํ”„
  • point_histories - ํฌ์ธํŠธ ๋‚ด์—ญ
  • level_up_histories - ๋ ˆ๋ฒจ์—… ์ด๋ ฅ (์ค‘๋ณต ๋ฐฉ์ง€)
  • notifications - ์•Œ๋ฆผ

ํ•ต์‹ฌ ๊ธฐ๋Šฅ ๊ตฌํ˜„

์ค‘๋ณต ๋ฐฉ์ง€ ์‹œ์Šคํ…œ

๋ ˆ๋ฒจ์—… ๋ณด์ƒ ์ค‘๋ณต ๋ฐฉ์ง€

// level_up_histories ํ…Œ์ด๋ธ”์— (user_id, reached_level) ์œ ๋‹ˆํฌ ์ œ์•ฝ์กฐ๊ฑด
// ๋™์‹œ์„ฑ ๋ฌธ์ œ๋Š” DataIntegrityViolationException์œผ๋กœ ์ฒ˜๋ฆฌ

๋ฌธํ™” ์Šคํƒฌํ”„ ์ค‘๋ณต ๋ฐฉ์ง€

// ์ด๋ฏธ ๋ฐ›์€ ์Šคํƒฌํ”„๋Š” hasNearbyCulturalSpots = false
boolean alreadyHasStamp = stampRepository.existsByUserAndSpotName(user, spotName);

ํฌ์ธํŠธ ์‹œ์Šคํ…œ

์ผ์ผ ์ œํ•œ

  • ์‚ฌ์ง„ ์—…๋กœ๋“œ: 3ํšŒ/์ผ
  • ์ข‹์•„์š”: 50ํšŒ/์ผ
  • ํŒ”๋กœ์šฐ: 20ํšŒ/์ผ

ํฌ์ธํŠธ ์ข…๋ฅ˜

  • ํšŒ์›๊ฐ€์ž…: 500p
  • ์‚ฌ์ง„ ์—…๋กœ๋“œ: 50p
  • ๋ ˆ๋ฒจ์—…: 200p
  • ์ข‹์•„์š” ๋ฐ›๊ธฐ: 5p
  • ํŒ”๋กœ์›Œ ์ฆ๊ฐ€: 10p
  • ๋ฃฐ๋ › ์ธ์ฆ: 500p

๋ ˆ๋ฒจ ์‹œ์Šคํ…œ

๋ ˆ๋ฒจ์€ ๋ˆ„์  ํฌ์ธํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž๋™ ๊ณ„์‚ฐ:

  • ๋ ˆ๋ฒจ 1: 0p
  • ๋ ˆ๋ฒจ 2: 100p
  • ๋ ˆ๋ฒจ 3: 300p
  • ๋ ˆ๋ฒจ N: 100 * (N-1) * N / 2

๋ณด์•ˆ

  • JWT ๊ธฐ๋ฐ˜ Stateless ์ธ์ฆ
  • Refresh Token์œผ๋กœ ๋ณด์•ˆ์„ฑ ๊ฐ•ํ™”
  • CORS ์„ค์ •์œผ๋กœ ํ—ˆ์šฉ๋œ ์ถœ์ฒ˜๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • SQL Injection ๋ฐฉ์ง€ (Prepared Statement)
  • XSS ๋ฐฉ์ง€ (์ž…๋ ฅ ๊ฒ€์ฆ)

๊ฐœ๋ฐœ ํ™˜๊ฒฝ

spring:
  profiles:
    active: local
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

๋นŒ๋“œ ์‹คํŒจ ์‹œ

./gradlew clean
./gradlew build --refresh-dependencies

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์‹คํŒจ ์‹œ

  • MySQL ์„œ๋ฒ„ ์‹คํ–‰ ํ™•์ธ
  • .env ํŒŒ์ผ์˜ DB ์„ค์ • ํ™•์ธ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ ํ™•์ธ: CREATE DATABASE momentory;

๊ธฐ์—ฌํ•˜๊ธฐ

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

๋ผ์ด์„ ์Šค

This project is licensed under the MIT License.

์—ฐ๋ฝ์ฒ˜

ํ”„๋กœ์ ํŠธ ๊ด€๋ จ ๋ฌธ์˜: [email protected]


โญ Star this repository if you find it helpful!

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •