photique ํ๋ก์ ํธ์ ์๋ฒ์ ๋๋ค. Java + SpringBoot ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋์์ผ๋ฉฐ, REST API ๋ถํฐ ์ค์๊ฐ ์๋ฐฉํฅ ํต์ , ์บ์ฑ ๋ฑ ๋ค์ํ ๊ธฐ์ ์ด ์ ์ฉ๋์์ต๋๋ค.
๊ฐ ๋๋ฉ์ธ ๋ณ๋ก REST API ๊ฐ ์์ผ๋ฉฐ, ์น์์ผ๊ณผ SSE ์ฐ๊ฒฐ ์๋ํฌ์ธํธ๋ฅผ ํฌํจํ์ฌ ์ด 52๊ฐ์ API๊ฐ ์กด์ฌํฉ๋๋ค. ์๋ ๋ ธ์ ๋งํฌ๋ฅผ ํตํด์ API ์์ธ ์คํ์ ํ์ธํ ์ ์์ต๋๋ค.
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 |

- ๋ก์ปฌ์์ ๋ณ๊ฒฝ์ฌํญ commit
- main ๋ธ๋์น๋ก push
- main -> develop ๋ธ๋์น๋ก pr ๋ณด๋์ผ๋ก์จ ๊ฐ๋ฐ ์๋ฒ ๋ฐฐํฌ ์ํฌ ํ๋ก์ฐ ์คํ
- ์ ์ ๋ฐฐํฌ๋๋ฉด merge
- ๋ก์ปฌ์์ ๋ณ๊ฒฝ์ฌํญ commit
- main ๋ธ๋์น๋ก push
- main -> release ๋ธ๋์น๋ก pr ๋ณด๋์ผ๋ก์จ ๊ฐ๋ฐ ์๋ฒ ๋ฐฐํฌ ์ํฌ ํ๋ก์ฐ ์คํ
- ์ ์ ๋ฐฐํฌ๋๋ฉด merge
ํ์ดํ | ์ฃผ์ ๋ด์ฉ | ๋ฌธ์ ๋งํฌ |
---|---|---|
๐ ์คํ๋ง ์ธ์ฆ์ธ๊ฐ ๋์ ๊ธฐ | ์ธ์ฆ-์ธ๊ฐ ์ ์ฉ ๋ฐฉ์ ๊ฒฐ์ | ์์ธํ ๋ณด๊ธฐ |
๐ ๊ฐ๋ฐ ์๋ฒ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ ๊ตฌ์ถ๊ธฐ | ๊ฐ๋ฐ ์๋ฒ ์ด๊ธฐ ์ธํ ๋ฐ ๋ฌด์ค๋จ ๋ฐฐํฌ ์ ์ฉ | ์์ธํ ๋ณด๊ธฐ |
๐๏ธ ๋ชจ๋ํฐ๋ง ์์คํ ๊ตฌ์ถ๊ธฐ | ๊ทธ๋ผํ๋๋ฅผ ํ์ฉํ ๋ก๊ทธ, ์์คํ ๋ฉํธ๋ฆญ ์๊ฐํ | ์์ธํ ๋ณด๊ธฐ |
๐ฝ๏ธ ์ค์ ํ์ผ ๊ด๋ฆฌ ์ ํ๊ธฐ | ๊นํ๋ธ ์๋ธ๋ชจ๋ ๊ธฐ๋ฐ์ ์ค์ ํ์ผ ๊ด๋ฆฌ | ์์ธํ ๋ณด๊ธฐ |
๐ ๊ฒ์ ๊ธฐ๋ฅ ๋์ ๊ธฐ | 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์ ํ๋ก๋ํธ ์๋ฒ ๋ฐฐํฌ | ์์ธํ ๋ณด๊ธฐ |