๋ชฉ๋ก๋ถ๋ฅ ์ ์ฒด๋ณด๊ธฐ (123)
DevLog ๐ถ
๐ฑ ๋ค์ด๊ฐ๊ธฐ ์ ํตํฉ ํ ์คํธ๋ฅผ ํ๋ค ๋ณด๋ฉด, ์ค์ ๋น ์ค์ ์ผ๋ถ๋ง stubbing์ ํ๊ณ ์ถ์ ์ํฉ์ด ์๊ธด๋ค.์๋ฅผ ๋ค์ด, ์ธ๋ถ API๋ฅผ ํต์ ํ๊ฑฐ๋ ์ธ๋ถ ์์คํ ์ ํ์ฉํ๊ฒ ๋๋ฉด ํ ์คํธ์์ ๊ทธ๋๋ก ํ์ฉํ๊ธฐ ์ด๋ ค์ด๋ฐ, ํด๋น ๋ถ๋ถ์ ๋ํด์๋ง ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์๋๋ฆฌ์ค๋ฅผ ์ ๊ณตํ์ฌ ์ฐ๋ฆฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ๋์ํ๋์ง ํ์ธํ๊ณ ์ถ์ ์ ์๋ค. ํ์ง๋ง, ๋ณดํต Spring Context์์๋ ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ๋น์ ๊ทธ๋๋ก ๋ฑ๋กํ๊ฒ ๋๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์, ๋ช ๊ฐ์ง ํน๋ณํ ์กฐ์น๋ฅผ ํด์ฃผ์ด์ผ ํ๋๋ฐ ํ ๋ฒ ์ดํด๋ณด์. โ๏ธ ํ ์คํธ ์๋๋ฆฌ์ค - ์ฌ์ฉ์๊ฐ ์ํ์ ๊ตฌ๋งคํ๊ฒ ๋๋ฉด, ์ธ๋ถ API๋ฅผ ํธ์ถํ์ฌ ์ฌ๊ณ ๊ฐ ์กด์ฌํ๋์ง ํ์ธํ๋ค. - ๋ง์ฝ ์ฌ๊ณ ๊ฐ ์กด์ฌํ๋ฉด ์ธ๋ถ API๋ ‘SUCCESS’๋ผ๋ ์๋ต์, ์ฌ๊ณ ๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด ‘FA..
๐ฑ ๋ค์ด๊ฐ๊ธฐ ์ ํ์ฌ ๋ค์ด๊ฐ๊ณ ๋ธ๋ก๊ทธ๊ฐ ๋๋ฌด ๋ธํด์ง ๊ฒ ๊ฐ์์, ์ด์ ์ ์ฐ๋ ค๋ค๊ฐ ๋ชป ์ด ๊ธ์ ์์ฑํ๊ณ ์ ํ๋ค ๐ฅน (๋ฌดํ์ ์์ ์ ์ฅ...) ์ฌ๋ด์์ Replication์ ํ์ฉํ๊ณ ์๋ค๋ ๊ฑด ์๊ณ ์๋๋ฐ, ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค ์์ผ๋ก ๋์ํ๋์ง๋ ์ ๋๋ก ์ดํดํ์ง ๋ชปํ๊ณ ์์๋ ๊ฒ ๊ฐ์์ ๊ฐ๋จํ๊ฒ MySQL์ ํ์ฉํ์ฌ Replication์ด ์ด๋ค ์์ผ๋ก ๋์ํ๋์ง ๊ตฌ์ถํด๋ณด์๋ค. ๊ตฌ์ฒด์ ์ธ ๋ถ๋ถ์ ๋ ๊ณต๋ถํ๋ฉด ์ข๊ฒ ์ง๋ง, ํ์ต ์ฉ๋๋ก ์์ฑํ๋ ๊ธ! ๐ฑ ๋ณต์ ๋ ๋ฌด์์ผ๊น?๋ณต์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก master ๋ ธ๋์์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์์ ๋ slave ๋ ธ๋์๋ ๋ณ๊ฒฝ๋ ๋ด์ฉ์ ์ ์ฉ์ํค๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ, MySQL์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น๋๊ธฐ ๋ณต์ ๋ฐฉ์์ ํ์ฉํ์ฌ ๋ ์ฌ์ด์ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ๋ง์ถ๊ณ ์๋ค.์ฌ๊ธฐ์ ๋งํ๋ ๋น๋๊ธฐ ๋ณต์ ..
๐ฑ ๋ค์ด๊ฐ๊ธฐ ์ ๋๋ ํ์์ ๋ง์ฐ์ค๋ ์ฌ์ฉํ์ง ์์ง๋ง, ๋งฅ๋ถ ํฐ์นํจ๋๋ฅผ ์ ๋ง ๋ง์ด ์ฌ์ฉํ๋ ํธ์ด์์ด์ ๊ฐ๋ฐํ ๋ ๋จ์ถํค๋ฅผ๋ง์ด ์ฌ์ฉํ์ง ์๋ ํธ์ด์๋ค. ๊ทธ๋ฌ๋ค ๋ณด๋ ์๋์ผ๋ก ๊ฐ๋ฐํ ๋ ๋ฏธ๋ฌํ๊ฒ ์๋ ์ฐจ์ด๊ฐ ๋ฌ์๋๋ฐ, ์ด๋ฒ์ ๋จ์ถํค๋ ๊ณต๋ถํ ๊ฒธ, ๋ฆฌํฉํฐ๋ง ์ ์ด๋ป๊ฒ ํ๋ฉด Intellij ๋ฅผ ์ต๋ํ ํ์ฉํ ์ ์๋์ง ์คํฐ๋ ํ๋ ์๊ฐ์ ๊ฐ์ก๋ค. (๊ฐ๋๋๊ฐ๋ฐ์๋ ๋๋ถ์ ๋ง์ด ๋ฐฐ์ธ ์ ์๋ ์๊ฐ์ด์๋ค ใ _ใ ) ์ด๋ฒ ํฌ์คํ ์์ ์ฌ์ฉ๋ ์ํ ์ฝ๋๋ ๋ฐฑ๋ช ์ ๋์ ๊นํ๋ธ๋ฅผ ๊ฐ๋ฉด ํ์ธํ ์ ์๋๋ฐ, ๋๋ ์ฌ๋ด์์ ์ฝํ๋ฆฐ์ ์ฌ์ฉํ๊ณ ์๋ค ๋ณด๋๊น ํด๋น ์ฝ๋๋ฅผ ์ฝํ๋ฆฐ + Kotest๋ก ๋ณํํ์ฌ ์ฐ์ต์ ํด๋ณด์๋ค. ์ด๋ค ์์ผ๋ก ๋ฆฌํฉํฐ๋ง์ ํ๋์ง๋ ์๋์ ๋ ํ์งํ ๋ฆฌ์ ์ปค๋ฐ๋ณ๋ก ๋ํ๋ด์๋ค. GitHub - Cl8D/kotlin-exp..
โ๏ธ ๊ฐ์ฒด ์ง๋ ํ๋ก๊ทธ๋๋จธ์ ๊ฐ์ฅ ํฐ ์์ ๋ '๋ณํํ๋ ์๊ตฌ์ฌํญ์ ์ผ๋ง๋ ๋ ์ ๋์ํ ์ ์๋๊ฐ?' ์ด๋ค. ์๋ฅผ ๋ค์ด๋ณด์. ๊ณ ์์ด ์ค๋ต๋ฐ์ ์๋ก์ด ์ ์ ์ ฐํ๋ฅ์ด ๋ค์ด์๋ค. ์ ์ ์ ฐํ๋ฅ์ ์์ง ๋ฉ๋ด ์์ง์ ๋ฏธ์ํด์ ๋ ์ํผ๋ฅผ ๋ค ์ธ์ฐ์ง ๋ชปํ๋ค. ์ด๋ ์๋๋ฅ์ด ์๋ฐ๋ฅ์๊ฒ ๋ธ๊ธฐ๋ผ๋ผ๋ฅผ ์ฃผ๋ฌธํ๊ณ , ์๋ฐ๋ฅ์ ์ ์ ์ ฐํ๋ฅ์๊ฒ ๋ธ๊ธฐ๋ผ๋ผ๋ฅผ ๋ง๋ค๋ผ๊ณ ์ง์ํ๋ค. ํ์ง๋ง ์ ์ ์ ฐํ๋ฅ์ ๋ธ๊ธฐ๋ผ๋ผ ๋ ์ํผ๋ฅผ ๋ชฐ๋ผ์ ์ด๋ป๊ฒ ํด์ผ ํ ์ง ๊ณ ๋ฏผ ์ค์ธ ์ํฉ์ด๋ผ๋ฉด, ์ด๋ค ํ์๋ฅผ ํ ์ ์์๊น? 1. ์์ ์ ฐํ๋ฅ์๊ฒ ๋ธ๊ธฐ๋ผ๋ผ ๋ง๋๋ ๋ฐฉ๋ฒ ๋ฌผ์ด๋ณด๊ธฐ 2. ๋ ์ํผ ๋ถ์ ์ฐธ๊ณ ํ์ฌ ๋ธ๊ธฐ๋ผ๋ผ ๋ง๋ค๊ธฐ ๋จผ์ , ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ๊ฒฝ์ฐ, ๋ง์ฝ ๋ธ๊ธฐ๋ผ๋ผ์ ๋ ์ํผ๋ฅผ ์ป์ ์๋ ์์ง๋ง, ๋ณํํ๋ ์๊ตฌ์ฌํญ์ ๋์ํ ์ ์๋ค. ๋ง์ฝ ์๋์ด ์ถ๊ฐ์ ์ผ๋ก ‘์, ๊ทผ๋ฐ ๋ธ๊ธฐ๋ผ๋ผ..
์๋ ์ ์ฑ ์ฝ์ผ๋ฉด์ ์์ฑํ๋ ๊ฑด๋ฐ ์ค๋๋ง์ ๊ธ ์ฌ๋ฆด ๊ฒธ... ์๋ฆฌ์ฆ ๋ง๋ฌด๋ฆฌ๋ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ์์ ์ฌ๋ฆฌ๋ ค๊ณ ํ๋ค :D โ๏ธ ์์จ์ ์ผ๋ก ํ๋ํ๋ ๊ฐ์ฒด ์์ ์ฑํฐ์์ ๋ ๊ฐ์กฐํ๋ ๊ฒ์ฒ๋ผ, ๊ฐ์ฒด๋ ์์จ์ ์ผ๋ก ํ๋์ด ๊ฐ๋ฅํ๋ค. ์ด๋, ๊ฐ์ฒด๊ฐ ํ๋ํ๋ ์ ์ผํ ์ด์ ๋, ๋ค๋ฅธ ๊ฐ์ฒด๋ก๋ถํฐ ์์ฒญ์ ์์ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ฌ๊ธฐ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๊ฐ์ฒด๊ฐ ์ํํ๋ ํ๋์ ‘์ฑ ์’์ด๋ผ๊ณ ํ๋ฉฐ, ์์จ์ ์ธ ๊ฐ์ฒด๋ ์ค์ค๋ก์ ์์ง์ ํ๋จ์ ๋ฐ๋ผ์ ๊ฐ์ ๋งก์ ์ฑ ์์ ์ํํ๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ค. ๊ฐ์ฒด๊ฐ ์์ ์ ์์ง์ ๋ฐ๋ผ์ ์ฑ ์์ ์์จ์ ์ผ๋ก ์ํํ๋ค๋ ๊ฒ ๋ฌด์์ ์๋ฏธํ๋ ๊ฑธ๊น? ์ฝ๊ฒ ์๊ฐํ๊ธฐ ์ํด ๋ค์ ๊ณ ์์ด ์ค๋ต๋ฐ ์์ ๋ฅผ ๊บผ๋ด๋ณด์. ๊ณ ์์ด ์ค๋ต๋ฐ์ ์ธ๊ธฐ๊ฐ ํญ๋ฐํ๋ฉด์ ์์นจ๋ถํฐ ๋ง์ ์๋ฃ ์ ์กฐ ์์ฒญ์ด ๋ค์ด์๋ค. ์ด๋ ์๋ฐ๋ฅ์ ์ ฐํ๋ฅ์๊ฒ ‘..
๐ฑ ๋ค์ด๊ฐ๊ธฐ ์ ๋๋ฌด ์ค๋๋ง์ ์์ฑํ๋ ๋ธ๋ก๊ทธ ๊ธ...! ์ต๊ทผ์ ์ฌ๋ด์์ ๋งค์ฐ ๋ง์ด ์ฐ์ด๋ ๋๋ฉ์ธ์ ๋ํด์ ๋ฆฌํฉํฐ๋ง์ ์งํํ์๋๋ฐ, ๊ฑฐ๊ธฐ์ ๋ง๋ฌ๋ ์ด์๋ค๊ณผ ๊ฐ๋จํ ์๊ฐ ๊ธฐ๋ก์ ๋ธ๋ก๊ทธ์ ๋จ๊ธฐ๋ฉด ์ข์ ๊ฒ ๊ฐ์์ ์์ฑํ๊ณ ์ ํ๋ค. ์ด๋ฏธ ํ ๋ด์์ ๊ณต์ ๋ ํ์๊ณ , ๋๊ธฐ๋ค์๊ฒ๋ ๊ณต์ ํ ๋ด์ฉ์ด๊ธฐ๋ ํ๊ณ , ์ฌ์ค ๋ณ๊ฑฐ ์๋ ๊ฑฐ๋ผ ๊ทธ๋ฅ ๊ฐ๋จํ๊ฒ๋ง ์ ๋ฆฌํ ์์ ์ด๋ค. ๐ฑ ๋ฌธ์ ์ํฉ๋ฆฌํฉํฐ๋ง์ ์งํํ๊ณ ์ ํ ๋๋ฉ์ธ์ ์ฐ๋ฆฌ ํ์์ ๋งค์ฐ ์ค์ํ ๋น์ฆ๋์ค ๋๋ฉ์ธ ๊ฐ์ฒด ์ค ํ๋์๊ณ , ์ด๋ฏธ ์์ ์ ์ผ๋ก ์ ์ด์๋๊ณ ์์ง๋ง ๊ต์ฅํ ์๋ ๋ถํฐ ๋ ๊ฑฐ์๋ก ๋ด๋ ค์ค๊ณ ์๋ ๊ฐ์ฒด์๊ธฐ ๋๋ฌธ์ ์ ๊ท ์ ์ฌ์๊ฐ ๋ณด๊ธฐ์ ์ข์ ์ฝ๋๊ฐ ์๋๋ผ๋ ์๊ฐ์ด ๋ค์๋ค. ์ฌ๋ด ๋๋ฉ์ธ์ธ ๋งํผ ๊ทธ๋๋ก ๊ฐ์ ธ์ฌ ์๋ ์์ง๋ง, ๋น์ทํ ๋๋์ผ๋ก ์๋์ ๊ฐ์ด ์ธํ ์ ์งํํด๋ณด์๋ค.CREAT..
๐ฑ ๋ค์ด๊ฐ๊ธฐ ์ ์ง๋ ํฌ์คํ ์์๋ ๋ ๋์ค๋ฅผ ํ์ฉํด ๋ถ์ฐ๋ฝ์ ๊ตฌํํ๋ ๋ค์ํ ๋ฐฉ๋ฒ๋ค์ ์ดํด๋ณด์๋ค. ์ด๋ฒ ํฌ์คํ ์์๋ ์กฐ๊ธ ๋ ์๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ๋ ๋์ค๋ฅผ ํ์ฉํ์ฌ ๋ถ์ฐ๋ฝ์ ๊ตฌํํด๋ณด๊ณ ์ ํ๋ค. โ Case 4 - Lua Script ํ์ฉํ๊ธฐ Redis 2.6 ๋ฒ์ ์์ ๋ฃจ์ ์คํฌ๋ฆฝํธ ์์ง์ด ์ถ๊ฐ๋๋ฉด์, ๋ ๋์ค ์๋ฒ์์ ๋ฃจ์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์๊ฒ ๋์๋ค. ๋ ๋์ค ๋ด๋ถ์์๋ EVAL (ํน์ EVALSHA)์ด๋ผ๋ ๋ช ๋ น์ด๋ฅผ ํตํด ์ฌ์ฉํ ์ ์๋ค. EVAL script numkeys [key [key ...]] [arg [arg ...]] ๋ง์ฝ ์คํฌ๋ฆฝํธ๊ฐ ๊ธธ์ด์ง๊ฒ ๋๋ค๋ฉด ์คํฌ๋ฆฝํธ ์ ์ฒด๋ฅผ EVAL๋ก ์ ์กํ๊ธฐ์๋ ๋คํธ์ํฌ ๋์ญ์ ๋น์ฉ์ด ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์, ๋ ๋์ค์์๋ SCRIPT LOAD ๋ช ๋ น์ด๋ฅผ ํตํด ์คํฌ๋ฆฝํธ๋ฅผ ..
๐ฑ ๋ค์ด๊ฐ๊ธฐ ์ ์กฐ๊ธ ์ค๋๋๊ธด ํ์ง๋ง ์ด์ ํฌ์คํ ์์ ๋ค์๋๋ฝ์ ํตํ ๋ถ์ฐ๋ฝ ๊ตฌํ์ ์งํํ์๋ค. ๋ง์ง๋ง ํฌ์คํ ์์ ๋ ๋์ค๋ฅผ ํ์ฉํ๋ค๊ณ ๋งํ์๋๋ฐ, ๊ณ์ ๋ฏธ๋ฃจ๋ค๊ฐ ์ด๋ฒ์ ๋ ๋์ค ๊ณต๋ถ๋ฅผ ํ๋ฉด์ ๊ฐ๋จํ๊ฒ ๊ตฌํ์ ์งํํด๋ณด์๋ค. ๋ถ์ฐ๋ฝ์ ๋ํ ๊ฐ๋ ์ ์ด์ ํฌ์คํ ์์ ๋ค๋ฃจ์๊ธฐ ๋๋ฌธ์, ๋ ๋์ค๋ฅผ ์ด์ฉํด์ ๋ฐ๋ก ๋ถ์ฐ๋ฝ์ ๊ตฌํํด๋ณด์. ๋ํ, ์ง๋ ํฌ์คํ ์์๋ Jmeter๋ฅผ ํ์ฉํ์์ง๋ง, ์ด๋ฒ ํฌ์คํ ์์๋ E2E ํ ์คํธ๋ฅผ ํตํด ์ง์ ๊ตฌํ์ ํด๋ณด๊ณ ์ ํ๋ค. ๐ฑ ๊ตฌํ ์ํฉ ์ ๋ง ๊ฐ๋จํ๊ฒ ์์ก์ ์๋ฏธํ๋ 'Balance'๋ผ๋ ๊ฐ์, 2๊ฐ์ ์์ฒญ์ด ๋์์ ๋ค์ด์์ ๋ ๋ ๋์ค๋ฅผ ํตํ ๋ถ์ฐ๋ฝ์ ๊ตฌํํ์ฌ ์ ์ดํด๋ณด์. ์์ ๊ฒฐ๊ณผ์์ ์ต์ ์ ์ํฉ์ด๋ผ๋ฉด Request 1, 2๋ฒ ๋ชจ๋ 80์ด๋ผ๋ ๊ฐ์ ๋ฐํํ์ฌ ์ ์์ ์ผ๋ก ์์ก์ด ๊ฐฑ์ ๋์ง ์์..
๐ฑ ๋ค์ด๊ฐ๊ธฐ ์ ์๋ ์ ์ผ๋ ๊ธ์ธ๋ฐ, ์์ฆ ๋ธ๋ก๊ทธ๋ฅผ ๋๋ฌด ์ ์ด ๊ฒ ๊ฐ์์ ์ค๋๋ง์ ์ฌ๋ฆฌ๋ ๊ธ ๐ถ ํผ์ ๊ณต๋ถํ ๊ฒธ ์์ฑํ ๊ธ์ด์์ด์ ๋ค์ ์ค๋ช ์ด ๋ถ์กฑํฉ๋๋ค...! ๐ฑ ์ํฐํฐ ์๊ฐ @Entity @EntityListeners(AuditingEntityListener.class) public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) @CreatedDate private LocalDateTime createdAt; @LastModifiedDate private LocalDateTime updatedAt; User ํด๋์ค๋ ์ฌ์ฉ์์ ๋ํ ์ํฐํฐ์ด๋ฉฐ, id..
๐ฑ ๋ฌธ์ ์ํฉ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ๋์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ผ์ด ๋ง์ QueryDSL์ ๋์ ํ๊ฒ ๋์๋๋ฐ, ์ด๋ฒ์ ์๋ค๋ฅธ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ๊ฒ ๋์๋ค. java.lang.NullPointerException: Cannot read field "id" because "co.kirikiri.domain.goalroom.QGoalRoomMember.goalRoomMember.goalRoom.roadmapContent.roadmap" is null NPE๋ฅผ ๋ณธ ๊ฑด ์ค๋๋ง์ด์ด์ ์กฐ๊ธ ์ฝ์ง์ ์งํํ๋ค. ๐ฑ ๋๋ฉ์ธ ๊ตฌ์กฐ ์ง๋ ํฌ์คํ ๊ณผ ๊ฐ์ ํ๋ก์ ํธ์ด๊ธฐ ๋๋ฌธ์ ๋๋ฉ์ธ ๊ตฌ์กฐ๋ ๊ฑฐ์ ๋์ผํ๋ฐ, ์ ๋ฌธ์ ์ํฉ์ ์ดํดํ๊ธฐ ์ํ ์ถ๊ฐ์ ์ธ ๋๋ฉ์ธ ์ ๋ณด๊ฐ ํ์ํ๋ค. ํ๋์ ๋ก๋๋งต ๋ณธ๋ฌธ(RoadmapContent) ์ ๋ณด์ ๋ํด์ ์ฌ๋ฌ ๊ฐ์ ..