์ด์ ์ sports echo ํ๋ก์ ํธ์์ Redis์ sorted set์ ํ์ฉํด ๋๊ธฐ์ด ์์คํ ์ ๊ตฌํํ์๋ค. ์ฌ๊ธฐ์ Redis๋ฅผ ์ฑํํ ์ด์ ๋ Redis๊ฐ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๋ฏ๋ก ์ฝ์ , ์ญ์ , ์กฐํ ์๋๊ฐ ๋งค์ฐ ๋นจ๋ผ ๋ง์ ์ฌ์ฉ์๋ค์ด ๋์์ ์ ์ํ๋ ๋๊ธฐ์ด ์์คํ ์
์ทจ์ ๊ณ ๋ฏผ ํ๋ฌ ์ธํด ์ง์์ , ์ ๋ ๋งํ๊ธฐ๋ฅผ ๋ง ๋๋ด๊ณ ์์ผ๋ก์ ์ทจ์ ์ค๋น์ ๋ํ ๊ณ ๋ฏผ์ด ๊น์ด์ง๋ ์๊ธฐ์์ต๋๋ค.
์ด์ ๊น์ง Elasticsearch๋ฅผ ํ์ฉํด ๊ฒ์ API์ ์๋๋ฅผ ๊ฐ์ ํ๋ค. ์ด์ ์๋๋ ์ถฉ๋ถํ ๋น ๋ฅด๋ฏ๋ก ๊ฒ์์ด์ ๋ฐ๋ฅธ ๊ฒ์ ๊ฒฐ๊ณผ ์ฑ๋ฅ์ ๊ฐ์ ํด๋ณด์. (์ฐธ๊ณ ๋ก ๋ถ๋ถ ๋ฌธ์์ด ๊ฒ์์ด ๊ฐ๋ฅํ API์ด๋ฉฐ ๋ชจ๋ ์์ด์ด๋ค.)๊ทธ์ ์ ์ฐ์ Elasticsearch์์ ์ธ๋ฑ์ฑ์ด ์ด๋ฃจ์ด์ง
FastAPI์ MongoDB๋ฅผ ํ์ฉํ ๋ฌธ์์ด ๊ฒ์ API๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์ ๊ทํํ์์ ์ฌ์ฉํ์๋ค. ๋ฌธ์์ด ๊ฒ์์ ๊ฒฝ์ฐ ์์ ํ ์ผ์นํ๋ ๊ฒฐ๊ณผ๋ฟ๋ง์ด ์๋๋ผ ํด๋น ๋ฌธ์์ด์ด ํฌํจ๋๋ ๊ฒฐ๊ณผ๋ ๊ฐ์ด ์ถ๋ ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋ฌธ์์ด(input_mark)๋ฅผ ํฌํจํ ๊ฒฐ
์ฐ์ DB๋ MongoDB์ด๋ฉฐ ํ์ฌ ํ ์ปฌ๋ ์ ์ ์ฝ 1277๋ง๊ฐ์ ๋ฌธ์๊ฐ ์ ์ฅ๋์ด ์๋ค. ์ด ๋ฌธ์๋ค์ ๊ฒ์ํ๋ API๊ฐ ์กด์ฌํ ๋, ์ด๋ป๊ฒ ํ๋ฉด ๋น ๋ฅด๊ฒ ๊ฒ์ํ ์ ์๋์ง๋ฅผ ๊ธฐ๋กํด๋ณด์.์ด API๋ ๋ฌธ์์ fillingDate ์ ๋ฒ์ ๊ฒ์์ ์ง์ํ๋ API์ด ์ด๋ค. st
FastAPI๋ก ๊ตฌํ๋ ๊ฐ๋จํ ์๋ฒ ํ๋ก์ ํธ๋ฅผ ๋์ปค ์ด๋ฏธ์ง๋ก ๋น๋ํ์ฌ ์ปจํ ์ด๋๋ก ์คํํด๋์๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ปจํ ์ด๋๋ก ์คํํ์ฌ ์๋ฒ์ ์ฐ๋ํด๋ณด๋ ์์ ์ ํด๋ณด์.MariaDB image pull์ฐ์ MariaDB ์ฌ์ฉ์ ์ํด ์ด๋ฏธ์ง๋ฅผ pull ๋ฐ์ ์ค์นํ๋ค.MariaD
ํ์ด์ฌ์ผ๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์๋ค. ๊ฐ๊ฐ์ ๋ฐฉ๋ฒ์ ๋น๊ตํด๋ณด์. ์์ถ ํ์ผ ๊ฐ์ฅ ๊ฐ๋จํ๊ณ ์๋ ๋ก๊ทธ ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ฝ๋๋ฅผ ์์ถํ์ฌ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ด ์๋ค. requirements.txt์ ํ์ํ
ํํฐ(Filter)๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฒญ๊ณผ ์๋ต์ ๊ฐ๋ก์ฑ์ ์ ์ฒ๋ฆฌ ๋๋ ํ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ค. ์ฃผ๋ก HTTP์์ฒญ๊ณผ ์๋ต์ ์ฒ๋ฆฌํ๊ธฐ ์ , ์๋ต์ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ด๊ธฐ ์ ์ ํน์ ํ ์์ ์ ์ํํ ๋ ์ฌ์ฉ๋๋ค.์ธํฐ์ ํฐ(Interceptor)๋ ์คํ๋ง์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ผ๋ก ์ปจํธ
LocalDateTime.now() ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ก์ปฌ ์๋ฒ์์๋ ๋ก์ปฌ ์๊ฐ์ ๋ง์ถฐ ์ง๊ธ ์๊ฐ์ ๊ตฌํ ์ ์๋ค. (ํ๊ตญ ์๊ฐ ๊ธฐ์ค UTC+9) ๊ทธ๋ฐ๋ฐ ์๋ฒ์์ ํด๋น ์ฝ๋๊ฐ UTC ๊ธฐ์ค์ผ๋ก ์คํ๋์ด ๋ก์ปฌ์ ํ์ฌ ์๊ฐ๊ณผ ๋ง์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์๋ค.์ฐ๋ฆฌ ์๋น์ค์์๋ ๊ตฌ๋งค ์
AWS EC2 ์ธ์คํด์ค์ ๋์ปค๋ฅผ ์ค์นํ ๋ค CI/CD ํ๊ฒฝ์ ๊ตฌ์ถํ์ฌ ์๋ฒ๋ฅผ ๋ฐฐํฌํ์๋ค. ์ด ๋ ์๋์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒ ๋ก๊ทธ๋ฅผ ํ์ธํ ์ ์๋ค.์คํ์ค์ธ ์ปจํ ์ด๋ ๋ชฉ๋ก ํ์ธsudo docker ps์ปจํ ์ด๋ ๋ก๊ทธ ํ์ธsudo docker logs -f ์ปจํ ์ด๋ ID
NoSQL๊ณผ RDBMS์ ๋ํด ์๋๋๋ก ์ค๋ช ํด์ฃผ์ธ์.โก๏ธ RDBMS๋ ์๊ฒฉํ ์คํค๋ง๋ฅผ ๊ฐ์ง ํ ์ด๋ธ ๊ธฐ๋ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ๊ณผ ๋ช ํํ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋ณด์ฅ์ ์ฅ์ ์ ๊ฐ์ง์ง๋ง ์ ์ฐ์ฑ์ด ๋จ์ด์ง๊ณ ๋ณต์กํ๋ฉฐ ์์ง์ ํ์ฅ๋ง ๊ฐ๋ฅํ๋ค๋ ๋จ์ ๋ํ ๊ฐ์ง๋๋ค.NoSQL์
ํด๋น ๊ตฌ๋งค ํผ์ ํผ์ ์์ฑํ ์์ฑ์๋ง ์กฐํํ ์ ์์ด์ผ ํ๋ฏ๋ก memberId๋ฅผ ์ด์ฉํด ๋ก๊ทธ์ธํ ์ ์ ์ ์์ฑ์๊ฐ ์ผ์นํ๋์ง ํ์ธํ๋ ๋ก์ง์ด ํ์ํ๋๋ฐ ์ด ๋
github actions๋ก CI/CD๋ฅผ ์งํํ๋ค๊ฐ build ์ค๋ฅ๊ฐ ๋ฐ์ํ์๋ค. >Error: Could not find or load main class org.gradle.wrapper.GradleWrapperMain Caused by: java.lan
mockito machters ํ๋ผ๋ฏธํฐ ํผํฉ ์ฌ์ฉ์ผ๋ก ์ธํ ์์ธ ๋ฐ์ ์ฒ๋ฆฌ
JPA n+1 ๋ฌธ์ ๋? JPA ์ง์ฐ ๋ก๋ฉ์์ ์ฐ๊ด ๊ด๊ณ๊ฐ ์ค์ ๋ ์ํฐํฐ๋ฅผ ์กฐํํ ๊ฒฝ์ฐ(1)์ ์กฐํ๋ ๋ฐ์ดํฐ ๊ฐฏ์(n) ๋งํผ ์ฐ๊ด๊ด๊ณ์ ์กฐํ ์ฟผ๋ฆฌ๊ฐ ์ถ๊ฐ๋ก ๋ฐ์ํ๋ ํ์ ํด๋น ๋ฌธ์ ์ ํด๊ฒฐ์ ์ํด JPQL์ fetchjoin๊ณผ Entity Graph๋ฅผ ์ฌ์ฉํ์๋ค. ๋ค๋ง
Redis sorted set๊ณผ ๋น๊ด์ ๋ฝ์ ํ์ฉํ ํซ๋ ๊ตฌ๋งค ๋๊ธฐ์ด ๊ตฌํ ๋ก์ง์์ ํธ๋ํฝ์ด ๋ชฐ๋ ธ์ ๋ ๊ตฌ๋งค๊ฐ ์ ๋๋์ง ํ์ธํ๋ ๋ฐ์ดํฐ ์ ํฉ์ฑ ํ ์คํธ์ ์ฑ๋ฅ ํ ์คํธ๋ฅผ ngrinder๋ก ์งํ ํ AWS Cloud Watch๋ฅผ ํตํด ๋ชจ๋ํฐ๋ง์ด์ ์ ํ ์คํธ ์คํฌ๋ฆฝํธ์๋ ๋ก๊ทธ์ธ
Redis sorted set๊ณผ ๋น๊ด์ ๋ฝ์ ํ์ฉํ ํซ๋ ๊ตฌ๋งค ๋๊ธฐ์ด ๊ตฌํ ๋ก์ง์์ ์ฌ์ฉ์๋ค์ด ๋์์ ๊ตฌ๋งค ์์ฒญ์ ๋ณด๋์ ๋ ๊ตฌ๋งค๊ฐ ์ ๋๋์ง ํ์ธํ๋ ๋ฐ์ดํฐ ์ ํฉ์ฑ ํ ์คํธ์ ์ฑ๋ฅ ์ธก์ ํ ์คํธ๋ฅผ ngrinder๋ก ์งํ ํ AWS Cloud Watch๋ฅผ ํตํด ์ฑ๋ฅ ์ธก์ ์ด์
Redis sorted set๊ณผ ๋น๊ด์ ๋ฝ์ ํ์ฉํ ํซ๋ ๊ตฌ๋งค ๋๊ธฐ์ด ๊ตฌํ ๋ก์ง์์ ์ฌ์ฉ์๋ค์ด ๋์์ ๊ตฌ๋งค ์์ฒญ์ ๋ณด๋์ ๋ ๊ตฌ๋งค๊ฐ ์ ๋๋์ง ํ์ธํ๋ ๋ฐ์ดํฐ ์ ํฉ์ฑ ํ ์คํธ๋ฅผ ngrinder๋ก ์งํ ํด๋น ํ ์คํธ๋ ์ฌ์ฉ์๋ค์ด ๋ก๊ทธ์ธ์ ํด์ผ ๊ตฌ๋งค๋ฅผ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ก
์ํฐํฐ์ ์ญ์ ์ n๊ฐ์ delete ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ๋ ๊ฒ์ ๋ฐ๊ฒฌํ๊ณ ์ด๋ฅผ 1๊ฐ์ ์ฟผ๋ฆฌ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ฟผ๋ฆฌ ํ๋ ์งํ, cascade์ orphanRemoval ์ค์ ์ ์ํ ์ค๋ฅ ๋ฐ์๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ ๊ณ ๋ฏผ
sports echo ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ ๋จ๊ธฐ๋ ์ค๋์ ํธ๋ฌ๋ธ ์ํ ์ ์ํ ์ฐธ์กฐ ์ค๋ฅ์ด๋ค. ์ด๊ฒ์ product์ product image ํ ์ด๋ธ์ ๋ถ๋ฆฌํ๋ ์ค์ ๋ฐ์ํ์๋ค. ์ค๊ณ ์ฐ์ ์๋์ ๋ก์ง์ product ์ํฐํฐ ๋ด๋ถ์ product ์ด๋ฏธ์ง๋ฅผ string