๋ฐ์ํ IT Blog404 TDD, ํด๋ฆฐ ์ฝ๋ with Java (๋ฏธ์ 3, 4 - FP, OOP, ๋ฆฌํฉํฐ๋ง) ์ธ ๋ฒ์งธ ๋ฏธ์ ์ธ ์ฌ๋ค๋ฆฌ ํ๊ธฐ๋ ์๋ฐ 8์ ์คํธ๋ฆผ, ๋๋ค๋ฅผ ์ฌ์ฉํด ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํ์ฉํ๋ ๊ฒ์ด ์ฃผ๋ ๋ชฉํ์ ๋๋ค. ๋ค ๋ฒ์งธ ๋ฏธ์ ์ธ ์๊ฐ์ ์ฒญ์ ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ๋ฆฌํฉํฐ๋ง ํ๋ ๊ฒ์ด ์ฃผ๋ ๋ชฉํ์ ๋๋ค. ์ธ ๋ฒ์งธ ๋ฏธ์ ์ธ ์ฌ๋ค๋ฆฌ ํ๊ธฐ์์ ๊ฒฝํํด์ผ ํ ๋ชฉํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์๋ฐ 8์ ์คํธ๋ฆผ, ๋๋ค๋ฅผ ํ์ฉํ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ In -> Out, Out -> In ๋ฐฉ์์ผ๋ก ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ์ค๊ณํ๋ ๊ฒฝํ ์ฑ ์ ์ฃผ๋ ์ค๊ณ ๊ธฐ๋ฐ ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ ํ๋ก๊ทธ๋๋ฐ ๋ค ๋ฒ์งธ ๋ฏธ์ ์ธ ์๊ฐ์ ์ฒญ์์ ๊ฒฝํํด์ผ ํ ๋ชฉํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ๋ฆฌํฉํฐ๋ง ํ ๋ ํ ์คํธ ์ฝ๋๋ฅผ ํตํด ๋ณดํธํ๋ ๊ฒฝํ Q&A ์๋น์ค์ ์ง๋ฌธ ์ญ์ ํ๊ธฐ ๊ธฐ๋ฅ์ ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ๋ฆฌํฉํฐ๋งํ๋ ๊ฒฝํ DB ํ ์ด๋ธ๋ณด๋ค ๋๋ฉ์ธ ๋ชจ๋ธ์ TDD ๊ธฐ๋ฐ์ผ๋ก ๋จผ์ ๊ฐ๋ฐํด ๋ณด๋ ๊ฒฝํ.. 2023. 8. 7. TDD, ํด๋ฆฐ ์ฝ๋ with Java (๋ฏธ์ 2. ๋ก๋ - TDD) ์ง๋๋ฒ ๋ฏธ์ 1. ์๋์ฐจ ๊ฒฝ์ฃผ - ๋จ์ ํ ์คํธ๋ฅผ ์งํํ๊ณ , ์ด์ด์ ๋ฏธ์ 2. ๋ก๋๋ฅผ ์งํํ์ต๋๋ค. ๋ฏธ์ 1๋ณด๋ค๋ ๋น ๋ฅด๊ฒ ์งํํ์ง๋ง, ๋ชจ๋ ๋ฏธ์ ์ ๋๋ด๊ธฐ ์ํด์๋ ์กฐ๊ธ ๋ ์๋๋ฅผ ๋ด์ผ๊ฒ ๋ค์... ๐ญ 1๋จ๊ณ - ๋ฌธ์์ด ์ค์ต 1๋จ๊ณ๋ ๊ฐ๋จํ ๋ฌธ์์ด ์ฌ์น ์ฐ์ฐ ๊ณ์ฐ๊ธฐ๋ฅผ ๊ตฌํํ๋ ๋ฏธ์ ์ ๋๋ค. ์๋ฅผ ๋ค์ด 2 + 3 * 4 / 2์ ๊ฐ์ ๋ฌธ์์ด์ ์ ๋ ฅํ ๊ฒฝ์ฐ 2 + 3 * 4 / 2 ์คํ ๊ฒฐ๊ณผ์ธ 10์ ์ถ๋ ฅํด์ผ ํฉ๋๋ค. ํ์ผ ๋์๋ ๊ฐํ์ ์ถ๊ฐํ์ ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ๋ณด๋ฉด ๊ฐํ์ ํ๋์ ํ์ ์ ์ํ๋ ํ์ค์ผ๋ก ๊ฐํ์ด ์๋ค๋ฉด ๋๋์ง ์์ ํ์ผ๋ก ๊ฐ์ฃผํ๊ธฐ ๋๋ฌธ์ ํ์ผ์ ๋์๋ ๊ฐํ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข๋ค๊ณ ํฉ๋๋ค. https://velog.io/@doondoony/posix-eol ๊ทธ๋์ ํ์ผ ๋์ ๊ฐํ์ ์ถ๊ฐํ๋ ๊ฒ.. 2023. 5. 13. TDD, ํด๋ฆฐ ์ฝ๋ with Java (๋ฏธ์ 1. ์๋์ฐจ ๊ฒฝ์ฃผ - ๋จ์ ํ ์คํธ) 4์ ์ด๋ถํฐ NEXTSTEP์์ ์งํํ๋ TDD, ํด๋ฆฐ ์ฝ๋ with Java ๊ณผ์ ์ ๋ฃ๊ณ ์์ต๋๋ค. ์๋ ๋ถํฐ ๊ณ์ ๋ค์ด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ๋ค๊ฐ ์ฌํด ๋ฃ๊ฒ ๋์๋๋ฐ, ๋ง์นจ ๋น์ทํ ์๊ธฐ์ ๋ฒ์์์ด ์๋ฒ๋ ค์.. ๐ญ ์ฒซ ๋ฒ์งธ ๋ฏธ์ ๋ ๊ต์ฅํ ์ค๋ ๊ฑธ๋ ธ๋ค์. ๐ญ๐ญ ๊ต์ก์์ ์งํํ ๋ฏธ์ ๋ค์ ํ ๋๋ก ๋ฐฐ์ด ๋ด์ฉ ๋ฐ ํผ๋๋ฐฑ์ ๋ํด ์ ๋ฆฌํด ๋ณด๊ณ ์ ํฉ๋๋ค. (ํน์ ๋ค๋ฅด๊ฒ ์๊ฐํ์๋ ํฌ์ธํธ๊ฐ ์กด์ฌํ๋ค๋ฉด, ๋ง์ํด ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค ๐) ์ฒซ ๋ฒ์งธ ๋ฏธ์ ์ธ ์๋์ฐจ ๊ฒฝ์ฃผ - ๋จ์ ํ ์คํธ์๋ ์ด 5๊ฐ์ ๋ฏธ์ ์ด ์กด์ฌํ๊ณ , ๊ฐ ๋ฏธ์ ๋ง๋ค ์ฝ๋๋ฅผ ์์ฑํ์ฌ PR์ ๋ณด๋ด๋ฉด ๋ฆฌ๋ทฐ์ด๊ฐ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ํด์ฃผ๋ ์์ผ๋ก ์งํ์ด ๋๋๋ฐ์, ์๋์ฐจ ๊ฒฝ์ฃผ ๋ฏธ์ ์ ์ํํ๋ฉฐ ๋ฐ์๋ ๋ฆฌ๋ทฐ ๋ฐ ์๋ก ์๊ฒ ๋ ๋ด์ฉ๋ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. 1๋จ๊ณ - ํ์ต ํ ์คํธ ์ค์ต 1๋จ๊ณ ๋ฏธ.. 2023. 4. 25. Java Map - compute(), computeIfAbsent(), computeIfPresent() Map ์ธํฐํ์ด์ค์์ Java 8 ๋ฒ์ ์ ์ถ๊ฐ๋ ์ผ๋ถ API์ ๋ํด ์ดํด๋ด ๋๋ค. putIfAbsent() compute() computeIfPresent() computeIfAbsent() getOrDefault() ํด๋น ์ฝ๋๋ Map ์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด์ธ HashMap์ ๊ธฐ์ค์ผ๋ก ์ ๋ฆฌํ์์ต๋๋ค. 1. putIfAbsent(K key, V value) putIfAbsent() ๋ฉ์๋๋ ๋ค์ด๋ฐ์์ ์ ์ถํ ์ ์๋ฏ์ด, ๋ค์๊ณผ ๊ฐ์ด ๋์ํฉ๋๋ค. Key๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ: Value ๋ณ๊ฒฝ ์์ด ๊ธฐ์กด์ ์กด์ฌํ๋ Key์ Value๋ฅผ ๋ฆฌํดํฉ๋๋ค. Key๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ: Key์ ํด๋นํ๋ Value๋ฅผ ์ ์ฅํ ํ null์ ๋ฆฌํดํฉ๋๋ค. Map์ ๊ตฌํ์ฒด์ธ HashMap์ ๋ณด๋ฉด putVal() ๋ฉ์๋๋ฅผ ํตํด ์งํ๋๊ณ ,.. 2023. 3. 13. Spring Batch (12) Retry ๐ Spring Batch Retry (Tasklet ๊ธฐ๋ฐ) ์์ ์ฝ๋๋ ๊นํ๋ธ์์ ํ์ธํ ์ ์์ต๋๋ค :) ์๋น์ค์์ ์ฌ์๋๊ฐ ํ์ํ ๊ฒฝ์ฐ๋ ์ธ์ ์ผ๊น์? ๋น์ฆ๋์ค ๋ก์ง ์ค๋ฅ์ ๊ฐ์ ๋ด๊ฐ ์์ฑํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํด ๋ฐ์ํ ์๋ฌ๋ ์ฌ์๋๋ฅผ ํ๋๋ผ๋ ๋์ผํ๊ฒ ์คํจํ ๊ฒฝ์ฐ๊ฐ ํฝ๋๋ค. ํ์ง๋ง ๋คํธ์ํฌ์ ๊ฐ์ ์ผ์์ ์ผ๋ก ๋ฐ์ํ ์ ์๋ ์ฅ์ ์ํฉ์์๋ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ํ์ ์ผ๋ก๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค I/O์์ ํ์์์, API ํธ์ถ ์ ๋ฐ์ํ๋ ํ์์์ ๋ฑ์ด ์๊ฒ ๋ค์. ์ต๊ทผ ์ฌ๋ด์์ ์ธ๋ถ API๋ฅผ ํธ์ถํ๋ ๊ณผ์ ์์ ๊ฐํ์ ์ผ๋ก ์๋์ ๊ฐ์ ์์ธ๊ฐ ๋ฐ์ํ์ต๋๋ค. reactor.core.Exceptions$ReactiveException: io.netty.channel.unix.Errors$NativeIoExc.. 2023. 3. 4. ์ข์์ ๊ธฐ๋ฅ์ ํตํด ์ดํด๋ณด๋ ๋์์ฑ ์ด์ (synchronized) ์๋ ํ์ธ์, ์ด๋ฒ ํฌ์คํ ์์๋ ๋์์ฑ(Concurrency)์ ๋ํด ์ดํด๋ณด๊ฒ ์ต๋๋ค. (์์ ์ฝ๋๋ ๊นํ๋ธ์์ ํ์ธํ์ค ์ ์์ต๋๋ค.) ๋์์ฑ(Concurrency) ๊ฐ๋ ๋ค์ด๋ฒ ์ฌ์ ์ ๊ฒ์ํด๋ณธ ๋์์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ด๋ค ๋ ์ฌ๊ฑด์ด ๊ฐ์ ์๊ฐ์ ์ผ์ด๋๋ ๊ฒ์ ์ด๋ฅด๋ ๋ง ๋๋ถ๋ถ์ ์น ์๋ฒ๋ ์ฌ๋ฌ ๊ฐ์ ์์ฒญ(ํด๋ผ์ด์ธํธ)์ ๋์์ ์ํํ ์ ์๊ณ , ์ด๋ ์์ฑํ ์ฝ๋๊ฐ ๋์์ ์ํ๋ ์ ์๋ค๋ ์๋ฏธ์ ๋์ผํ ๋งฅ๋ฝ์ ๋๋ค. ์ด๋ฌํ ๋์์ฑ ๋ฌธ์ ๋ฅผ ์ดํด๋ณด๊ธฐ ์ํด ๊ฒ์๊ธ์์ ํด๋ผ์ด์ธํธ๊ฐ ๋์์ ์ข์์๋ฅผ ํ์ ๋ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ ๋ํด ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ ๊ทธ๋ฆผ์ ๋ํ ์ค๋ช ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. User A๊ฐ ๊ฒ์๊ธ 1์ ์ข์์๋ฅผ ํด๋ฆญํ์ ๋ likeCount ์กฐํ (likeCount = 0) User B๋ ๊ฒ์๊ธ .. 2023. 2. 26. Spring ๋ถ์ฐ ํ๊ฒฝ์์ ์ธ์ ๊ด๋ฆฌํ๊ธฐ (Redis Session Clustering) ๐ Spring ๋ถ์ฐ ํ๊ฒฝ์์ ์ธ์ ๊ด๋ฆฌํ๊ธฐ(์ธ์ ํด๋ฌ์คํฐ๋ง) ์๋ ํ์ธ์, ์ด๋ฒ ํฌ์คํ ์์๋ ์ฌ๋ฌ ์๋ฒ ํ๊ฒฝ์์ ์ธ์ ์ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ดํด๋ณด๊ฒ ์ต๋๋ค. (์ฝ๋๋ ๊นํ๋ธ์์ ํ์ธํ์ค ์ ์์ต๋๋ค.) ๋จ์ผ ์๋ฒ์์ ์ธ์ ์ ๊ด๋ฆฌํ๋ค๋ฉด ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์๊ฒ ์ง๋ง, ๋ณดํต ์ค์ผ์ผ ์์ ๋ฑ์ ํตํด ๋ถ์ฐ๋ ์๋ฒ ํ๊ฒฝ์์ ์ธ์ ์ ๊ด๋ฆฌํ ๋(๋ก๊ทธ์ธ ์ ์ ์ ์ธ์ ์ ๋ณด) ์ธ์ ๋ถ์ผ์น ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์์๋ก ์ดํด๋ณผ๊น์? ์ฌ์ฉ์ A๊ฐ localhost:8080ํฌํธ๋ก login ํธ์ถ ์ ์ธ์ ์ด ์์ฑ๋๊ณ JSESSIONID์ ์์์ ๊ฐ์ ์ค์ ํฉ๋๋ค. JSESSIONID? - ์ธ์ ์ ์ ์งํ๊ธฐ ์ํด Tomcat Container์์ ๋ฐ๊ธํ๋ Key์ด๊ณ Value๋ฅผ ํตํด ์ธ์ ์ ์ ์งํ ์ ์์ต๋๋ค. ๋์ ๋ฐฉ์? 1. ๋ธ๋ผ์ฐ.. 2023. 2. 12. Spring DispatcherServlet(๋์คํจ์ฒ์๋ธ๋ฆฟ) ๊ฐ๋ ๋ถํฐ ๋์ ๊ณผ์ ๊น์ง ๐ DispatcherServlet ์๋ ํ์ธ์, ์ด๋ฒ ํฌ์คํ ์์๋ Spring์์ HTTP ์์ฒญ ๋ฐ ์๋ต๊ณผ ๊ด๋ จํ์ฌ ๊ฐ์ฅ ํต์ฌ ๊ธฐ์ ์ธ DispatcherServlet์ ๋ํด ์ดํด๋ณด๊ณ ์ ํฉ๋๋ค. ํ์์ ๊ฐ๋ ์ ๋ํด์๋ ์ด๋ ์ ๋ ์๊ณ ์์์ง๋ง ์ด๋ ํ ๊ณผ์ ์ ํตํด ๋์คํจ์ฒ ์๋ธ๋ฆฟ์ด ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ๊ณ , ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ ์ ๋ณด๋ฅผ ์ฒ๋ฆฌํ๊ณ ์๋ต์ ๋ฐํํ๋์ง ๋ด๋ถ ๋์์ ์ ๋ชฐ๋์๋๋ฐ์, ์ด๋ฒ ๊ธฐํ์ ์ ๋ฆฌํด ๋ณด์์ต๋๋ค. (ํ๋ฆฐ ๋ด์ฉ์ด ์กด์ฌํ ์ ์์ผ๋ ๋ง์ํด ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. ๐) | DispatcherServlet ๊ฐ๋ ํ๋ก ํธ ์ปจํธ๋กค๋ฌ(Front Controller)๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ DispatcherServlet์ HTTP ํ๋กํ ์ฝ๋ก ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ ๋จผ์ ๋ฐ์์ ์ ํฉํ ์ปจํธ๋กค๋ฌ์ ์์(Delega.. 2023. 2. 11. EasyRandom - Java beans๋ฅผ ๋๋ค์ผ๋ก ์์ฑํด ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๐ EasyRandom - Java beans๋ฅผ ๋๋ค ์์ฑํด ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ณดํต ํ ์คํธ๋ฅผ ์์ฑํ ๋ ๊ฐ์ฒด๋ฅผ ์์๋ก ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ์์ต๋๋ค. ๊ฐ์ฒด์ ํ๋๊ฐ 1~2๊ฐ๋ผ๋ฉด ์๊ด์๊ฒ ์ง๋ง, ์กฐ๊ธ ๋ง์์ง๋ค๋ฉด ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์๊ทผ(?) ๊ท์ฐฎ์๋ฐ์, ์ ์ฌ์ง์ฒ๋ผ ๊ฐ ํ๋์ ๋ง๋ ๊ฐ์ ํ๋์ฉ ์ค์ ํด ์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ฝค๋ ๋ฒ๊ฑฐ๋ก์ด ์์ ์ ๋๋ค. ์ด์ ๊ฐ์ ๋, ๊ฐ์ฒด์ ํ๋๋ฅผ ๋ฐ๋ก ์ค์ ํ์ง ์๊ณ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์์ฑํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ EasyRandom ์ ๋๋ค. (์ฌ์ฉ๋ฒ๋ ๊ต์ฅํ ๊ฐ๋จํ๋, ์์ธํ ๊ฑด ๊นํ๋ธ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์.) ๐ ์ฌ์ฉ๋ฒ ์์กด์ฑ ์ถ๊ฐ ํ ์คํธ์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ ์ด๋ค์ testImplementation์ผ๋ก ์ค์ ํ์ต๋๋ค. Member ํด๋์ค Post ํด๋์ค EasyRandom Cust.. 2023. 1. 27. SpringBoot Multi DataSource - JPA ๐ SpringBoot์์ ๋ฉํฐ ๋ฐ์ดํฐ์์ค ์ค์ ํ๊ธฐ - JPA ํ๋์ ํ๋ก์ ํธ์์ ์ฌ๋ฌ ๊ฐ์ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ์, ์ด๋ฐ ๊ฒฝ์ฐ DataSource๋ฅผ ์ปค์คํ ์ผ๋ก ์ค์ ํ์ฌ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ๊ฐ๋จํ ์ค์ ์ ํตํด ํ ํ๋ก์ ํธ์์ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํฉ๋๋ค. ์์ ์ฝ๋๋ GitHub์์ ํ์ธํ ์ ์์ต๋๋ค. ๐ application.yml yml ํ์ผ์ ๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค(datasource, datasource-second)๋ฅผ ์ค์ ํฉ๋๋ค. (๊ธฐ๋ณธ ์คํ๋ง ๋ถํธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ ๊ณผ ๋ฌ๋ฆฌ ๋ฉํฐ ๋ฐ์ดํฐ ์์ค HikariConfig์์๋ url์ด ์๋ jdbc-url์ผ๋ก ๋ค์ด๋ฐ์ ํด์ผํฉ๋๋ค.) ๐ DataSource Configuration ์๋ ์ฝ๋์์ ์ฌ์ฉํ ํจ.. 2023. 1. 21. ์ด์ 1 2 3 4 5 6 ยทยทยท 41 ๋ค์ ๋ฐ์ํ