- ๊ฐ๋ฐ ํ๊ฒฝ
- ์ฌ์ฉ ๊ธฐ์
- ํต์ฌ ํค์๋
- ์์คํ ์ํคํ ์ฒ
- E-R Diagram
- ํ๋ก์ ํธ ๋ชฉ์
- ํต์ฌ ๊ธฐ๋ฅ Before ๋ฆด๋ฆฌ์ฆ
- ๊ฒ์๊ธ CRUD
- ์ธ์ฆ ๋ฐ ์ธ๊ฐ ์ธ์ ๋ฐฉ์ ๊ตฌํ
- ๋งํฌ๋ค์ด ์์ฑ์ ์ํ Toast Ui Editor ์ ์ฉ
- ํ๊ทธ ๋ฐ ํค์๋ ๊ฒ์ ๊ธฐ๋ฅ
- ์์ฑ ์๋์ ์ฅ ๊ฐ๋
- ์๋ฆผ ๊ธฐ๋ฅ
- ์ข์์ ๋ฐ ํ๋ก์ฐ ๊ธฐ๋ฅ
- ๋ฌดํ ์คํฌ๋กค ํ์ด์ง ๊ธฐ๋ฅ
- ๋๊ธ ๋๋๊ธ ๊ธฐ๋ฅ
- ์๋ฐ8 ์คํธ๋ฆผ ๋๋ค ๋ฌธ๋ฒ ๋์
- ์ฌ์ง ์ ์ฅ์ฉ๋ ์ต์ ํ
- Ehcache ์ ์ฉ
- ์กฐํ์ ์ฆ๊ฐ ๋ก์ง
- MapStruct ๋์
- ๋ฌด์ค๋จ ๋ฐฐํฌ ์๋ํ
- IntelliJ
- GitHub
- Java 17 openjdk
- SpringBoot 3.4.0
- Spring Data JPA
- QueryDSL 5.0.0
- Ehcache 3.10.8
- Gradle
- Javascript
- Html/css
- Thymeleaf
- BootStrap5
- H2(dev)
- Mysql(prod)
- AWS EC2
- AWS S3
- GitHub Actions
- Docker
- AWS RDS
- AWS Route53
- Lombok
- Toast Ui Editor
- ์คํ๋ง ๋ถํธ๋ฅผ ์ฌ์ฉํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ค๊ณ ~ ๋ฐฐํฌ ์ ์ง ๋ณด์๊น์ง ์ ๊ณผ์ ๊ฐ๋ฐ ๋ฐ ์ด์
- AWS / ubuntu ๊ธฐ๋ฐ Github action์ ํ์ฉํ ๋ฌด์ค๋จ ๋ฐฐํฌ ๋ฐ ๋ฐฐํฌ ์๋ํ ๊ตฌ์ถ
- MVC ํ๋ ์์ํฌ ๊ธฐ๋ฐ ๋ฐฑ์๋ ์๋ฒ ๊ตฌ์ถ
ํจํค์ง๋ช | ์ค๋ช |
---|---|
NoteJApplication.java |
Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ๋ฉ์ธ ์คํ ํด๋์ค |
aop |
AOP(Aspect-Oriented Programming) ๊ด๋ จ ์ฝ๋ |
deploy |
๋ฐฐํฌ ๊ด๋ จ ์คํฌ๋ฆฝํธ ๋ฐ ์ค์ ํ์ผ |
domain |
์ํฐํฐ(Entity) ๋ฐ ๋๋ฉ์ธ ๋ชจ๋ธ ๊ด๋ จ ํด๋์ค |
exception |
์ ์ญ ์์ธ ์ฒ๋ฆฌ ๋ฐ ์ปค์คํ ์์ธ ํด๋์ค |
file |
ํ์ผ ์ ๋ก๋/๋ค์ด๋ก๋ ๊ด๋ จ ์ฒ๋ฆฌ |
filter |
์ธ์ฆ ์ธ๊ฐ ํํฐ |
repository |
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ ๊ณ์ธต (JPA) |
service |
๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํ๋ ์๋น์ค ๊ณ์ธต |
web |
์ปจํธ๋กค๋ฌ ๋ฐ API ์์ฒญ ์ฒ๋ฆฌ ๊ด๋ จ ํด๋์ค |
์ด ํ๋ก์ ํธ๋ ๊ฐ๋ฐ์๋ค์ ์ํ ์ต์ ํ๋ ๋ธ๋ก๊ทธ ํ๋ซํผ์ ๊ตฌํํ๊ณ ์ ์์๋์์ต๋๋ค.
๊ฐ๋ฐ์๋ค์ด ์์ ์ ์ง์๊ณผ ๊ฒฝํ์ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ณ , ์ต์ ๊ธฐ์ ํธ๋ ๋์ ๋
ธํ์ฐ๋ฅผ ์ํตํ ์ ์๋ ๊ณต๊ฐ์ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ฉฐ ๊ฒฝ์์ ์ธ ์์๋ฅผ ์ถ๊ฐํ๊ณ ์ ํฉ๋๋ค.
๋ง์ ๋ธ๋ก๊ทธ๋ค์์ ์์ฐํ์ผ๋ก ๋์ค๋ ๊ธ๋ค์ ๊ฒ์์์ง์์์ ์ฐ๋ฆฌ๋ค์ ๊ฒฝํ์ ์ค์ผ์ํค๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. noteJ๋ ๊ธ์ ๋ํ ํ๊ฐ ์์๋ฅผ ๋ค์ํ๊ฒ ๋จ๊ธธ ์ ์๋๋ก ํ์ฌ ์์ฑ์๋ค์ ๋๊ธฐ๋ฅผ ๋ถ๋ฌ์ผ์ผํค๋ ค๊ณ ํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ธ ๊ฒ์๊ธ CRUD๊ฐ ๊ฐ๋ฅํฉ๋๋ค. Read์ ๊ฒฝ์ฐ ๋ก๊ทธ์ธ์ด ํ์์์ผ๋ฉฐ, Update, Create, Delete์ ๋ํด์๋ ๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค.
Tomcat์ด ์ ๊ณตํ๋ HttpSession ๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ ๋ก๊ทธ์ธ ์ ์ธ์ ์ User๋ฅผ ์ ๋ฐ์ดํธํ๊ณ JSESSIONID๋ก ํ์ฌ๊ธ ์ธ๊ฐ๋ฅผ ํ๋จํ์ต๋๋ค.
๋ก๊ทธ์ธ ์ธ์ ์ ๋ง๋ฃ ์๊ฐ์ 30๋ถ์ผ๋ก ๋์ด ์ฟ ํค ํ์ทจ์ ๋ํ ๋ณด์์ ๊ฐํํ์์ต๋๋ค.
User์ํฐํฐ์ ์ ๊ธ ๊ด๋ จ ํ๋๋ฅผ ์ถ๊ฐํ์ฌ ๋ก๊ทธ์ธ์ ์์ด๋๋ ๋ง์ง๋ง ๋น๋ฐ๋ฒํธ๊ฐ ํ๋ฆฌ๋ ๊ฒฝ์ฐ์ ๋ํ์ฌ ์๋ 5ํ ์ด๊ณผ์ ๊ณ์ ์ ์ ๊ทธ๊ณ ์ผ์ ์๊ฐ ์ดํ ์ด๊ฐ ์๋์ ์ผ๋ก ํ๋ฆฌ๋ ์ธ์ฆ ์ฒ๋ฆฌ ์ ํ ๋ก์ง์ ์ถ๊ฐํ์์ต๋๋ค.
๊ฐ๋ฐ์ ๋ธ๋ก๊ทธ๋ต๊ฒ ๊ฒ์๊ธ์ ๋งํฌ๋ค์ด์ผ๋ก ์์ฑํ ์ ์๋๋ก Toast Ui Editor
์คํ ์์ค๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
๊ธ ์์ฑ์ ์ฒจ๋ถํ๋ ์ด๋ฏธ์ง์ ๊ฒ์๊ธ์ ์ธ๋ค์ผ ์ด๋ฏธ์ง์ ๊ฒฝ์ฐ์๋ S3์ ์ ์ฅ๋๋๋ก ํ์์ต๋๋ค.(์ฌ์งํ์ผ ์ ์ฅ์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ์ฌ ์ ์ฅ๋ถํ๋ฅผ ์ค์ด๋๋ก ํ์์ต๋๋ค.)
์์ฑ์ js async๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก blob์ฌ์ง์ ์ ๋ก๋ ์ปจํธ๋กค๋ฌ์ ๋ณด๋ด์ด ์ฆ๊ฐ์ ์ผ๋ก ์ ์ฅํ๊ณ ์ ์ฅ๋ ํ์ผ๋ช ์ ๋ฐ์ ๋ค์ ๋ค์ด๋ก๋ ์ปจํธ๋กค๋ฌ๋ก ํ์ฌ๊ธ Viewer์ ํด๋น ์ฌ์ง์ ๋๋๋งํ๋๋ก ๊ตฌํํ์์ต๋๋ค.
์์ฑ๋ ๊ธ์ ์กฐํํ ๋์๋ viewer ๊ธฐ๋ฅ๋ง ์ฌ์ฉํ๋๋ก ํ์์ผ๋ฉฐ ์ด์ ๋ํด tocbot.js๋ฅผ ํ์ฉํ์ฌ ๊ธ์ ๋ํ ๋์ ์ธ ํญ ๊ธฐ๋ฅ์ ์ฑํํ์์ต๋๋ค.
ํ๊ทธ, ํค์๋, ์๋ฆฌ์ฆ์ค ํ๋๋ก ๊ฒ์์ด ๊ฐ๋ฅํ๋ฉฐ ๋์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด QueryDSL์ ๊ธฐ๋ฐ์ผ๋กํ ๋ฐ์ดํฐ ์กฐํ ๋ก์ง์ ๊ตฌํํ์ต๋๋ค.
ํ๊ทธ์ ์์ฑ์ ๊ธ ์์ฑ์ ์ด๋ฃจ์ด์ง๋ฉฐ tagging.js๋ฅผ ํ์ฉํ์ฌ ํ๊ทธ ์์ฑ์ ์ค๋ณต์ ํ๋ฉด๋จ์์ ๋์ ์ผ๋ก ์ ๊ฑฐํ๊ณ , ์ํฐ๋ก ํ์ฌ๊ธ ํ๊ทธ๋ฅผ ์์ฝ๊ฒ ์์ฑํ ์ ์๋๋ก ํ์์ต๋๋ค.
๊ฒ์๊ธ์ ๋ํด writable ํ๋๋ฅผ ๊ตฌ๋ถ์๋ก ํ์ฌ๊ธ ์์์ ์ฅ๊ธ๊ณผ ๊ณต๊ฐ๊ธ์ ๊ตฌ๋ถํ๊ณ ,
์์ฑ ์ ์ง์์ ์ผ๋ก ์์์ ์ฅ ๊ธ์ ์๋ ์ ์ฅ์ ํ๋๋ก ajax๋ก ํ์ฌ๊ธ ๋น๋๊ธฐ ํต์ ์ผ๋ก ๊ตฌํํ์์ต๋๋ค.
์ฒซ ์์ฑ๊ณผ ์์ ์ ๋ํ ๋๊ธฐํ๋ฅผ ์ํด ์ฒซ ์์ฑ ์๋ ์ ์ฅ ์ฑ๊ณต์ ์์ ํ ํ๋ฆฟ์ผ๋ก ๋ฆฌ๋ค์ด๋ ํธํ์ฌ ์ฒซ ์์ฑ์ ์๋์ ์ฅ ๊ธฐ๋ฅ๊ณผ ์์ ์ ๋ํ ์๋์ ์ฅ ๊ธฐ๋ฅ์ ๊ตฌ๋ถํด์ ์ฌ์ฉํ์์ต๋๋ค.
๊ตฌํ์ ๋ํ ์์ฑ๊ธ์ ์๋์์ ํ์ธํ์๊ธธ ๋ฐ๋๋๋ค. ๊ฒ์๊ธ ์๋์ ์ฅ ๊ธฐ๋ฅ ๊ตฌํ ํฌ์คํ
ํ ๋ธ๋ก๊ทธ ์ ์ ๊ฐ ์ด์ฉ์์ ๊ฒ์๊ธ์ ๋๊ธ์ ๋จ๊ธฐ๊ฑฐ๋ ์ด์ฉ์์ ๊ฒ์๊ธ์ ์ข์์๋ฅผ ๋๋ฅด๊ฑฐ๋ ์ด์ฉ์์ ๋ธ๋ก๊ทธ ์์ฒด๋ฅผ ํ๋ก์ฐ ํ ์ ์์ต๋๋ค.
ํด๋น ๊ธฐ๋ฅ์ ์ํํ ์ ์ด์ฉ์๋ ์ด์ ๋ํ ์๋ฆผ์ ๋ฐ์์ผ ํฉ๋๋ค.
ํด๋น ๊ธฐ๋ฅ์ ์ํํ ์ ์๋ฆผ ์ํฐํฐ๋ฅผ ์์ฑํ์ฌ ์๋ฆผ์์ ์๊ฐ ์ด๋ฅผ ์กฐํํ ์ ์๊ฒ ๋ง๋ค์์ต๋๋ค.
๋ค๋น๊ฒ์ด์
์์ ์ฝ์ง ์์ ์๋ฆผ์ด ์กด์ฌํ ๊ฒฝ์ฐ ๋นจ๊ฐ ์ซ์๋ก ๋๋๋งํ์ฌ ์ด๋ฅผ ์ฝ๊ฒ ์์๋ณผ ์ ์๋๋ก ํ์์ต๋๋ค.
์๋ฆผ์ ๋๋ฅผ ๊ฒฝ์ฐ ์๋ฆผ๊ด๋ฆฌ ํ์ด์ง๋ก ๋ค์ด๊ฐ ์ ์์ต๋๋ค.
์๋ฆผํ์ด์ง์์๋ ํด๋ฆญ ๊ฐ๋ฅํ ์๋ฆผ์นด๋๋ค์ด ์กด์ฌํ๋ฉฐ ์ฝ์ง ์์์ ๊ฒฝ์ฐ ํฐ์์ผ๋ก ์ฝ์์ ๊ฒฝ์ฐ ํ์์ผ๋ก ํ์๋ฉ๋๋ค.
์๋ฆผ์ ๋จ๊ฑด ํด๋ฆญํ ๊ฒฝ์ฐ ์ฝ์ ๊ฒ์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
(์ฝ์ ๊ฒฝ์ฐ ๋ค๋น๊ฒ์ด์ ๋ฐ ์๋ฆผ์ ์์ ๋ ์ด์ ํฌํจ๋์ง ์์ต๋๋ค.)
์๋ฆผ ๋ชจ๋ ์ฝ๊ธฐ
, ๋ชจ๋ ์ญ์
๋ฅผ ํตํด ์๋ฆผ์ ๋ํ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
์ฝ์ง์์ ์๋ฆผ๋ง ๋ณผ ์ ์๋๋ก ํํฐ ๊ธฐ๋ฅ์ ๋ฃ์ด๋์์ต๋๋ค.
์ข์์ ๋ฐ ํ๋ก์ฐ ๊ธฐ๋ฅ์ผ๋ก ํ์ฌ๊ธ ๊ฒ์๊ธ์ ์ข์์์ ๋ํ ์ถ์ฒ ์ ์ ๋ฅผ ๋ณผ ์ ์๊ฑฐ๋ ์ ์ ๋ค์ ํ๋ก์ฐ, ํ๋ก์ ๋ชฉ๋ก์ ๋ณผ ์ ์๋๋ก ํ์์ต๋๋ค.
์์ ์ด ๋๋ฅธ ์ข์์ ๊ฒ์๊ธ๋ง ๋ชจ์๋ณผ ์ ์๋๋ก Personal ์ข์์ ๋ฆฌ์คํธ ํ์ด์ง๋ฅผ ์ถ๊ฐํ์์ต๋๋ค.
๊ฒ์๊ธ ๋ฆฌ์คํธ ๋ ๋๋ง์ Pageable์ ํ์ฉํ ํ์ด์ง ๊ธฐ์ ์ ์ ์ฉํ์์ต๋๋ค.
์ด๊ธฐ ๋ก๋ ์ 5๊ฐ์ ๊ฒ์๊ธ ์นด๋๋ฅผ ๋ ๋๋งํ๋ฉฐ, AJAX ๊ธฐ๋ฐ์ ๋ฌดํ ์คํฌ๋กค ๊ธฐ๋ฅ์ ๊ตฌํํ์ฌ ์ฌ์ฉ์๊ฐ ์คํฌ๋กค์ ์ตํ๋จ์ผ๋ก ๋ด๋ฆด ๊ฒฝ์ฐ ์ถ๊ฐ๋ก 5๊ฐ์ ๊ฒ์๊ธ ์นด๋๋ฅผ ๊ฐ์ ธ์ค๋๋ก ๊ตฌ์ฑํ์์ต๋๋ค.
๋ํ, ์ฟผ๋ฆฌ ์คํธ๋ง์ ํตํด tagName, seriesName, search์ ๊ฐ์ ์กฐ๊ฑด๋ณ ์กฐํ ๊ธฐ๋ฅ์ ์ง์ํ๋ฉฐ, ์ด๋ฅผ Querydsl์ ํ์ฉํ ๋์ ์กฐํ ์ฟผ๋ฆฌ๋ก ์ฒ๋ฆฌํ์ฌ ํจ์จ์ ์ธ ์กฐ๊ฑด๋ณ ๋ฐ์ดํฐ ์กฐํ๊ฐ ๊ฐ๋ฅํ๋๋ก ๊ตฌํํ์์ต๋๋ค.
๋ฌดํ ์คํฌ๋กค ํ์ด์ง ๊ธฐ๋ฅ ๊ตฌํ ๊ณผ์
Thymeleaf์ ํ ํ๋ฆฟ ์กฐ๊ฐ(th:fragment)์ ํ์ฉํ์ฌ ๊ณ์ธต์ ์ธ ๋๊ธ(๋๋๊ธ ํฌํจ)์ ์ฌ๊ท์ ์ผ๋ก ๋ ๋๋งํ๋ ๊ตฌ์กฐ๋ก ์ค๊ณ๋์์ต๋๋ค.
์๊ธฐ ์์ ์ ์ฐ๊ด๊ด๊ณ๋ก ๋งบ๋ parentId์ childrens๋ฅผ ์ด์ฉํ์ฌ ๋๊ธ๊ณผ ๋๋๊ธ์ ๋ ผ๋ฆฌ์ ๊ณ์ธต ๊ตฌ์กฐ๋ก ์์ํ ํ, ๋ฐํ์ ์ํ DTO์์ ์์ children์ด ์กด์ฌํ ๊ฒฝ์ฐ ๋ฌดํ์ผ๋ก ๋ถ๋ชจCommentsDto๊ฐ ์์CommentsDto๋ฅผ ๊ฐ์ง๋๋ก ๋ง๋ค์์ต๋๋ค.
ํ ํ๋ฆฟ์์๋ th:block ๋ฐ th:replace๋ฅผ ์ฌ์ฉํ์ฌ commentBlock์ ์ฌ๊ท์ ์ผ๋ก ํธ์ถํจ์ผ๋ก์จ ๋ฌดํ ๋๋๊ธ ๊ตฌ์กฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ๊ตฌํํ์์ต๋๋ค.
๋ํ, collapse ๊ธฐ๋ฅ์ ํ์ฉํ ๋๋๊ธ ์ ๋ ฅ ํผ์ ์ ๊ณตํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๋ฉฐ, ๋ก๊ทธ์ธ ์ํ์ ๋ฐ๋ผ ๋๊ธ ์์ฑ UI๋ฅผ ์ ์ดํ์ฌ ์ ๊ทผ์ฑ์ ๋ณด์ฅํฉ๋๋ค.

์คํธ๋ฆผ, ๋๋ค๋ฅผ ํ์ตํ์ฌ ์ด๋ฅผ ํ๋ก์ ํธ์ ์ ์ฉํ์์ต๋๋ค. ์ ์ฉํ์ง ์์ ์ฝ๋๊ฐ ์กด์ฌํ๋๋ฐ ์ด๋ ๊ฐ๋ ์ฑ์ ๊ธฐ์ค์ผ๋ก ๊ฐ๋ฐ์ ๋ณธ์ธ์ ํ๋จํ์ ๊ฒฐ์ ํ์์ต๋๋ค.
๊ธฐ์กด Editor ์์ ์์ ์ฌ์ง์ ์ฒจ๋ถํ ๋, ์ฆ๊ฐ์ ์ผ๋ก ์ ์ฅ์์ ์ ๋ก๋ ๋์ด ์ค์ ์ ์ฅ์ ํด๋น ์ฌ์ง๋ค์ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ ์ ์ฅ์์ ์ฐ์ง ์๋ ์ฌ์ง๋ค์ด ์์ด๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ์์ต๋๋ค.
์ด๋ฅผ S3 ๊ฐ์ฒด ํ๊ทธ๋ฅผ ์ด์ฉํ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ๋ฅผ ํตํด ์ค์ ๊ฒ์๊ธ ์ ์ฅ ์์ ์ content์์ ์ฐ์ด๋ ์ฌ์ง ๊ฐ์ฒด์ ๋ํด ์์ํ ํ๊ทธ๋ฅผ ๋ถ์ฐฉํ๊ณ , ์์ฑ ์์ ์ ๋ก๋๋ ํ๊ทธ์๋ ์์ํ๊ทธ๋ฅผ ๋ถ์ฐฉํ์ต๋๋ค.
ํ๊ทธ์ ์ํ๊ด๋ฆฌ๋ PostFile์ด๋ผ๋ ์ํฐํฐ๋ฅผ ํตํด ๊ด๋ฆฌํ์ฌ ์์ ์ ์๋ก์ด ์์ํ ํ๊ทธ๋ฅผ ๋ถ์ฐฉํ๊ฑฐ๋ ๊ธฐ์กด ์์ํ ํ๊ทธ๋ฅผ ์์ํ๊ทธ๋ก ๋ณํํ๋ ๋ฑ์ ์์ ์ด ๊ฐ๋ฅํ์ต๋๋ค.
์ฌ์ง ์ ์ฅ์ฉ๋ ์ต์ ํ ๊ตฌํ ๊ณผ์
๋ค์๊ณผ ๊ฐ์ ๊ทน๋จ์ ์ธ ์ ์ฑ ์ฌ์ฉ์ ์๋๋ฆฌ์ค๋ฅผ ๋ฐฉ์งํ๊ณ ์ ์งง์ ์๊ฐ์์ ์๋ํฐ ์ด๋ฏธ์ง ์ ๋ก๋๊ฐ ๋งค์ฐ ์์ฃผ ๋ค์ด์์ ๊ฒฝ์ฐ ํด๋น ์ปจํธ๋กค๋ฌ์ ์ ๊ทผ์ 1๋ถ๊ฐ ๋ง๋๋ก ๊ตฌํํ์ต๋๋ค.
์์ฒญ ์๋ฅผ ์นด์ดํธํ๊ณ ์ํ๋ฅผ ์์ ํ๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ํด, ๋์์ฑ ๊ด์ ์์ ์์ ํ ์บ์๋ฅผ ์ ๊ณตํ๋ Google์ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Guava๋ฅผ ์ฌ์ฉํ์ฌ ์ํ ๊ด๋ฆฌ๋ฅผ ๊ตฌํํ์์ต๋๋ค. Guava๋ ๋์์ฑ ์ ์ด์ ์๋ ๋ง๋ฃ ๊ธฐ๋ฅ์ ๋ด์ฅํ๊ณ ์์ด, ๋ณต์กํ ๋ก์ง ์์ด ํจ์จ์ ์ผ๋ก ์์ฒญ ์ ํ ๋ก์ง์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์ง์ ํ ์๊ฐ๋์ ์ต๋ ์์ฒญ์๋ฅผ ์ธ์๋ก ๋ฐ๋ RateLimit AOP๋ฅผ ์ค๊ณํ์ฌ ํด๋น ๊ธฐ๋ฅ์ ๋ค๋ฅธ ์ปจํธ๋กค๋ฌ ๋ฉ์๋์์๋ ํ์ฉํ ์ ์๊ฒ ํ์์ต๋๋ค.
(์๋์ ํ
์คํธ๋ฅผ ์ํ ์์์ผ๋ก, 1๋ถ๊ฐ 5ํ ์ด๊ณผ ์์ฒญ์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ alert๋ฅผ ๋์ฐ๋ ๊ฒ์ผ๋ก ๊ธฐ๋ฅ์ ๋ง๋ค์์ต๋๋ค. ์ค์ ์ ์ฉ์์๋ ๋์ฑ ๊ด๋ํ๊ฒ ์ ์ฉํ ๊ฒ์
๋๋ค.)
๊ธฐ์กด AOP ๋ฐฉ์์ RateLimit(์ฒ๋ฆฌ์จ ์ ํ) ๊ธฐ๋ฅ์ ํํฐ๋ก ์ฎ๊ฒจ ์ฌ ๊ตฌํํ์์ต๋๋ค.
๊ด๋ จ ์์ฑ๊ธ : ์ฒ๋ฆฌ์จ ์ ํ ์ฅ์น AOP -> Filter
์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ๊ทธ ๋ชฉ๋ก์ด๋ ๋ค๋น๊ฒ์ด์ ๊ณผ ๊ฐ์ ๋ฐ๋ณต์ ์ผ๋ก ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๊ฒฝ์ฐ, ๋งค๋ฒ DB์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด ์ฑ๋ฅ ์ ํ์ ๋ถํ์ํ ๋ฆฌ์์ค ์๋ชจ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Ehcache๋ฅผ ํ์ฉํ์ฌ ์บ์ฑ์ ์ ์ฉํ์์ต๋๋ค.
Ehcache๋ฅผ ํตํด ๋ณ๊ฒฝ์ด ์ ๊ณ , ์กฐํ ๋ถ๋ด์ด ํฐ ๋ฐ์ดํฐ๋ฅผ ์บ์ฑํ์ฌ ๋ถํ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ๋ฅผ ์ต์ํํ์์ผ๋ฉฐ, ์บ์์ Key-Value ๊ตฌ์กฐ๋ฅผ ํ์ฉํ์ฌ ๋ค์ํ ๋ฉ์๋์์ ์บ์ ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋๋ก ๊ตฌ์ฑํ์์ต๋๋ค.
๋ํ, LRU(Least Recently Used) ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ์ฌ ๊ฐ์ฅ ์ค๋๋ ๋ฐ์ดํฐ๋ถํฐ ํ๊ธฐํ๋๋ก ์ค์ ํ์์ผ๋ฉฐ, TTL(Time-To-Live)์ 6์๊ฐ์ผ๋ก ์ง์ ํ์ฌ ์ผ์ ์๊ฐ์ด ์ง๋๋ฉด ์๋์ผ๋ก ์บ์๊ฐ ๊ฐฑ์ ๋๋๋ก ์ค์ ํ์์ต๋๋ค.
์ด๋ฅผ ํตํด ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํ๋ฉด์๋ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ๋ฌ์ฑํ ์ ์๋๋ก ํ์์ต๋๋ค.
์กฐํ์ ์ฆ๊ฐ์ ๊ฒฝ์ฐ ๊ฒ์๊ธ ์ํฐํฐ์ viewCount๋ฅผ ์ถ๊ฐํ์ฌ ์ด๋ฅผ increaseํ๋ ๋ฐฉ์์ผ๋ก ์ ํํ์์ต๋๋ค.
์ฟ ํค์ Ehcache๋ฅผ ์ด์ฉํ์ฌ ์กฐํ์ ์ฆ๊ฐ ์ค๋ณต์ ๋ง๊ณ ๋๊ด์ ๋ฝ์ ์ด์ฉํ์ฌ ๋์์ฑ ๋ฌธ์ ๋ฅผ ์ต์ํํ๋ฉด์๋ ์ฑ๋ฅ์ ํฌ๊ฒ ๋จ์ด์ง์ง ์๋๋ก ํ์์ต๋๋ค.
์กฐํ์ ์ฆ๊ฐ ๋ก์ง ๊ตฌํ ์์ฑ ๊ธ : ์กฐํ์ ์ฆ๊ฐ ๋ก์ง ๊ตฌํ
๋ฐ์ดํฐ ๊ฐ์ฒด์ ์ํฐํฐ ๊ฐ์ฒด๊ฐ์ ๋ณํ์ ์ํด MapStruct, ModelMapper์ค ๊ธฐ์ ์ ์ฉ ์ฌ๋ถ๋ฅผ ์ํ ์ฌ์ ์กฐ์ฌ์ฌ์ ์กฐ์ฌ ๊ด๋ จ ๊ธ ํ MapStruct๋ฅผ ์ ํํ์ต๋๋ค.
์ฑ๋ฅ์ ์ผ๋ก ๋ฆฌํ๋ ์ ๋ฐฉ์์ ModelMapper๋ณด๋ค ํ๋ฅญํ ํผํฌ๋จผ์ค๋ฅผ ๋ณด์ฌ์ฃผ์๊ณ ์ฌ์ฉํ๋๋ฐ ์์ด ์ด๋ ค์ด ๋๋์ ํฌ๊ฒ ์์๋ค๊ณ ์๊ฐํด์ MapStruct๋ฅผ ์ ํํ์ต๋๋ค.
์ํฐํฐ๋ DTO์ ์์ฑ๋ก์ง์ ํ ์์ญ์ผ๋ก ๋ชฐ์ ์ฒ๋ฆฌํ ์ ์์์ผ๋ฉฐ List ๋ณํ๊ณผ ๊ฐ์ด ์๋์ ์ธ ๋ถ๋ถ์์ ์ค๋ ์ฝ๋๋ ๊ฐ์์ ํจ๊ณผ๊ฐ ์์์ต๋๋ค.
Nginx๋ฅผ ๋ฆฌ๋ฒ์ค ํ๋ก์๋ก ์ฌ์ฉํ์์ผ๋ฉฐ, ์๋ฒ๋ ๊ธฐ๋ณธ์ ์ผ๋ก EC2์์ ๋์ปค ์ปดํฌ์ฆ๋ฅผ ํตํด ๋์์ง๊ฒ ๋ฉ๋๋ค.
main ๋ธ๋์น์ Push, Pull Request์์ github action์ด ๋์ํ์ฌ ์๋ ๋ฐฐํฌ๊ฐ ์ด๋ฃจ์ด์ง๋๋ค.
๋ฐฐํฌ ์๋ํ ์คํฌ๋ฆฝํธ์์ AWS KEY์ ๊ฐ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ GITHUB Secrets์ ๋ด์ ๊ฐ์ ธ์ ์ฌ์ฉํฉ๋๋ค.
main ๋ธ๋์น์ ์ ๋ฐ์ดํธ๋ ๋ด์ฉ์ ๋น๋ํ๊ณ ๋์ปคํ์ผ๋ก ํ์ฌ๊ธ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์ด ๋์ปค ํ๋ธ์ ์ ๋ก๋ ํ๋ ๊ฒ์ผ๋ก ๋น๋ ๊ณผ์ ์ด ์ด๋ฃจ์ด์ง๋๋ค.
๋ฐฐํฌ ๊ณผ์ ์ ๋น๋ ๊ณผ์ ์ ์์ ํ ์๋ฃํ์ ๊ฒฝ์ฐ ์ํ๋ฉ๋๋ค.
ํ์ฌ ์๋ฒ๊ฐ blue ํ๋กํ์ธ์ง green ํ๋กํ์ธ์ง env ์๋ํฌ์ธํธ๋ก ํ์ฌ๊ธ ํ์ธํฉ๋๋ค.
์ด ํ์ธ ์ ์ฐจ๋ฅผ ํตํด ํ์ฌ ๋ฐฐํฌ์ ๋์์ง ํ๋กํ์ ๊ฒฐ์ ํฉ๋๋ค (blue -> green) or (green -> blue)
๋์ปค ํ๋ธ์์ ์ด๋ฏธ์ง๋ฅผ pull๋ฐ๊ณ ์ด๋ฅผ docker compose ํ์ฌ ์ปจํ ์ด๋๋ฅผ ๋์๋๋ค.
์ปจํ ์ด๋๊ฐ ์ ๋์์ง์ง ํ์ธํ๊ณ , ๊ธฐ์กด์ ๋์์ง ์ปจํ ์ด๋๋ฅผ ๋๋๋ค.
์ด๋ฅผ ํตํด ์ฌ์ฉ์๋ ์๋ฒ์ ์ ๋ฐ์ดํธ๋ฅผ ์๋ฒ ์ค๋จ ์์ด ์์ฐ์ค๋ฝ๊ฒ ๊ฒฝํํ ์ ์์ต๋๋ค.