Skip to content

BenchPress200/backend

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

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

Repository files navigation

๐Ÿ“– Summary

photique ํ”„๋กœ์ ํŠธ์˜ ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. Java + SpringBoot ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ, REST API ๋ถ€ํ„ฐ ์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ , ์บ์‹ฑ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ์ด ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


Organization
Frontend
ERD



๐Ÿ› ๏ธ Tech Stack

Backend

Java Gradle Spring Boot JWT STOMP SSE

Database

MySQL Redis Elasticsearch

Monitoring

Grafana Promtail Loki Prometheus Node Exporter

CI/CD

GitHub GitHub Actions Docker AWS EC2 GCP

Etc.

Nginx AWS S3 Postman



๐Ÿ“‘ API

๊ฐ ๋„๋ฉ”์ธ ๋ณ„๋กœ REST API ๊ฐ€ ์žˆ์œผ๋ฉฐ, ์›น์†Œ์ผ“๊ณผ SSE ์—ฐ๊ฒฐ ์—”๋“œํฌ์ธํŠธ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ด 52๊ฐœ์˜ API๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๋…ธ์…˜ ๋งํฌ๋ฅผ ํ†ตํ•ด์„œ API ์ƒ์„ธ ์ŠคํŽ™์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Notion

์ธ์ฆ

API ๊ธฐ๋Šฅ METHOD URL
๋กœ๊ทธ์ธ POST /api/v1/auth/login
๋กœ๊ทธ์•„์›ƒ POST /api/v1/auth/logout
์ธ์ฆ ๋ฉ”์ผ ๋ฐœ์†ก - ํšŒ์›๊ฐ€์ž… POST /api/v1/auth/mail/join
์ธ์ฆ ๋ฉ”์ผ ๋ฐœ์†ก - ๋น„๋ฒˆ์ฐพ๊ธฐ POST /api/v1/auth/mail/password
์ธ์ฆ ๋ฉ”์ผ ์š”์ฒญ POST /api/v1/auth/code
๋‚ด ์•„์ด๋”” ์กฐํšŒ GET /api/v1/auth/me

์œ ์ €

API ๊ธฐ๋Šฅ METHOD URL
๋‹‰๋„ค์ž„ ์ค‘๋ณต๊ฒ€์‚ฌ GET /api/v1/users/nickname
๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ PATCH /api/v1/users/password
ํšŒ์›๊ฐ€์ž… POST /api/v1/users
ํšŒ์›์ •๋ณด ์กฐํšŒ GET /api/v1/users/{userId}
ํšŒ์›์ •๋ณด ์ˆ˜์ • PATCH /api/v1/users/{userId}
ํšŒ์›ํƒˆํ‡ด DELETE /api/v1/users/{userId}
์œ ์ € ๊ฒ€์ƒ‰ GET /api/v1/users
ํŒ”๋กœ์šฐ ์š”์ฒญ POST /api/v1/users/{userId}/follows
์–ธํŒ” ์š”์ฒญ DELETE /api/v1/users/{userId}/follows
ํŒ”๋กœ์›Œ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ GET /api/v1/users/{userId}/follower
ํŒ”๋กœ์ž‰ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ GET /api/v1/users/{userId}/following

๋‹จ์ผ์ž‘ํ’ˆ

API ๊ธฐ๋Šฅ METHOD URL
๋‹จ์ผ์ž‘ํ’ˆ ์ƒ์„ฑ POST /api/v1/singleworks
๋‹จ์ผ์ž‘ํ’ˆ ์กฐํšŒ GET /api/v1/singleworks/{singleworkId}
๋‹จ์ผ์ž‘ํ’ˆ ์ˆ˜์ • PATCH /api/v1/singleworks/{singleworkId}
๋‹จ์ผ์ž‘ํ’ˆ ์‚ญ์ œ DELETE /api/v1/singleworks/{singleworkId}
๋‹จ์ผ์ž‘ํ’ˆ ๊ฒ€์ƒ‰ GET /api/v1/singleworks
๋‹จ์ผ์ž‘ํ’ˆ ์ข‹์•„์š” ์ถ”๊ฐ€ POST /api/v1/singleworks/{singleworkId}/like
๋‹จ์ผ์ž‘ํ’ˆ ์ข‹์•„์š” ์‚ญ์ œ DELETE /api/v1/singleworks/{singleworkId}/like
๋‹จ์ผ์ž‘ํ’ˆ ๋Œ“๊ธ€ ์ƒ์„ฑ POST /api/v1/singleworks/{singleworkId}/comments
๋‹จ์ผ์ž‘ํ’ˆ ๋Œ“๊ธ€ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ GET /api/v1/singleworks/{singleworkId}/comments
๋‹จ์ผ์ž‘ํ’ˆ ๋Œ“๊ธ€ ์ˆ˜์ • PATCH /api/v1/singleworks/{singleworkId}/comments/{commentId}
๋‹จ์ผ์ž‘ํ’ˆ ๋Œ“๊ธ€ ์‚ญ์ œ DELETE /api/v1/singleworks/{singleworkId}/comments/{commentId}
์ข‹์•„์š”ํ•œ ๋‹จ์ผ์ž‘ํ’ˆ ์กฐํšŒ GET /api/v1/singleworks/like
๋‚ด ๋‹จ์ผ์ž‘ํ’ˆ ์กฐํšŒ GET /api/v1/singleworks/me

์ „์‹œํšŒ

API ๊ธฐ๋Šฅ METHOD URL
์ „์‹œํšŒ ์ƒ์„ฑ POST /api/v1/exhibitions
์ „์‹œํšŒ ์กฐํšŒ GET /api/v1/exhibitions/{exhibitionId}
์ „์‹œํšŒ ์‚ญ์ œ DELETE /api/v1/exhibitions/{exhibitionId}
์ „์‹œํšŒ ๊ฒ€์ƒ‰ GET /api/v1/exhibitions
์ „์‹œํšŒ ์ข‹์•„์š” ์ถ”๊ฐ€ POST /api/v1/exhibitions/{exhibitionId}/like
์ „์‹œํšŒ ์ข‹์•„์š” ์‚ญ์ œ DELETE /api/v1/exhibitions/{exhibitionId}/like
์ „์‹œํšŒ ๋ถ๋งˆํฌ ์ถ”๊ฐ€ POST /api/v1/exhibitions/{exhibitionId}/bookmark
์ „์‹œํšŒ ๋ถ๋งˆํฌ ์‚ญ์ œ DELETE /api/v1/exhibitions/{exhibitionId}/bookmark
์ „์‹œํšŒ ๊ฐ์ƒํ‰ ์ƒ์„ฑ POST /api/v1/exhibitions/{exhibitionId}/comments
์ „์‹œํšŒ ๊ฐ์ƒํ‰ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ GET /api/v1/exhibitions/{exhibitionId}/comments
์ „์‹œํšŒ ๊ฐ์ƒํ‰ ์ˆ˜์ • PATCH /api/v1/exhibitions/{exhibitionId}/comments/{commentId}
์ „์‹œํšŒ ๊ฐ์ƒํ‰ ์‚ญ์ œ DELETE /api/v1/exhibitions/{exhibitionId}/comments/{commentId}
๋ถ๋งˆํฌํ•œ ์ „์‹œํšŒ ์กฐํšŒ GET /api/v1/exhibitions/bookmark
์ข‹์•„์š”ํ•œ ์ „์‹œํšŒ ์กฐํšŒ GET /api/v1/exhibitions/like
๋‚ด ์ „์‹œํšŒ ์กฐํšŒ GET /api/v1/exhibitions/me

์ „์‹œํšŒ ์ฑ„ํŒ…

API ๊ธฐ๋Šฅ METHOD URL
์ฑ„ํŒ… ์„œ๋ฒ„ ์—ฐ๊ฒฐ GET /api/v1/chats/connection

์•Œ๋ฆผ

API ๊ธฐ๋Šฅ METHOD URL
์•Œ๋ฆผ ์„œ๋น„์Šค ์—ฐ๊ฒฐ GET /api/v1/users/{userId}/notifications/subscribe
์•Œ๋ฆผ ๋ฆฌ์ŠคํŠธ ์กฐํšŒ GET /api/v1/users/{userId}/notifications
์•Œ๋ฆผ ์ฝ์Œ ์ฒ˜๋ฆฌ PATCH /api/v1/users/{userId}/notifications/{notificationId}
์•Œ๋ฆผ ์ „์ฒด ์ฝ์Œ ์ฒ˜๋ฆฌ PATCH /api/v1/users/{userId}/notifications
์•Œ๋ฆผ ์‚ญ์ œ DELETE /api/v1/users/{userId}/notifications/{notificationId}
์ฝ์ง€ ์•Š์€ ์•Œ๋ฆผ ์นด์šดํŒ… GET /api/v1/users/{userId}/notifications/unread



๐Ÿš€ CI/CD Pipeline

๊ฐœ๋ฐœ ์„œ๋ฒ„ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ - AWS EC2 free tier

  1. ๋กœ์ปฌ์—์„œ ๋ณ€๊ฒฝ์‚ฌํ•ญ commit
  2. main ๋ธŒ๋žœ์น˜๋กœ push
  3. main -> develop ๋ธŒ๋žœ์น˜๋กœ pr ๋ณด๋ƒ„์œผ๋กœ์จ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ๋ฐฐํฌ ์›Œํฌ ํ”Œ๋กœ์šฐ ์‹คํ–‰
  4. ์ •์ƒ ๋ฐฐํฌ๋˜๋ฉด merge

ํ”„๋กœ๋•ํŠธ ์„œ๋ฒ„ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ - GCP VM

  1. ๋กœ์ปฌ์—์„œ ๋ณ€๊ฒฝ์‚ฌํ•ญ commit
  2. main ๋ธŒ๋žœ์น˜๋กœ push
  3. main -> release ๋ธŒ๋žœ์น˜๋กœ pr ๋ณด๋ƒ„์œผ๋กœ์จ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ๋ฐฐํฌ ์›Œํฌ ํ”Œ๋กœ์šฐ ์‹คํ–‰
  4. ์ •์ƒ ๋ฐฐํฌ๋˜๋ฉด merge



๐Ÿ’ฅ Tech Selection & Trouble Shooting

ํƒ€์ดํ‹€ ์ฃผ์š” ๋‚ด์šฉ ๋ฌธ์„œ ๋งํฌ
๐Ÿ” ์Šคํ”„๋ง ์ธ์ฆ์ธ๊ฐ€ ๋„์ž…๊ธฐ ์ธ์ฆ-์ธ๊ฐ€ ์ ์šฉ ๋ฐฉ์‹ ๊ฒฐ์ • ์ž์„ธํžˆ ๋ณด๊ธฐ
๐Ÿš€ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•๊ธฐ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์ดˆ๊ธฐ ์„ธํŒ… ๋ฐ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ ์ ์šฉ ์ž์„ธํžˆ ๋ณด๊ธฐ
๐Ÿ‘๏ธ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ๊ตฌ์ถ•๊ธฐ ๊ทธ๋ผํŒŒ๋‚˜๋ฅผ ํ™œ์šฉํ•œ ๋กœ๊ทธ, ์‹œ์Šคํ…œ ๋ฉ”ํŠธ๋ฆญ ์‹œ๊ฐํ™” ์ž์„ธํžˆ ๋ณด๊ธฐ
๐Ÿฝ๏ธ ์„ค์ •ํŒŒ์ผ ๊ด€๋ฆฌ ์ „ํ™˜๊ธฐ ๊นƒํ—ˆ๋ธŒ ์„œ๋ธŒ๋ชจ๋“ˆ ๊ธฐ๋ฐ˜์˜ ์„ค์ •ํŒŒ์ผ ๊ด€๋ฆฌ ์ž์„ธํžˆ ๋ณด๊ธฐ
๐Ÿ” ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๋„์ž…๊ธฐ Elasticsearch ๋„์ž… ์ž์„ธํžˆ ๋ณด๊ธฐ
๐Ÿ‘ฅ Request Body ๋‘ ๋ฒˆ ์ฝ๊ธฐ?! HttpServletRequestWrapper ์ƒ์†๋ฐ›์€ ์ปค์Šคํ…€ ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด์„œ ์š”์ฒญ ๋ฐ”๋””์ŠคํŠธ๋ฆผ ์—ฌ๋Ÿฌ ๋ฒˆ ์†Œ๋ชจ ์ž์„ธํžˆ ๋ณด๊ธฐ
โ†ฉ๏ธ S3 ์ด๋ฏธ์ง€๋Š” ๋ˆ„๊ฐ€ ๋กค๋ฐฑํ•จ? ThreadedLocal์„ ํ™œ์šฉํ•˜์—ฌ @Transactional์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฆฌ์Šค๋„ˆ ์ถ”๊ฐ€ ์ž์„ธํžˆ ๋ณด๊ธฐ
โ†ช๏ธ๏ธ ๊ทธ๋Ÿผ, Elasticsearch ๋ฐ์ดํ„ฐ๋Š” ๋ˆ„๊ฐ€ ๋กค๋ฐฑํ•จ??? S3 ๋กค๋ฐฑ๊ณผ ๊ฐ™์€ ๋™์ž‘์„ ํ•˜๋Š” es ๋ฐ์ดํ„ฐ ๋‹ด๋‹น ๋ฆฌ์Šค๋„ˆ ์ถ”๊ฐ€ ์ž์„ธํžˆ ๋ณด๊ธฐ
๐Ÿ”” ์•Œ๋ฆผ ๊ธฐ๋Šฅ ๋„์ž…๊ธฐ SSE ๋„์ž…์„ ํ†ตํ•œ ์•Œ๋ฆผ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์ž์„ธํžˆ ๋ณด๊ธฐ
๐Ÿ’ฌ ์ฑ„ํŒ…๋ฐฉ ๊ตฌํ˜„๊ธฐ WebSocket with STOMP ๋„์ž…์„ ํ†ตํ•œ ์ฑ„ํŒ… ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์ž์„ธํžˆ ๋ณด๊ธฐ
๐Ÿ’€ DB connection ๊ณ ๊ฐˆ JPA์˜ open-in-view: false ์„ค์ • ์ž์„ธํžˆ ๋ณด๊ธฐ
๐Ÿ“ฃ ์•Œ๋ฆผ ์„œ๋น„์Šค ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ SSE ์•Œ๋ฆผ์„ @Async ์ฒ˜๋ฆฌ ์ž์„ธํžˆ ๋ณด๊ธฐ
๐Ÿ’จ ์บ์‹ฑ ์ ์šฉํ•˜๊ธฐ Redis ๊ธฐ๋ฐ˜ ์บ์‹ฑ ์ ์šฉ ์ž์„ธํžˆ ๋ณด๊ธฐ
๐Ÿš› Nginx ์ตœ๋Œ€๋กœ ํ™œ์šฉํ•˜๊ธฐ Nginx ์ปค๋„ฅ์…˜ ์„ค์ • ๋ฐ rate limiting ์ถ”๊ฐ€ ์ž์„ธํžˆ ๋ณด๊ธฐ
๐Ÿณ ๋„์ปค ๋ณผ๋ฅจ ๋งˆ์šดํŠธ ์ดํ•ดํ•˜๊ธฐ ๋„์ปค์˜ ๋ณผ๋ฅจ ๋งˆ์šดํŠธ ๊ธฐ์ค€ ์ดํ•ด ์ž์„ธํžˆ ๋ณด๊ธฐ
๐Ÿ‘€ ์กฐํšŒ์ˆ˜ ์—…๋ฐ์ดํŠธ ๋ ˆ์ด์Šค ์ปจ๋””์…˜ RDBMS ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ์ˆ˜ ์—…๋ฐ์ดํŠธ ๋ฐฉ์น˜ ๋ฐ ๊ฒ€์ƒ‰ ๋ฐ์ดํ„ฐ ์กฐํšŒ์ˆ˜ ์Šค์ผ€์ค„๋Ÿฌ ์ฒ˜๋ฆฌ ์ž์„ธํžˆ ๋ณด๊ธฐ
๐Ÿงช API ์ฒ˜๋ฆฌ ์Šค๋ ˆ๋“œ ์ˆ˜ ์กฐ์ ˆํ•˜๊ธฐ jmeter ๋ถ€ํ•˜ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•œ ํ†ฐ์บฃ ์Šค๋ ˆ๋“œ, hikari pool ์ปค๋„ฅ์…˜ ์‚ฌ์ด์ฆˆ ์ตœ์ ํ™” ์ž์„ธํžˆ ๋ณด๊ธฐ
๐Ÿซข ๋‹จ์ผ์ฟผ๋ฆฌ๊ฐ€ 30๋ฒˆ์”ฉ ๋‚˜๊ฐ„๋‹ค๊ณ ?! JPQL์„ ํ†ตํ•œ join ์ฒ˜๋ฆฌ ์ž์„ธํžˆ ๋ณด๊ธฐ
๐Ÿ›ซ ์ฟผ๋ฆฌ ์ตœ์ ํ™” ๊ฒฝํ—˜ํ•˜๊ธฐ Lazy Loading ๋ฌธ์ œ ๊ฐœ์„ ํ•˜๊ธฐ ์ž์„ธํžˆ ๋ณด๊ธฐ
๐Ÿš€ ํ”„๋กœ๋•ํŠธ ์„œ๋ฒ„ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•๊ธฐ ๊ธฐ์กด์— ๊ตฌ์ถ•ํ•ด๋†จ๋˜ ํŒŒ์ดํ”„๋ผ์ธ์„ ํ™œ์šฉํ•˜์—ฌ GCP์— ํ”„๋กœ๋•ํŠธ ์„œ๋ฒ„ ๋ฐฐํฌ ์ž์„ธํžˆ ๋ณด๊ธฐ



About

photique server

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 98.4%
  • Shell 1.6%