๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿš€ ์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค 6๊ธฐ ์ง€์› ๊ธฐ๋ก6

[ํ”„๋ฆฌ์ฝ”์Šค] ํ”„๋ฆฌ์ฝ”์Šค 4์ฃผ์ฐจ ํ›„๊ธฐ (ํฌ๋ฆฌ์Šค๋งˆ์Šค ํ”„๋กœ๋ชจ์…˜ ๐ŸŽ„) ์–ด๋Š๋ง ํ”„๋ฆฌ์ฝ”์Šค์˜ ๋งˆ์ง€๋ง‰ ๋ฏธ์…˜์ด ์ฃผ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ฝ”์ˆ˜ํƒ€ (์ฝ”์น˜์™€์˜ ์ˆ˜๋‹คํƒ€์ž„) ๋•Œ ํฌ๋น„ ๋‹˜๊ณผ ์ฝ”์น˜๋‹˜๋“ค๊ป˜์„œ ๋ง์”€ํ•ด ์ฃผ์…จ๋“ฏ์ด ์‰ฝ๊ฒŒ ํ’€๋ฆฌ์ง€๋Š” ์•Š์•˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์˜๋ฏธ๋ฅผ ๋‹ค์‹œ ์ƒ๊ฐํ•˜์ž. (ํ˜„์‹ค ์„ธ๊ณ„ ๋ฐ˜์˜ ์ฃผ์˜) ๊ทธ๋™์•ˆ ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด ์ฑ…์„ ์ฝ์œผ๋ฉฐ ๋ธ”๋กœ๊ทธ์—๋„ ๊ธฐ๋กํ–ˆ์—ˆ๋Š”๋ฐ์š”, ์ฑ…์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ๋‚˜์˜ต๋‹ˆ๋‹ค. ๊ฐ์ฒด์ง€ํ–ฅ์ด ๋‹จ์ˆœํ•œ ํ˜„์‹ค ์„ธ๊ณ„์˜ ๋ชจ๋ฐฉ์ด ์•„๋‹Œ ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” ํ˜„์‹ค ์†์—์„œ ์ˆ˜๋™์ ์ธ ์กด์žฌ๊ฐ€ ๊ฐ์ฒด์ง€ํ–ฅ ์„ธ๊ณ„์—์„œ๋Š” ๋Šฅ๋™์ ์ธ ์กด์žฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋Š” ๊ฐ์ฒด๋ฅผ ์˜์ธํ™” (anthropomorphism) ํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, ์ง„์ •ํ•œ ๊ฐ์ฒด์ง€ํ–ฅ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฃผ์˜ํ•  ์ ์€ ํ˜„์‹ค ์„ธ๊ณ„๋ฅผ ๊ทธ๋Œ€๋กœ ์˜ฎ๊ธฐ๋Š” ํ–‰์œ„๋Š” ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ €๋Š” ๋‚ ์งœ (Day)์™€ ์ฃผ๋ฌธ (Orders)๋ฅผ ๋งŒ๋“  ๋‹ค์Œ, .. 2023. 11. 17.
[ํ”„๋ฆฌ์ฝ”์Šค] ํ”„๋ฆฌ์ฝ”์Šค 3์ฃผ์ฐจ ํ›„๊ธฐ (๋กœ๋˜ ๐ŸŽฑ) ์ด๋ฒˆ์—๋Š” ์ฒ˜์Œ ํ•ด ๋ณด๋Š” ๋ฌธ์ œ์˜€์œผ๋‚˜, ๋‚˜๋ฆ„ ์ถ”์ธกํ–ˆ๋˜ (?) ๋ฌธ์ œ์˜€๋˜ ๋กœ๋˜ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. Enum์— ๋Œ€ํ•ด ๋” ๊นŠ์€ ๊ด€์ฐฐ๊ณผ ๊ณ ๋ฏผ์„ ํ•˜๊ฒŒ ๋จ 1์ฃผ ์ฐจ ๋•Œ ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”๋ฅผ ๋ณด๋ฉฐ ๊ณต์šฉ ์ƒ์ˆ˜๋Š” Enum์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๊ธ€์„ ์ผ์—ˆ๋Š”๋ฐ์š”, ์ด๋ฒˆ ๋ฏธ์…˜์—์„œ๋Š” ์•„์˜ˆ ์š”๊ตฌ์‚ฌํ•ญ์œผ๋กœ Java Enum์„ ์ ์šฉํ•˜๋Š” ๊ฒŒ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค! ๊ทธ๋ž˜์„œ ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”์—์„œ Enum์— ๋Œ€ํ•ด ๋ฏธ์ฒ˜ ์•Œ์ง€ ๋ชปํ–ˆ๋˜ ๋ถ€๋ถ„๋“ค์„ ์ฝ๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ์ž๋ฃŒ๋ฅผ ๋” ์ฐพ์•„๋ณด๊ณค ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์–ธ์ œ Enum์„ ์“ฐ๊ณ  ์–ธ์ œ private static final์„ ์จ์•ผ ํ• ๊นŒ? (feat. ์‘์ง‘๋„) 1์ฃผ ์ฐจ ๋•Œ ์ž‘์„ฑ๋œ ๊ธ€์„ ๋ณด๋ฉด, ๊ฐ์ฒด์— private ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ์ƒ์ˆ˜๋Š” ํ›„์ž ๋ฐฉ์‹์„ ์“ฐ๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด Enum์„ ํ†ตํ•ด ๊ด€๋ฆฌํ•˜๋„๋ก ํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค๊ณ  ํ–ˆ์—ˆ๋Š”๋ฐ์š”. ์•„์‰ฌ์šด ์ ์€ .. 2023. 11. 14.
[ํ”„๋ฆฌ์ฝ”์Šค] ํ”„๋ฆฌ์ฝ”์Šค 2์ฃผ์ฐจ ํ›„๊ธฐ (์ž๋™์ฐจ ๊ฒฝ์ฃผ ๐Ÿš—) ๋‹ค์†Œ ๋Šฆ์€ ํ”„๋ฆฌ์ฝ”์Šค 2์ฃผ ์ฐจ ํ›„๊ธฐ๋ฅผ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค! ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ ๋ฏธ์…˜์ด ๊ฝค ๊ฑธ๋ฆฌ๋Š”์ง€๋ผ ์ด์ œ์•ผ ์˜ฌ๋ฆฌ๊ฒŒ ๋๋„ค์š” ๐Ÿฅฒ ์ด๋ฒˆ ๋ฏธ์…˜์€ ํ•™๊ต ์„ ๋ฐฐ ๋ถ„๊ป˜ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์œผ๋ฉฐ ๋ฏธ๋ฆฌ ํ•ด ๋ณธ ์ž๋™์ฐจ ๊ฒฝ์ฃผ ๋ฏธ์…˜์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— 1์ฃผ ์ฐจ ๋•Œ์ฒ˜๋Ÿผ ํ•ต์‹ฌ ๋กœ์ง์€ ์‰ฝ๊ฒŒ ์ดํ•ด๋˜์—ˆ์—ˆ์Šต๋‹ˆ๋‹ค. JUnit5์— ๋Œ€ํ•ด ๊นŠ๊ฒŒ ํŒŒ๋ณด๊ฒŒ ๋จ (ParameterResolutionException) ์ด๋ฒˆ ๋ฏธ์…˜์—์„œ๋Š” ์š”๊ตฌ์‚ฌํ•ญ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด ๋ณด๋ผ๋Š” ๊ฒƒ์ด ์•„์˜ˆ ์š”๊ตฌ์‚ฌํ•ญ์— ์ •์˜๋˜์–ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค์˜ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ํ…Œ์ฝ”ํ†ก ์˜์ƒ์„ ๋ณด๋ฉฐ ์ œ๋Œ€๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ตํ˜€๋ณด๊ณ  ์‹ถ์—ˆ๊ณ , ์ด ๊ณผ์ •์—์„œ @ParameterizedTest๋ฅผ ์“ฐ๋ฉด ๊ฐ™์€ ํ…Œ์ŠคํŠธ์ด๋ฉด์„œ ๋‹ค๋ฅธ ์ž…๋ ฅ๊ฐ’์„ ๊ฒ€์ฆํ•  ๊ฒฝ์šฐ๋ฅผ ์ถ•์•ฝํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์šฐ์—ฐํžˆ @Test์™€ @ParameterizedT.. 2023. 11. 6.
[ํ”„๋ฆฌ์ฝ”์Šค] JDK16์—์„œ ์ •์‹์œผ๋กœ ๋‚˜์˜จ "๋ ˆ์ฝ”๋“œ"์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž ์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค 2์ฃผ ์ฐจ ํ”„๋ฆฌ์ฝ”์Šค ๋ฏธ์…˜์„ ํ•˜๋ฉด์„œ JDK17์˜ ํŠน์ง•์„ ์‚ด๋ฆด ์ˆ˜ ์žˆ๋Š” ๋ ˆ์ฝ”๋“œ (record)์— ๋Œ€ํ•ด ์ ‘ํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋Š๋‚€ ์ ์€, ๊ธฐ์กด์— ์ž‘์„ฑํ–ˆ๋˜ DTO๋ฅผ ์‰ฝ๊ฒŒ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด์—ˆ์Šต๋‹ˆ๋‹ค. (DTO๊ฐ€ ๋ฌด์—‡์ธ์ง€๋ฅผ ๋ณด์‹œ๋ ค๋ฉด ์ด ๊ธ€์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!)๊ธฐ์กด์˜ DTO๋จผ์ €, ๊ธฐ์กด์— ์‚ฌ์šฉํ–ˆ๋˜ DTO ์ฝ”๋“œ์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.public class CarResponse { private final String name; private final int position; private CarResponse(final String name, final int position) { this.name = name; this.position = .. 2023. 11. 5.
[ํ”„๋ฆฌ์ฝ”์Šค] @Test์—์„œ ์ธ์ž๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์™œ ParameterResolutionException์ด ๋ฐœ์ƒํ• ๊นŒ? ์„œ๋ก ์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค ํ”„๋ฆฌ์ฝ”์Šค ๋ฏธ์…˜์„ ํ•˜๋ฉด์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋˜ ๋„์ค‘, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. (์ตœ์ข… ์ฝ”๋“œ๋Š” ๊ฒ€์ฆ ๋กœ์ง์„ ๋‹ค๋ฅด๊ฒŒ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ์€ ์ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์•„์˜ˆ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)@Test@ParameterizedTest@ValueSource(strings = {"ๅด”ใฏะปู†", "?-bob"})void ํ•œ๊ธ€๊ณผ_์•ŒํŒŒ๋ฒณ_์ˆซ์ž๋ฅผ_์ œ์™ธํ•œ_๋ชจ๋“ _๋ฌธ์ž๋Š”_์•ˆ๋œ๋‹ค(final String value) { // given & when Throwable exception = Assertions.assertThrows(IllegalArgumentException.class, () -> { Name name = Name.from(value); }); // then .. 2023. 11. 5.
[ํ”„๋ฆฌ์ฝ”์Šค] ํ”„๋ฆฌ์ฝ”์Šค 1์ฃผ์ฐจ ํ›„๊ธฐ (์ˆซ์ž ์•ผ๊ตฌ โšพ๏ธ) ํ•ฉ๊ฒฉ๋„ ๋˜์ง€ ์•Š์•˜์œผ๋ฉด์„œ ์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค 6๊ธฐ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒŒ ์กฐ๊ธˆ ์›ƒ๊ธฐ์ง€๋งŒ.. ํ”„๋ฆฌ์ฝ”์Šค๋ฅผ ํ•˜๋ฉด์„œ ์–ด๋–ค ๊ฒƒ๋“ค์„ ๋ฐฐ์› ๊ณ  ๊ณ ๋ฏผํ–ˆ์—ˆ๋Š”์ง€ ๋‚จ๊ธฐ๊ธฐ ์œ„ํ•ด ๋ธ”๋กœ๊ทธ์— ์ ์–ด๋ด…๋‹ˆ๋‹ค. ์‚ฌ์‹ค 1์ฃผ์ฐจ๋Š” ์ด๋ฏธ ๋ฒจ๋กœ๊ทธ์— ์ž‘์„ฑํ–ˆ์–ด์„œ, ๊ทธ๋Œ€๋กœ ๋ณต๋ถ™์ด ๋  ๊ฒƒ ๊ฐ™๋„ค์š”. ํด๋ฆฐ ์ฝ”๋“œ ์ฑ… ๋‚ด์šฉ๋งŒ์ด ๋ฌด์กฐ๊ฑด ์ •๋‹ต์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ๋ง์ž. ์ฝ”๋“œ๋ฅผ ๊ทธ๋ ‡๊ฒŒ ์™„๋ฒฝํžˆ ์ž‘์„ฑํ•˜์ง€ ๋ชปํ•˜๊ธฐ๋„ ํ•ด์„œ ๊ณผ๊ฐํ•œ ๋ง์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํด๋ฆฐ ์ฝ”๋“œ์—์„œ๋„ ์ด์™€ ๋น„์Šทํ•œ ๋‚ด์šฉ์ด ์ž‘์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋„ ์ด ์ฑ…์—์„œ ์ฃผ์žฅํ•˜๋Š” ๊ธฐ๋ฒ• ๋‹ค์ˆ˜๋Š” ๋…ผ์Ÿ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„๋„ ๋ชจ๋“  ๊ธฐ๋ฒ•์— ๋™์˜ํ•˜์ง€ ์•Š์œผ๋ฆฌ๋ผ. ์–ด๋–ค ๊ธฐ๋ฒ•์€ ๊ฒฉ๋ ฌํžˆ ๋ฐ˜๋Œ€ํ•˜๋ฆฌ๋ผ. ๊ทธ๋ž˜๋„ ๊ดœ์ฐฎ๋‹ค. ์šฐ๋ฆฌ ์ƒ๊ฐ์ด ๋ฌด์กฐ๊ฑด ์˜ณ๋‹ค๊ณ  ์ฃผ์žฅํ•  ์˜๋„๋Š” ์—†์œผ๋‹ˆ๊นŒ. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ํ•œํŽธ์œผ๋กœ ์ด ์ฑ…์€ ์šฐ๋ฆฌ๊ฐ€ ์˜ค๋žซ๋™์•ˆ ๊ณ ๋ฏผํ•˜๊ณ  ์ˆ™๊ณ ํ•œ ๊ตํ›ˆ๊ณผ ๊ธฐ๋ฒ•์„ ๊ถŒ๊ณ ํ•œ๋‹ค... 2023. 10. 31.