Skip to content

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

ย 

History

710 Commits

Folders and files

Repository files navigation

AfterNote-Server

๋งˆ์ง€๋ง‰ ์ˆœ๊ฐ„์˜ ์˜จ๊ธฐ๋ฅผ ์ „ํ•˜๋‹ค - ์• ํ”„ํ„ฐ๋…ธํŠธ๋Š” ์‚ฌํ›„์— ์ „๋‹ฌ๋˜๋Š” ํŽธ์ง€ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

AfterNote ํ”„๋กœ์ ํŠธ์˜ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

๐Ÿ“Š ๋ชฉ์ฐจ


๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ

  • Backend: Java 17, Spring Boot 3.2.1
  • ORM: Spring Data JPA, Hibernate 6.4.1
  • Database: MySQL 8.4
  • Authentication: JWT, Spring Security
  • External APIs: Google Gemini, AWS S3
  • Encryption: ChaCha20-Poly1305 (๋ชจ๋ฐ”์ผ ์ตœ์ ํ™”)
  • Build Tool: Gradle 8.12
  • Containerization: Docker, Docker Compose
  • Testing: JUnit 5, Mockito

๐Ÿ—๏ธ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

ํ˜„์žฌ ๊ตฌ์กฐ

img_2.png

์•„ํ‚คํ…์ฒ˜ ์„ ํƒ ์ด์œ 

์ปดํฌ๋„ŒํŠธ ์„ ํƒ ์ด์œ 
VPC (Virtual Private Cloud) ๋ณด์•ˆ์ด ํ•„์š”ํ•œ ๊ธˆ์œต/๊ฐœ์ธ ์ •๋ณด๋ฅผ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฉ๋ฆฌ๋œ ๋„คํŠธ์›Œํฌ ํ•„์š”, AWS ์ž์œ ๋กœ์šด ์„ค์ • ์ œ๊ณต
NginX (๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ) ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ Spring ์„œ๋ฒ„๋กœ ๋ผ์šฐํŒ…, SSL ์ธ์ฆ์„œ ๊ด€๋ฆฌ(Certbot), ์š”์ฒญ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌ
Public Subnet ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋„คํŠธ์›Œํฌ ์˜์—ญ, ๋ชจ๋ฐ”์ผ ํด๋ผ์ด์–ธํŠธ์˜ HTTPS ํ†ต์‹  ์ง€์›
Spring Boot (EC2) ์•ˆ์ •์ ์ธ Java ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ, ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ƒํƒœ๊ณ„
MySQL 8.4 ACID ์ค€์ˆ˜๋กœ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ, ๋ณต์žกํ•œ ์ฟผ๋ฆฌ์™€ JOIN ์—ฐ์‚ฐ ์ง€์›, ํƒ€์ž„๋ ˆํ„ฐ/๊ฐ์ • ๋ฐ์ดํ„ฐ์˜ ์‹ ๋ขฐ์„ฑ ํ•„์ˆ˜
Redis ํ† ํฐ(JWT Refresh) ๋น ๋ฅธ ์กฐํšŒ/๋งŒ๋ฃŒ ๊ด€๋ฆฌ (TTL ์„ค์ •), Gemini API ๊ฐ์ • ๋ถ„์„ ๊ฒฐ๊ณผ ์บ์‹ฑ (1์ผ), ์„ธ์…˜ ๊ด€๋ฆฌ
AWS S3 ๋Œ€์šฉ๋Ÿ‰ ๋ฏธ๋””์–ด ํŒŒ์ผ(์‚ฌ์ง„, ์Œ์•…) ์ €์žฅ์†Œ๋กœ EC2 ์Šคํ† ๋ฆฌ์ง€ ์••๋ฐ• ํ•ด์†Œ, Presigned URL๋กœ ๋ณด์•ˆ์„ฑ ๊ฐ•ํ™”
ChaCha20-Poly1305 ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ ์ตœ์ ํ™” + ๋ณด์•ˆ: SNS ๊ณ„์ • ์ •๋ณด ์•”ํ˜ธํ™”, ๊ฒฝ๋Ÿ‰์ด๋ฉด์„œ๋„ ๋†’์€ ๋ณด์•ˆ์„ฑ ์ œ๊ณต

์ถ”ํ›„ ๊ตฌ์กฐ

img_3.png

์ถ”ํ›„ ์•„ํ‚คํ…์ฒ˜ ๋ณ€ํ™”

๋ณ€๊ฒฝ ์‚ฌํ•ญ ์„ ํƒ ์ด์œ 
RDS (Managed Database) EC2์—์„œ ์ง์ ‘ DB ๊ด€๋ฆฌ โ†’ AWS ์ž๋™ ๋ฐฑ์—…/์—…๋ฐ์ดํŠธ/๋ณต๊ตฌ๋กœ ๋ฐ์ดํ„ฐ ์œ ์‹ค ์œ„ํ—˜ ์ œ๊ฑฐ, ์œ ์–ธ์žฅ ๋ฐ์ดํ„ฐ ์•ˆ์ „์„ฑ ํ™•๋ณด
ALB (Application Load Balancer) ๊ณต๊ฐœ๋˜๋Š” ๊ฒƒ์€ ALB IP๋งŒ์œผ๋กœ EC2 ์‹ค์ œ IP ์€๋‹‰ โ†’ ํ•ด์ปค ์ง์ ‘ ๊ณต๊ฒฉ ์–ด๋ ค์›€, DDoS ๊ณต๊ฒฉ ๋ฐฉ์–ด
ALB๋ฅผ ํ†ตํ•œ SSL ๊ด€๋ฆฌ ์ธ์ฆ์„œ ๊ด€๋ฆฌ๋ฅผ ALB ํ•œ ๊ณณ์—๋งŒ ์ง‘์ค‘ โ†’ ๋งŒ๋ฃŒ๋กœ ์ธํ•œ ๋ณด์•ˆ ๊ตฌ๋ฉ ์œ„ํ—˜ ๊ฐ์†Œ
WAF (Web Application Firewall) ์—ฐ๋™ ALB ์•ž๋‹จ์— WAF ์ ์šฉ ๊ฐ€๋Šฅ โ†’ SQL Injection, ์•…์˜์  ๋ด‡ ๊ณต๊ฒฉ ์ฐจ๋‹จ
์ˆ˜ํ‰ ํ™•์žฅ ์ค€๋น„ ALB๋กœ ์—ฌ๋Ÿฌ EC2 ์ธ์Šคํ„ด์Šค์— ํŠธ๋ž˜ํ”ฝ ๋ถ„์‚ฐ ๊ฐ€๋Šฅ โ†’ ์ถ”ํ›„ ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€ ์‹œ ํ™•์žฅ์„ฑ ํ™•๋ณด

๐Ÿ“Š ERD (Entity Relationship Diagram)

๐ŸŽฏ ํ•ต์‹ฌ ์—”ํ‹ฐํ‹ฐ ๊ด€๊ณ„๋„

img_1.png

๐Ÿ“‹ ์—”ํ‹ฐํ‹ฐ ์ƒ์„ธ ์ •๋ณด

ํ…Œ์ด๋ธ” ์ฃผ์š” ํ•„๋“œ ์„ค๋ช…
USERS id, email, password, name, provider ์‚ฌ์šฉ์ž ๊ณ„์ • ์ •๋ณด
RECEIVER id, name, phone, email, relationship ์ˆ˜์‹ ์ž ์ •๋ณด
AFTERNOON_NOTE id, category, title, leave_message ์• ํ”„ํ„ฐ๋…ธํŠธ ๋ฉ”์ธ
AFTERNOON_SECURE_CONTENT id, key_name, encrypted_value ์•”ํ˜ธํ™”๋œ SNS ๊ณ„์ •์ •๋ณด
AFTERNOON_RECEIVER id, afternote_id, receiver_id ์• ํ”„ํ„ฐ๋…ธํŠธ-์ˆ˜์‹ ์ž N:N
AFTERNOON_NOTE_PLAYLIST id, atmosphere, memorial_photo_url ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ์ •๋ณด
AFTERNOON_PLAYLIST_ITEM id, playlist_id, song_id ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ๋‚ด ๊ณก
TIMELETTER id, title, content, send_at, status ํƒ€์ž„๋ ˆํ„ฐ ๋ฉ”์ธ
TIMELETTER_MEDIA id, s3_key ํƒ€์ž„๋ ˆํ„ฐ ๋ฏธ๋””์–ด
TIMELETTER_RECEIVER id, timeletter_id, receiver_id, delivered_at ํƒ€์ž„๋ ˆํ„ฐ-์ˆ˜์‹ ์ž N:N
MIND_RECORD id, content, song_id ๋งˆ์ธ๋“œ๋ ˆ์ฝ”๋“œ
EMOTION id, keyword ๊ฐ์ • ํ‚ค์›Œ๋“œ
DEEP_THOUGHT id, content, category ๊นŠ์€ ์ƒ๊ฐ
SONG id, title, artist, cover_url ๊ณก ์ •๋ณด
USER_RECEIVER id, user_id, receiver_id ์‚ฌ์šฉ์ž-์ˆ˜์‹ ์ž N:N

๐Ÿ”„ ์ฃผ์š” ๊ด€๊ณ„

1:1 ๊ด€๊ณ„

  • AFTERNOTE โ†” AFTERNOON_NOTE_PLAYLIST (1:1)

1:N ๊ด€๊ณ„

  • USERS โ†’ AFTERNOON_NOTE (1:N)
  • USERS โ†’ TIMELETTER (1:N)
  • USERS โ†’ MIND_RECORD (1:N)
  • AFTERNOON_NOTE โ†’ AFTERNOON_SECURE_CONTENT (1:N)
  • AFTERNOON_NOTE โ†’ AFTERNOON_PLAYLIST_ITEM (1:N)
  • TIMELETTER โ†’ TIMELETTER_MEDIA (1:N)

N:N ๊ด€๊ณ„ (์ค‘๊ฐ„ ํ…Œ์ด๋ธ” ์‚ฌ์šฉ)

  • AFTERNOON_NOTE โ†” RECEIVER (via AFTERNOON_RECEIVER)
  • TIMELETTER โ†” RECEIVER (via TIMELETTER_RECEIVER)
  • USERS โ†” RECEIVER (via USER_RECEIVER)
  • AFTERNOON_NOTE_PLAYLIST โ†” SONG (via AFTERNOON_PLAYLIST_ITEM)

๐Ÿ’พ ๋ฐ์ดํ„ฐ ํ๋ฆ„

1๏ธโƒฃ ์‚ฌ์šฉ์ž ๊ฐ€์ž… USERS ํ…Œ์ด๋ธ”์— ์ €์žฅ RECEIVER ๋“ฑ๋ก ๊ฐ€๋Šฅ

2๏ธโƒฃ ์• ํ”„ํ„ฐ๋…ธํŠธ ์ƒ์„ฑ AFTERNOON_NOTE ์ƒ์„ฑ โ”œโ”€ SOCIAL: SECURE_CONTENT์— ์•”ํ˜ธํ™”๋œ ๊ณ„์ •์ •๋ณด โ”œโ”€ GALLERY: ๊ธฐ๋ณธ ์ •๋ณด โ””โ”€ PLAYLIST: PLAYLIST + PLAYLIST_ITEM ์ƒ์„ฑ

3๏ธโƒฃ ํƒ€์ž„๋ ˆํ„ฐ ์ž‘์„ฑ TIMELETTER ์ƒ์„ฑ โ”œโ”€ TIMELETTER_MEDIA ์ €์žฅ โ””โ”€ TIMELETTER_RECEIVER๋กœ ์ˆ˜์‹ ์ž ๋“ฑ๋ก

4๏ธโƒฃ ๋งˆ์ธ๋“œ๋ ˆ์ฝ”๋“œ ๊ธฐ๋ก MIND_RECORD ์ƒ์„ฑ โ”œโ”€ EMOTION ๊ฐ์ • ํ‚ค์›Œ๋“œ ์ €์žฅ โ””โ”€ SONG ์ฐธ์กฐ (์„ ํƒ์‚ฌํ•ญ)

๐ŸŸก Domain Layer (๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง)

๋ชจ๋“ˆ ์„ค๋ช… ์ฃผ์š” ํด๋ž˜์Šค
auth/ ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ, ์†Œ์…œ ๋กœ๊ทธ์ธ AuthController, AuthService, SocialLoginFactory
user/ ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ (ํ”„๋กœํ•„, ์„ค์ •, ํƒˆํ‡ด) UserController, UserService, UserRepository
afternote/ ์• ํ”„ํ„ฐ๋…ธํŠธ (SOCIAL/GALLERY/PLAYLIST) AfternoteController, AfternoteService, AfternoteValidator
timeletter/ ํƒ€์ž„๋ ˆํ„ฐ (์‚ฌํ›„ ๋ฐœ์†ก ํŽธ์ง€) TimeLetterController, TimeLetterService
receiver/ ์ˆ˜์‹ ์ž ๊ด€๋ฆฌ ReceiverController, ReceiverService
mindrecord/ ๋งˆ์ธ๋“œ๋ ˆ์ฝ”๋“œ & ๊ฐ์ • ๋ถ„์„ MindRecordService, EmotionService, GeminiService
image/ ์ด๋ฏธ์ง€/ํŒŒ์ผ ์ฒ˜๋ฆฌ (S3) ImageController, S3Service

๐Ÿ”ต Global Layer (๊ณตํ†ต ๊ธฐ๋Šฅ)

๋ชจ๋“ˆ ์„ค๋ช…
jwt/ JWT ํ† ํฐ ์ƒ์„ฑ/๊ฒ€์ฆ (JwtTokenProvider, JwtAuthenticationFilter)
util/ ์œ ํ‹ธ ํด๋ž˜์Šค (ChaChaEncryptionUtil: ChaCha20-Poly1305)
service/ ๊ธ€๋กœ๋ฒŒ ์„œ๋น„์Šค (GeminiService, EmailService, TokenService)
config/ Spring ์„ค์ • (SecurityConfig, RestTemplateConfig, CacheConfig)
resolver/ Custom Resolver (@UserId ์–ด๋…ธํ…Œ์ด์…˜ ์ฒ˜๋ฆฌ)
exception/ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ (CustomException, ErrorCode: 40+ ์—๋Ÿฌ ์ฝ”๋“œ)
common/ ๊ณตํ†ต ์‘๋‹ต ํฌ๋งท (ApiResponse)

๐Ÿ“‹ ์ฃผ์š” ํŒจํ„ด

Strategy Pattern (์†Œ์…œ ๋กœ๊ทธ์ธ)

auth/service/social/ โ”œโ”€โ”€ SocialLoginService (Interface) โ”œโ”€โ”€ KakaoLoginService (๊ตฌํ˜„) โ”œโ”€โ”€ GoogleLoginService (๊ตฌํ˜„) โ””โ”€โ”€ NaverLoginService (๊ตฌํ˜„)

โ†’ SocialLoginFactory๊ฐ€ ๋Ÿฐํƒ€์ž„์— ์˜ฌ๋ฐ”๋ฅธ ๊ตฌํ˜„์ฒด ์„ ํƒ

Validator Pattern (๋ฐ์ดํ„ฐ ๊ฒ€์ฆ)

afternote/service/ โ”œโ”€โ”€ AfternoteValidator - ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํ•„๋“œ ๊ฒ€์ฆ โ”œโ”€โ”€ AfternoteService - ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง โ””โ”€โ”€ AfternoteRelationService - ๊ด€๊ณ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

Repository Pattern (๋ฐ์ดํ„ฐ ์ ‘๊ทผ)

  • Spring Data JPA๋ฅผ ์‚ฌ์šฉํ•œ ์ž๋™ ์ฟผ๋ฆฌ ์ƒ์„ฑ
  • JpaRepository ์ƒ์†์œผ๋กœ ๊ธฐ๋ณธ CRUD ์ œ๊ณต

๐Ÿš€ ์‹œ์ž‘ํ•˜๊ธฐ

ํ™˜๊ฒฝ ์„ค์ •

1) ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ (์•ฑ ๋กœ์ปฌ ์‹คํ–‰ + DB/Redis Docker)

  1. DB/Redis ๋กœ์ปฌ ์ธํ”„๋ผ๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
docker compose -f docker-compose.local.yml up -d
  1. IntelliJ Run Configuration์˜ Environment variables์— ์•„๋ž˜ ๊ฐ’์„ ๋„ฃ์Šต๋‹ˆ๋‹ค.
SPRING_PROFILES_ACTIVE=local
DB_HOST=localhost
DB_PORT=3306
DB_NAME=afternote-db
DB_USERNAME=admin
DB_PASSWORD=password
REDIS_HOST=localhost
REDIS_PORT=6379
JWT_SECRET=...
CHACHA20_SECRET_KEY=...
SERVER_PORT=8080
CORS_ALLOWED_ORIGINS=http://localhost:3000,http://localhost:5173
ADMIN_EMAIL=your-admin@example.com
ADMIN_PASSWORD=your-secure-password
APP_ANDROID_STORE_URL=https://play.google.com/store/apps/details?id=your.package
  1. IntelliJ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ง์ ‘ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ์ปฌ ํ”„๋กœํŒŒ์ผ: local
  • Swagger UI: http://localhost:8080/swagger-ui.html

2) ๋ฐฐํฌ ํ™˜๊ฒฝ (Docker + RDS)

์šด์˜ EC2์˜ ~/deploy/.env ๋Š” ๋ ˆํฌ์˜ deploy/production.env(๋กœ์ปฌ, gitignore) ๋ฅผ
GitHub Secret DEPLOY_PRODUCTION_ENV ๋กœ ์˜ฌ๋ฆฐ ๋’ค, main Deploy ์›Œํฌํ”Œ๋กœ๊ฐ€ ๋ฎ์–ด์“ด๋‹ค.

cp deploy/production.env.example deploy/production.env   # ๊ฐ’ ์ฑ„์šฐ๊ธฐ (Sentry DSN ํฌํ•จ)
./scripts/push-deploy-env-secret.sh                      # Secret ๊ฐฑ์‹ 
# ์ดํ›„ main push โ†’ EC2 ~/deploy/.env ๋™๊ธฐํ™” + ์ปจํ…Œ์ด๋„ˆ ์žฌ๊ธฐ๋™

Afternote-BE๋Š” public ๋ ˆํฌ๋ผ DB/JWT ๋“ฑ ์‹œํฌ๋ฆฟ์„ git์— ์ปค๋ฐ‹ํ•˜์ง€ ์•Š๋Š”๋‹ค.
๋กœ์ปฌ์—์„œ deploy/production.env๋งŒ ์ˆ˜์ •ํ•˜๊ณ , ๋ฐฐํฌ ์ „์— ์œ„ ์Šคํฌ๋ฆฝํŠธ๋กœ Secret์„ ๊ฐฑ์‹ ํ•˜๋ฉด ๋œ๋‹ค.

๋ ˆ๊ฑฐ์‹œ ๋กœ์ปฌ compose์šฉ:

cp .env.production.example .env.production
docker compose --env-file .env.production up -d

3) AWS ๊ทธ๋ฆฐํ•„๋“œ + off-hours ์Šค์ผ€์ค„ (Terraform)

VPC/EC2/RDS/EIP์™€ ๊ฐœ๋ฐœ off-hours(03:00~12:00 KST) Stop/Start๋ฅผ Terraform์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์„ค์ •ยท์ปท์˜ค๋ฒ„ยท๊ตฌ ๋ฆฌ์†Œ์Šค ํ๊ธฐ: infra/terraform/README.md

cd infra/terraform
cp terraform.tfvars.example terraform.tfvars   # key pair, ssh CIDR, db_password, alert_email
terraform init && terraform apply
terraform output elastic_ip      # DNS A + GitHub EC2_HOST
terraform output jdbc_url_hint   # .env.production DB_URL

์‹คํ–‰ ๋ฐฉ๋ฒ•

๋กœ์ปฌ ์ธํ”„๋ผ(DB/Redis) ์‹คํ–‰:

docker compose -f docker-compose.local.yml up -d

๋กœ์ปฌ ์•ฑ ์‹คํ–‰:

IntelliJ Run

๋กœ์ปฌ ์ธํ”„๋ผ ์ค‘์ง€:

docker compose -f docker-compose.local.yml down

๋ฐฐํฌ ์Šคํƒ ์‹คํ–‰:

docker compose --env-file .env.production up -d

ํ…Œ์ŠคํŠธ ์‹คํ–‰:

./gradlew test

์šด์˜ ๋กœ๊ทธ ํ™•์ธ:

docker compose --env-file .env.production logs -f afternote-server

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

๐Ÿ” ๋ณด์•ˆ

  • โœ… JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ
  • โœ… ChaCha20-Poly1305 ์•”ํ˜ธํ™” (SNS ๊ณ„์ •์ •๋ณด)
  • โœ… ์†Œ์…œ ๋กœ๊ทธ์ธ (์นด์นด์˜ค, ๊ตฌ๊ธ€)
  • โœ… ์ƒ์ฒด ์ธ์ฆ ์—ฐ๋™ (์ค€๋น„ ์ค‘)

๐Ÿ“ ์• ํ”„ํ„ฐ๋…ธํŠธ

  • โœ… SOCIAL: SNS ๊ณ„์ • ๊ด€๋ฆฌ
  • โœ… GALLERY: ์‚ฌ์ง„์ฒฉ ๊ด€๋ฆฌ
  • โœ… PLAYLIST: ์Œ์•… ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ

๐Ÿ“ฌ ํƒ€์ž„๋ ˆํ„ฐ

  • โœ… ์‚ฌํ›„ ์ž๋™ ๋ฐœ์†ก
  • โœ… ์Šค์ผ€์ค„ ๊ด€๋ฆฌ
  • โœ… ๋‹ค์ค‘ ์ˆ˜์‹ ์ž ์ง€์›

๐Ÿง  ๊ฐ์ • ๋ถ„์„

  • โœ… Gemini AI๋ฅผ ํ†ตํ•œ ๊ฐ์ • ์š”์•ฝ
  • โœ… 7์ผ ๊ฐ์ • ํ†ต๊ณ„
  • โœ… Redis ์บ์‹ฑ

๐Ÿšจ ์šด์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ยท ์žฅ์•  ํ”Œ๋ ˆ์ด๋ถ

์žฅ์•  ๋ฉ”์ผ/์ด์ƒ ์ง•ํ›„๊ฐ€ ๋ณด์ด๋ฉด ์ด ์ˆœ์„œ๋กœ ๋ณธ๋‹ค.

  1. CloudWatch ๋Œ€์‹œ๋ณด๋“œ โ€” EC2 / RDS / Lambda ์ค‘ ์–ด๋””๊ฐ€ ์ด์ƒํ•œ์ง€
    https://ap-northeast-2.console.aws.amazon.com/cloudwatch/home?region=ap-northeast-2#dashboards:name=afternote-ops
  2. Sentry Issues โ€” ์˜ˆ์™ธ ์ŠคํƒยทURLยทrelease
    https://sentry.io โ†’ ํ”„๋กœ์ ํŠธ java-spring-boot โ†’ Issues โ†’ Feed
  3. ์•ฑ ๋กœ๊ทธ โ€” ์ด์ƒ ์ง•ํ›„๊ฐ€ ๋ฐœ์ƒํ•œ ์‹œ๊ฐ ์ „ํ›„์˜ stdout https://ap-northeast-2.console.aws.amazon.com/cloudwatch/home?region=ap-northeast-2#logsV2:log-groups/log-group/%2Fafternote%2Fapp
  4. ํ—ฌ์Šค โ€” ์•ฑยทDBยทRedis ๋ถ„๋ฆฌ
    GET https://afternote.kro.kr/actuator/health
    db / redis ์ค‘ DOWN์ด๋ฉด ๊ทธ์ชฝ๋ถ€ํ„ฐ ๋ณธ๋‹ค. (nginx-health๋Š” ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋งŒ ์‚ด์•„ ์žˆ๋Š”์ง€)

์•Œ๋žŒ ๋ฉ”์ผ: Terraform alert_email โ†’ SNS afternote-scheduler-alerts
env ๋ณ€๊ฒฝ: deploy/production.env ์ˆ˜์ • โ†’ ./scripts/push-deploy-env-secret.sh โ†’ main ๋ฐฐํฌ


๐Ÿ“– API ๋ฌธ์„œ

  • Swagger UI (local ํ”„๋กœํŒŒ์ผ): http://localhost:8080/swagger-ui.html
  • ๋ชจ๋“  API ์—”๋“œํฌ์ธํŠธ๋Š” JWT ์ธ์ฆ ๋˜๋Š” OAuth ํ† ํฐ ํ•„์š”

์†Œ์…œ ๋กœ๊ทธ์ธ ์ด๋ฉ”์ผ ์ •์ฑ… (#271, #290 ์ด์ „)

  • ์ด๋ฉ”์ผ ์—†๋Š” ์‹ ๊ทœ ๊ฐ€์ž…์€ #290 ์ •์ฑ… ํ™•์ • ์ „๊นŒ์ง€ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฉ”์ผ์ด ์—†๊ฑฐ๋‚˜ ๊ฒ€์ฆ๋˜์ง€ ์•Š์€ ์นด์นด์˜ค ๊ณ„์ •์€ ์‹ ๊ทœ ๊ฐ€์ž…/์ด๋ฉ”์ผ ๊ธฐ๋ฐ˜ ์—ฐ๊ฒฐ ์‹œ 400 / 1222 SOCIAL_EMAIL_REQUIRED๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์นด์นด์˜ค ์ด๋ฉ”์ผ ์ œ๊ณต ๋™์˜ ํ›„ ์žฌ์‹œ๋„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฏธ ์—ฐ๊ฒฐ๋œ ์†Œ์…œ ๊ณ„์ •์€ provider + providerId๋กœ ์šฐ์„  ๋กœ๊ทธ์ธํ•˜๋ฏ€๋กœ ์นด์นด์˜ค ์ด๋ฉ”์ผ์ด ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ์ œ๊ณต๋˜์ง€ ์•Š์•„๋„ ๊ธฐ์กด ์‚ฌ์šฉ์ž๋กœ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฉ”์ผ๋กœ ์ฐพ์€ ๊ธฐ์กด ์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์ธ ์ˆ˜๋‹จ์€ ๋ณด์กดํ•˜๊ณ  ํ•ด๋‹น ์†Œ์…œ ์ œ๊ณต์ž์™€ ID๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ๋™์ผ ์ œ๊ณต์ž์— ๋‹ค๋ฅธ ID๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด 409 / 1212๋กœ ๊ฑฐ์ ˆํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ๋ฐ์ดํ„ฐ์˜ ๋นˆ providerId๋Š” ์ฒซ ์ •์ƒ ๋กœ๊ทธ์ธ ๋•Œ ์ฑ„์›๋‹ˆ๋‹ค.
  • ์นด์นด์˜ค์˜ ์œ ํšจยท๊ฒ€์ฆ ์ด๋ฉ”์ผ ๋ฐ ๊ตฌ๊ธ€์˜ ๊ฒ€์ฆ ์ด๋ฉ”์ผ๋งŒ ์ด๋ฉ”์ผ ๊ธฐ๋ฐ˜ ๊ฐ€์ž…/์—ฐ๊ฒฐ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages