๋ถ๋ฅ ์ ์ฒด๋ณด๊ธฐ (46) ์ธ๋ค์ผํ ๋ฆฌ์คํธํ [Querydsl] Expressions.dateTemplate, timeTemplate ์ฌ์ฉ๊ธฐ Querydsl ์ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ์ ์๊ฐํ์ง ์์ต๋๋ค. Querydsl ์ ํ์ต ์ค์ ์์ฑํ ๊ธ์ด๊ธฐ ๋๋ฌธ์ ์๊ฐํ ๋ฐฉ๋ฒ์ด ์ต๊ณ ์ ๋ฐฉ๋ฒ์ด ์๋ ์ ์์์ ์๋ ค๋๋ฆฝ๋๋ค๐โ๏ธ๊ฐ๋ฐํ๊ฒฝJDK 17, Querydsl 5.0.0, Spring boot 3.xโญ์๋ก ์ฝ๋์ค์ฟผ๋ ์์ด๋น์ค๋น ํด๋ก ํ๋ก์ ํธ ์ค, ์ฌ์ฉ์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์์๊ฐ ๊ฒ์๋๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ์ ํ์ต๋๋ค.์ฌ์ฉ์๊ฐ 6/19 ~ 6/20 ๋ฅผ ์์ ๊ฒ์ ์กฐ๊ฑด์ผ๋ก ๋ฑ๋กํ๋ฉด,์๋ฒ์์๋ 6/19 ~ 6/20 ๊น์ง ์ด์ฉ ๊ฐ๋ฅ ํ ์์ ID(์์ฝ ๋์ด์์ง ์์ ์์ ID) ๋ฅผ ์ฐพ์ต๋๋ค. ์๋ฅผ ๋ค์ด,์์ ID๊ฐ 1์ธ ์์์ `6/19 PM15:00 ~ 6/20 AM11:00` ์ธ ์์ฝ์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.๋ง์ฝ, ์ฌ์ฉ์๊ฐ 6/20 ~ 6/21 ์ ์ด์ฉ๊ฐ๋ฅํ ์์๋ฅผ ์ฐพ๋๋ค๋ฉด.. [๋์์ฑ ์ ์ด] ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค๊ณผ ๋๊ด์ /๋น๊ด์ ๋ฝ์ ํ์์ฑ ๋น๊ด์ ๋ฝ๊ณผ ๋๊ด์ ๋ฝ์ ๋ํ ๊ณต๋ถ ์๋ฃ๋ ์ ์ด์ธ์๋ ์ถฉ๋ถํ๋ค๊ณ ํ๋จํ์ฌ, ํด๋น ๊ธ์์๋ ์ค๋ช ํ์ง ์์ต๋๋ค.๋ฝ์ ๋ํด ํ์ตํ๊ณ ์๋ ์ค์ด๊ธฐ ๋๋ฌธ์, ํ๋ฆฐ ๋ถ๋ถ์ด ์์ ์ ์์ต๋๋ค. ๋ฐ๊ฒฌํ์ ๋ค๋ฉด ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค. ํธ๋์ญ์ ๊ณผ ๊ฒฉ๋ฆฌ ์์ค์ ์ดํดํด์ ๋๊ด์ , ๋น๊ด์ ๋ฝ์ ์ ์ฌ์ฉํ๋์ง์ ๋ํด ์์๋ด ๋๋ค.1. ํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค(Isolation level) ์ดํดํ๊ธฐํธ๋์ญ์ ์ ๊ฒฉ๋ฆฌ ์์ค(isolation)์ด๋?๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์ง ํ๊ธฐ ์ํด ์ฌ๋ฌ ํธ๋์ญ์ ์ด ์๋ก์๊ฒ ์ํฅ์ ๋ฏธ์น ์ ์๋ ๋ฒ์๋ฅผ ์ด๋ ์ ๋๋ก ์ ํํ ์ง๋ฅผ ๋ ๋ฒจ๋ก ๋๋ ๊ฒ์ ๋๋ค.์๋ฅผ ๋ค๋ฉด, Aํธ๋์ญ์ ์์ id=1 ์ ๋ํ ๋ ์ฝ๋๋ฅผ ์กฐํ ํ ๋, Bํธ๋์ญ์ ์์ id=1 ์ ๋ํ ๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.์ด ๋, Aํธ๋์ญ์ ์ ๊ฒฐ.. ํต์ฌ ๊ธฐ๋ฅ์ ๋จผ์ ๊ตฌํํ๊ธฐ ์ํ ๊ณ ๋ฏผ๊ณผ ๋ ธ๋ ฅ ์ฐํ ์ฝ ํ๋ฆฌ์ฝ์ค๊ฐ ๋๋๊ณ , ํต์ฌ ๊ธฐ๋ฅ ๋ถํฐ ๊ตฌํํ๊ธฐ ์ํด '์ซ์ ์ผ๊ตฌ ๊ฒ์' ๋ฏธ์ ์ ๋ค์ ํ์ด๋ณด์๋ค. ํ์ง๋ง, ํต์ฌ ๊ธฐ๋ฅ๋ถํฐ ๊ตฌํ ํ๊ธฐ ์ํด, ๊ณ ๋ฏผํ๊ณ ๋ต์ ์ฐพ๋ ๊ณผ์ ์ด 2์ฃผ๊ฐ ๊ฑธ๋ ธ๋ค.์ด ๊ณผ์ ์์ ์๊ฒผ๋ ๊ถ๊ธ์ฆ๋ค์ Q&A ํ์์ผ๋ก ๋จผ์ ์๊ธฐํด๋ณด๊ฒ ๋ค! *์์๋ก ๋์ค๋ ์ฝ๋์ ์ ๋ฌธ์ ๋๋ค.โ ์๊ตฌ์ฌํญ์ ๋ง์กฑํ๊ธฐ ์ํด ๊ฒ์ฆ(validate)์ ์ด๋์ ํ ๊ฒ์ธ๊ฐ?์๊ตฌ์ฌํญ์ ๋ง์กฑํ๋ ์กฐ๊ฑด๋ค์ ์ด๋์ ๊ฒ์ฆํด์ผ ํ ๊น? ๋์ ์๊ฐ์ ๊ฐ ๊ฐ์ฒด์ ์์ฑ์์์ ๊ฒ์ฆ์ ํ๋ ๊ฒ์ด๋ค.์ด ๋, ๊ฐ์ฒด๊ฐ ์์ฑ์ด ๋๋ค๋ฉด ๊ทธ ๊ฐ์ฒด๋ ์๊ตฌ์ฌํญ์ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ๋ณด์ฅ๋ ๊ฐ์ฒด์์ ๋ปํ๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ฅผ ๋ค์ด, ์ซ์ ์ผ๊ตฌ ๊ฒ์์ "์๋ก ๋ค๋ฅธ ์ธ ์๋ฆฌ์" ๋ผ๋ ์๊ตฌ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด๋ค์ ๋ดํฌํ๊ณ ์๋ค.โ ์๋ก ๋ค๋ฅธ ์ธ ์๋ฆฌ์์ ์ซ์๋ ์ค๋ณต๋์ง .. [ํ๋ฆฌ์ฝ์ค 4์ฃผ์ฐจ] ํฌ๋ฆฌ์ค๋ง์ค ํ๋ก๋ชจ์ ํ๊ณ ๐4์ฃผ์ฐจ ๋ชฉํ 1, 2, 3์ฃผ์ฐจ์ ํ์ตํ ๋ชจ๋ ๊ฒ๋ค์ ์ฝ๋์ ๋ น์ฌ๋ด์ ์์ฌ์์ด ๋จ์ง ์๋๋ก ์ต์ ์ ๋คํ๊ธฐ! ๐4์ฃผ์ฐจ ๋ชฉํ โ ์ฝ๋์ ์ ๋ฌธ์ ๋๋ค. โ ์ด๋ ค์ธ ์๋ก ๋น๋ฌ๋ ํ ์คํธ ์ฝ๋ ์ด๋ฒ ์ฃผ์ฐจ๋ ์ ์งํค๋ฉด์ ํ ์คํธ ์ฝ๋์ ์ฅ์ ์ธ ์ฝ๋์ ๋ํ ํผ๋๋ฐฑ์ ๋นจ๋ฆฌ ๋ฐ๊ณ ์ ํ๋ค. ๊ทธ๋ ๊ฒ ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค์ ๋๋ฆฌ๊ฒ ๋์๋ค. ๋๋ค์์ผ๋ก ์์ธ๋ฅผ ํฐ๋จ๋ฆฌ๊ฑฐ๋ map ์ ์ํํ๋ ๋๋ค์์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ ์ ์์๋ ์ด๋ฉด์๋ ์ด๋ก๋ถ์ด ๋ค์ด์ฌ ๋๊น์ง ํ ์คํธ ์ฝ๋๋ฅผ ๋๋ ค๋ดค๊ธฐ ๋๋ฌธ์ด์๋ค. ํ ์คํธ ์ฝ๋๋ฅผ ์ฒ์ ํ์ตํ๋ 2์ฃผ์ฐจ์์ ์๊ฒ๋ "์ฝ๋๋ฅผ ์์ฑํ๋ฉด์ '์ด๋ป๊ฒ ํ ์คํธ๋ฅผ ํ ๊ฒ์ธ๊ฐ?' ๋ฅผ ์๋ฌธํ๊ธฐ" ๋ฅผ ์งํค๊ฒ ๋์๋ค. ๊ตฌํ ์ ์ ์ด๋ป๊ฒ ํ ์คํธ๋ฅผ ์์ฑํ ์ง ๋ฏธ๋ฆฌ ์๊ฐํ๊ฒ ๋์๊ณ , ์ด๋ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ด๋ ค์ด ๊ธฐ๋ฅ์ ๋ ์์ ๋จ์์.. [ํ๋ฆฌ์ฝ์ค 3์ฃผ์ฐจ] ๋ก๋ ๊ฒ์ ํ๊ณ ๐ 3์ฃผ์ฐจ ๋ชฉํ ์์ ์งํค๊ธฐ ๊ฐ์ฒด์งํฅ ์ฝ๋๋ฅผ ์ํด ๋ ธ๋ ฅํ๊ธฐ 1์ฃผ์ฐจ ๋ฐ 2์ฃผ์ฐจ ํผ๋๋ฐฑ๋ฐ์ํ๊ธฐ ์์ด ๊ฐ๋๋๋ก ์ฝ๋๋ฅผ ์์ฑํ์ง ๋ง๊ณ ๋ฏธ๋ฆฌ ์๊ฐํ๊ธฐ ๐ ๋ก๋ ๊ฒ์ ๊ตฌํ โ ์ฝ๋์ ์ ๋ฌธ์ ๋๋ค. โ ์ฌ์ฉ์๋ฅผ ์ํ ์ด๋ค ํ๋ก๊ทธ๋จ์ ๋ง๋ค๊ฑด์ง ์๊ฐํ๊ธฐ ์ด๋ฒ ์๊ตฌ์ฌํญ์ 1๋ฑ ๋น์ฒจ๊ธ(20์ต)๋งํผ์ ๋์ ์ฐ๋ฉด ์ผ๋งํผ์ ์์ต๋ฅ ์ด ์๊ธธ์ง ๊ถ๊ธํดํ๋ ์ฌ์ฉ์๊ฐ ์ด ๋ก๋๊ฒ์์ ๋ง์ด ์ด์ฉํ ๊ฒ์ด๋ผ ์๊ฐํ๊ณ ์ด์ ๋ง๊ฒ ์ค๊ณ์ ์์ธ์ฒ๋ฆฌ๋ฅผ ์งํํ๋ค. โ MVC ์ฌ์ฉ [ํ์ต] 3์ฃผ์ฐจ ์๊ตฌ์ฌํญ์ "๋๋ฉ์ธ ๋ก์ง์ ๋ํด ๋จ์ํ ์คํธ ํ๊ธฐ, ๋๋ฉ์ธ ๋ก์ง๊ณผ UI ๋ก์ง์ ๋ถ๋ฆฌํด๋ผ" ๊ฐ ๋์๊ธฐ ๋๋ฌธ์ ๋๋ฉ์ธ ๋ก์ง์ ๋ํด ์์๋ดค๋ค. ์ด ๊ธ์์ ์ํ ์ ๋ฌด๋ฅผ ์์๋ก ์ด๋ค ๋ก์ง์ด ๋๋ฉ์ธ์ด๊ณ , UI ์ธ์ง ์ค๋ช ํด์ค์ ๋์์ ๋ง์ด ๋ฐ์๋ค. ๋๋ฉ์ธ๋ก์ง์ ๋ํด ์ ํํ ๋ชจ.. [ํ๋ฆฌ์ฝ์ค 3์ฃผ์ฐจ] - ์ข์ ๋ค์ด๋ฐ์ ์ํ ๊ท์น โงํ์ตํ ๊ธ์ ์๋ณธ โท ๊ธฐ๋ณธ ๊ท์น โ [S-I-D] ๋ฐ๋ฅด๊ธฐ ๊ธฐ์ตํ๊ธฐ ์ฝ๊ฒ Short ์์ฐ์ค๋ฝ๊ฒ ์ฝํ๋๋ก Intuitive(์ง๊ด์ ์ผ๋ก) ๋ฌด์์ ํ๊ณ ์์ ํ๋์ง ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก Descriptive(์์ ํ๊ธฐ) โ ์ถ์ฝํ ์ด๋ฆ ํผํ๊ธฐ - onItmClk (x) - onItemClick (o) โ ์๋ฃ๊ตฌ์กฐ๋ฅผ ํฌํจํ ์ด๋ฆ ํผํ๊ธฐ - List itemList (x) - List items (o) โ ๋ฌธ๋งฅ ์ ์ค๋ณต์ด ์๋ ์ด๋ฆ ํผํ๊ธฐ class MenuItem{ handleMenuItemClick = ... (x) handleClick = ... (o) } MenuItem.handleMenuItemClick (x) MenuItem.handleClick (o) โ ์์๋ ๊ฒฐ๊ณผ ๋ฐ์ํ๋ ์ด๋ฆ ์ง๊ธฐ /* Bad *.. [ํ๋ฆฌ์ฝ์ค 2์ฃผ์ฐจ] 1์ฃผ์ฐจ ๊ณตํต ํผ๋๋ฐฑ ํ์ต โท ์ปค๋ฐ ๋ฉ์์ง๋ฅผ ์๋ฏธ ์๊ฒ ์์ฑํ๋ค. โ ์ข์ ์ปค๋ฐ ๋ฉ์์ง ์์ฑ๋ฒ : ์ด๋ป๊ฒ ํ๋์ง ๋ณด๋ค๋ ๋ฌด์์ ํ๊ณ ์ ํ๋์ง๋ฅผ ์ค๋ช ํ๊ธฐ 1. ์ ๋ชฉ๊ณผ ๋ณธ๋ฌธ์ ๋น ํ์ผ๋ก ๊ตฌ๋ถํ๊ธฐ. - ์ ๋ชฉ์ ๋ณ๊ฒฝ์ฌํญ์ ์์ฝ, ๋ณธ๋ฌธ์ ๋ณ๊ฒฝ์ฌํญ์ ์ธ๋ถ๋ด์ฉ์ ์ค๋ช 2. ์ ๋ชฉ์ 50๊ธ์ ์ด๋ด๋ก ์ ํ 3. ์ ๋ชฉ์ ์ฒซ ๊ธ์๋ ๋๋ฌธ์๋ก ์์ฑํ์ง ์๊ธฐ 4. ์ ๋ชฉ์ ๋์๋ ๋ง์นจํ, ๋๋ํ ๋ฃ์ง ์๊ธฐ 5. ์ ๋ชฉ์ ๋ช ๋ น๋ฌธ์ผ๋ก ํ๊ณ , ๊ณผ๊ฑฐํ ์ฌ์ฉํ์ง ์๊ธฐ 6. ๋ณธ๋ฌธ์ ๋ด์ฉ์ 72๊ธ์ ๋ด๋ก ์์ฑํ๊ธฐ โ ์ปค๋ฐ ์ ํ feat: ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ fix: ๋ฒ๊ทธ ์์ docs: ๋ฌธ์ ์์ style: ์ฝ๋ ์คํ์ผ ์์ - ๊ณต๋ฐฑ๊ณผ ๋ค์ฌ์ฐ๊ธฐ๋ฅผ ์ฌ์ฉํด ์ฝ๋๋ฅผ ์ ๋ฆฌ - ์ฝ๋์ ์ฃผ์์ ์์ฑ - ๋ณ์ ์ด๋ฆ์ ๋ช ํํ๊ฒ ์์ฑ refactor: ์ฝ๋ ๊ตฌ์กฐ ๊ฐ์ - ์ค๋ณต๋ ์ฝ๋๋ฅผ.. [ํ๋ฆฌ์ฝ์ค 2์ฃผ์ฐจ] ์๋์ฐจ ๊ฒฝ์ฃผ ๊ฒ์ ํ๊ณ ๐ 2์ฃผ์ฐจ ๋ชฉํ ์๊ตฌ์ฌํญ์ ์ถฉ์คํ๊ณ , 2์ฃผ์ฐจ ๋ชฉํ์ธ ํจ์ ๋ถ๋ฆฌํ๊ธฐ์ ํจ์๋ณ๋ก ํ ์คํธ ์์ฑ์ ์ต์ํด์ง๊ธฐ! 1์ฃผ์ฐจ ๊ณตํต ํผ๋๋ฐฑ ์ ์ฉํ๊ธฐ! ์ฝ๋๋ฅผ ํ ์ค ํ ์ค, ๊ณ ๋ฏผํ๋ฉฐ ํ๋ก๊ทธ๋จ์ ๊ตฌํํ๊ธฐ! ์ค๋ฅ๋ฅผ ๋ฌด์์ํ์ง ๋ง๊ณ ์ฑ์ฅ์ ๊ณผ์ ์ด๋ผ ๋ฏฟ๊ธฐ! ์ฒ์ฒํ ๊ทธ๋ฆฌ๊ณ ๊ผผ๊ผผํ ๋ฌธ์ ์ฝ๊ธฐ! ๐ ์๋์ฐจ ๊ฒฝ์ฃผ ๊ฒ์ ๊ตฌํ โ ์ฝ๋์ ์ ๋ฌธ์ ๋๋ค. โ ์ข์ ํ๋ก๊ทธ๋จ์ด๋? 2์ฃผ์ฐจ๋ ์๊ตฌ์ฌํญ ๋ง๋ค "~ํ ์ ์๋ค." ๋ก ๋๋์ ์ฐธ ์ ๋งคํ๋ค. ์ด๋ป๊ฒ ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ผํ ์ง ์ป์ ๋๋, ์๊ธฐ ์ ์๋, ๊ตฌํ ๋์ค์๋ ์ง์ง ๊ณ์ ๊ณ ๋ฏผํ๋ค. ๊ทธ ๊ณผ์ ์์ Console.readLine() ๋ด๋ถ ์์ ๋ค์ด๊ฐ ๋ณด๊ธฐ๋ ํ๊ณ , escape ๋ฌธ์๋ ์ถ๋ ฅ๊ณผ ๋ค๋ฅด๊ฒ ๊ทธ๋๋ก ์ ๋ ฅ์ด ๋๋์ง ์๊ฒ ๋๊ณ , BigDecimal์ BigInteger ์๋ฃํ์ ํจ์๋ค๋ ์ฐพ๊ณ , .. ์ด์ 1 2 3 4 5 6 ๋ค์