๐Ÿ“– ์šฐํ…Œ์ฝ” 7๊ธฐ ํ”„๋ฆฌ์ฝ”์Šค 3์ฃผ์ฐจ ํšŒ๊ณ 

ByEunwoo
woowacourse

๐Ÿ€ 3์ฃผ์ฐจ ํ›„๊ธฐ

1,2 ์ฃผ์ฐจ์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ 3์ฃผ์ฐจ์—์„œ ์ „์ฒด์ ์ธ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์— ๋Œ€ํ•ด์„œ ๊นจ๋‹ฌ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ MVC ํŒจํ„ด์˜ ์˜์กด์„ฑ ๊ทœ์น™์„ ๋” ๊นŠ์ด ์ดํ•ดํ•˜๊ณ  ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์˜€์Šต๋‹ˆ๋‹ค. Model์ด Controller์™€ View์— ์˜์กดํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๋Š” ๊ทœ์น™์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด Lotto ํด๋ž˜์Šค๋Š” ์™„์ „ํžˆ ๋…๋ฆฝ์ ์œผ๋กœ ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค. Lotto ํด๋ž˜์Šค๋Š” ์˜ค์ง ์ž์‹ ์˜ ์ƒํƒœ(๋กœ๋˜ ๋ฒˆํ˜ธ)๋งŒ์„ ๊ด€๋ฆฌํ•˜๊ณ , ์™ธ๋ถ€ ์˜์กด์„ฑ ์—†์ด ์ž์ฒด์ ์œผ๋กœ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Lotto ํด๋ž˜์Šค๋Š” ์ˆซ์ž ๋ฐฐ์—ด์„ ๋ฐ›์•„ ๊ฒ€์ฆํ•˜๊ณ  ์ €์žฅํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ์กด์žฌ๋ฅผ ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•˜๋„๋ก ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

View๊ฐ€ Model์—๋งŒ ์˜์กดํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ทœ์น™๋„ ์ค‘์š”ํ•˜๊ฒŒ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค. OutputView ํด๋ž˜์Šค๋Š” ๋‹จ์ˆœํžˆ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์—ญํ• ๋งŒ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์ง์ ‘์ ์œผ๋กœ Controller์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋กœ๋˜ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ OutputView๋Š” Controller๋กœ๋ถ€ํ„ฐ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ๋‹จ์ˆœํžˆ ์ถœ๋ ฅ๋งŒ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

2์ฃผ์ฐจ ๊ณผ์ œ์—์„œ ์‚ฌ์šฉํ•˜์˜€๋˜ MVC ํŒจํ„ด๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ, Service Layer์˜ ์ถ”๊ฐ€๋Š” ์ด๋ฒˆ ๋ฏธ์…˜์˜ ๊ฐ€์žฅ ํฐ ๊ตฌ์กฐ์  ๋ณ€ํ™”์˜€์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์— ๋Œ€ํ•œ ์ดํ•ด๋„๊ฐ€ ํฌ๊ฒŒ ์„ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. 2์ฃผ์ฐจ์—์„œ๋Š” Controller๊ฐ€ ๋ชจ๋“  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ–ˆ์ง€๋งŒ, ์ด๋Š” ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์— ์œ„๋ฐฐ๋˜๋ฉฐ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌํ•˜์—ฌ, ์ดํ›„ LottoService๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋กœ๋˜ ๊ฒŒ์ž„์˜ ํ•ต์‹ฌ ๋กœ์ง(๋‹น์ฒจ ํ™•์ธ, ์ˆ˜์ต๋ฅ  ๊ณ„์‚ฐ ๋“ฑ)์„ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ๋” ์ž˜ ์ค€์ˆ˜ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ๊ฐ ๋กœ์ง์„ ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ธฐ๋„ ์‰ฌ์›Œ์กŒ์Šต๋‹ˆ๋‹ค.

LottoService์—์„œ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์˜ ์‘์ง‘๋„๋ฅผ ๋†’์ด๋Š” ๋ฐ ์ฃผ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹น์ฒจ ๋ฒˆํ˜ธ ํ™•์ธ ๋กœ์ง์„ ์—ฌ๋Ÿฌ ์ž‘์€ ๋ฉ”์„œ๋“œ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ, ๊ฐ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•œ ๊ฐ€์ง€ ์ฑ…์ž„๋งŒ ๊ฐ€์ง€๋„๋ก ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ธฐ์กด์— ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ์—์„œ ์ฒ˜๋ฆฌํ•˜๋˜ ๋‹น์ฒจ ํ™•์ธ ๋กœ์ง์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. 1: ์ผ์น˜ํ•˜๋Š” ๋ฒˆํ˜ธ ๊ฐœ์ˆ˜ ํ™•์ธ, 2: ๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ํ™•์ธ, 3: ๋‹น์ฒจ ๊ธˆ์•ก ๊ณ„์‚ฐ, 4: ์ˆ˜์ต๋ฅ  ๊ณ„์‚ฐ - ์ด๋ ‡๊ฒŒ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ๊ฐ ๋กœ์ง์„ ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๋„ ๋†’์•„์กŒ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, JSDoc์„ ๋„์ž…ํ•˜์—ฌ ๊ฐ ๋ฉ”์„œ๋“œ์™€ ํด๋ž˜์Šค์˜ ๋ชฉ์ , ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฐ˜ํ™˜๊ฐ’์„ ๋ช…ํ™•ํžˆ ๋ฌธ์„œํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Service ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋“ค์€ ๋ชจ๋‘ ์ž…๋ ฅ ํƒ€์ž…๊ณผ ๋ฐ˜ํ™˜ ํƒ€์ž…, ๋ฉ”์„œ๋“œ์˜ ๋ชฉ์ ์„ JSDoc์œผ๋กœ ๋ช…์‹œํ•˜์—ฌ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ…Œ์ŠคํŠธ ์ „๋žต๋„ ํฌ๊ฒŒ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. 2์ฃผ์ฐจ์—์„œ๋Š” ์ฃผ๋กœ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์œ„์ฃผ๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค๋ฉด, ์ด๋ฒˆ์—๋Š” ๊ฐ ํด๋ž˜์Šค์™€ ๋ฉ”์„œ๋“œ๋ณ„๋กœ ์„ธ๋ถ„ํ™”๋œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ Jest์˜ test.each๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์ž…๋ ฅ ์ผ€์ด์Šค์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋กœ๋˜ ๋ฒˆํ˜ธ ๊ฒ€์ฆ ํ…Œ์ŠคํŠธ์˜ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ž˜๋ชป๋œ ์ž…๋ ฅ ์ผ€์ด์Šค(๋ฒ”์œ„ ์ดˆ๊ณผ, ์ค‘๋ณต ์ˆซ์ž, ์ž˜๋ชป๋œ ๊ฐœ์ˆ˜ ๋“ฑ)๋ฅผ ํ•œ ๋ฒˆ์— ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ์˜ ๋‹จ์ผ ์ฑ…์ž„๋„ ๋”์šฑ ์ฒ ์ €ํžˆ ์ง€ํ‚ค๋ ค ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹น์ฒจ ๊ฒฐ๊ณผ ๊ณ„์‚ฐ ๋กœ์ง์„ '๋ฒˆํ˜ธ ๋งค์นญ ํ™•์ธ', '๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ ํ™•์ธ', '๋‹น์ฒจ๊ธˆ ๊ณ„์‚ฐ' ๋“ฑ ์ž‘์€ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
2์ฃผ์ฐจ PR ๋ฆฌ๋ทฐ์—์„œ ํ”ผ๋“œ๋ฐฑ์„ ํ†ตํ•ด ๋„ค์ด๋ฐ์˜ ์ค‘์š”์„ฑ์— ๋Œ€ํ•ด์„œ ํฌ๊ฒŒ ๊นจ๋‹ฌ์€ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋„ค์ด๋ฐ๋งŒ์œผ๋กœ๋„ ๋ฉ”์†Œ๋“œ์˜ ์ „๋ฐ˜์ ์ธ ์—ญํ• ์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์—ˆ๊ณ , 3์ฃผ์ฐจ ๊ณผ์ œ์— ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ ํ’ˆ์งˆ ํ–ฅ์ƒ์„ ์œ„ํ•ด ๋ช…ํ™•ํ•œ ๋„ค์ด๋ฐ๊ณผ ์ผ๊ด€๋œ ์ฝ”๋”ฉ ์Šคํƒ€์ผ๋„ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ ์ด๋ฆ„์€ ํ•ด๋‹น ๋ฉ”์„œ๋“œ์˜ ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ํ‘œํ˜„ํ•˜๋„๋ก ์ง€์—ˆ์œผ๋ฉฐ, ๋ณ€์ˆ˜๋ช…๋„ ๊ทธ ์šฉ๋„๋ฅผ ์ฆ‰์‹œ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ผ๊ด€๋œ ๋“ค์—ฌ์“ฐ๊ธฐ์™€ ์ฃผ์„ ์Šคํƒ€์ผ์„ ์œ ์ง€ํ•˜์—ฌ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ƒ์ˆ˜๋ฅผ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•˜์—ฌ ๋งค์ง ๋„˜๋ฒ„๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋กœ๋˜ ๊ด€๋ จ ์ƒ์ˆ˜๋“ค์„ LOTTO_CONFIG ๊ฐ์ฒด๋กœ ๋ชจ์•„์„œ ๊ด€๋ฆฌํ•จ์œผ๋กœ์จ, ํ–ฅํ›„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํ•œ ๊ณณ์—์„œ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋˜๋„๋ก ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฐ€์žฅ ๋งŽ์ด ๊ณ ๋ฏผํ–ˆ๋˜ ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋Š” static ๋ฐฉ์‹๊ณผ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. InputView์˜ ์ฝ”๋“œ๋ฅผ ์งค ๋•Œ, static ๋ฐฉ์‹๊ณผ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ฐฉ์‹ ์ค‘ ๊ณ ๋ฏผ์„ ํ•˜์˜€๊ณ , ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ์งœ๊ธฐ ์œ„ํ•ด์„  ๊ฐ ํŠน์ง•์„ ์ž˜ ์•Œ์•„์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ๊ธ€๋ง์„ ํ†ตํ•˜์—ฌ ๊นŠ๊ฒŒ ๊ณต๋ถ€๋ฅผ ํ•˜์˜€๊ณ  ์‚ฌ๋žŒ๋งˆ๋‹ค ๋‹ค์–‘ํ•˜๊ฒŒ ํƒํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” InputView์˜ ๊ฒฝ์šฐ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ฐฉ๋ฒ•์„ ํƒํ•˜์˜€๋Š”๋ฐ, InputView๋ฅผ ์ธ์Šคํ„ด์Šค๋กœ ์ƒ์„ฑํ•˜๋„๋ก ์„ค๊ณ„ํ•œ ์ด์œ ๋Š”, ํ…Œ์ŠคํŠธ์™€ ํ™•์žฅ์„ฑ ์ธก๋ฉด์—์„œ ๋” ์œ ๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. static ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์ธ์Šคํ„ด์Šค๋ฅผ ๋”ฐ๋กœ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋˜์–ด ํŽธ๋ฆฌํ•˜์ง€๋งŒ, ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋Š” ์˜์กด์„ฑ ์ฃผ์ž…์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ณ , ํ…Œ์ŠคํŠธ๋‚˜ ์œ ์ง€๋ณด์ˆ˜์— ์ œ์•ฝ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด, ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์„ ์ฑ„ํƒํ•˜๋ฉด ์˜์กด์„ฑ ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•ด์ง€๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ๋” ์œ ์—ฐํ•œ ์„ค๊ณ„๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด InputView ํด๋ž˜์Šค๋Š” ํ•„์š”ํ•œ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.
๋˜ํ•œ, InputView๋ฅผ ํด๋ž˜์Šค๋กœ ์„ค๊ณ„ํ•œ ์ด์œ ๋Š” ๋‹จ์ˆœํ•œ ๊ฐ์ฒด๋กœ ๊ตฌํ˜„ํ•  ๋•Œ๋ณด๋‹ค ์บก์Аํ™”, ์ถ”์ƒํ™”, ์žฌ์‚ฌ์šฉ์„ฑ ์ธก๋ฉด์—์„œ ๋” ๋งŽ์€ ์žฅ์ ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด InputView๋Š” SOLID ์›์น™ ์ค‘ ์˜์กด์„ฑ ์—ญ์ „ ์›์น™(DIP)์„ ์ง€ํ‚ค๋ฉฐ, ํ–ฅํ›„ ๋ณ€ํ™”์—๋„ ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ–์ถ”๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ ๋ฏธ์…˜์„ ํ†ตํ•ด ๋‹จ์ˆœํžˆ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด์„œ, ์ข‹์€ ์ฝ”๋“œ๋ž€ ๋ฌด์—‡์ธ์ง€, ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋” ๋‚˜์€ ์„ค๊ณ„๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ๊นŠ์ด ๊ณ ๋ฏผํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋งค์ฃผ์ฐจ ๊ณผ์ œ๋ฅผ ํ†ตํ•ด์„œ ์ƒˆ๋กœ์šด ์ง€์‹์„ ๋ฐฐ์šฐ๊ณ  ๋งŽ์€ ๋‹ค๋ฅธ ์ฐธ๊ฐ€์ž๋ถ„๋“ค๊ณผ ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉด์„œ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฉด์—์„œ ์Šค์Šค๋กœ ๋ฐœ์ „ํ•˜๊ณ  ๋”์šฑ ํ›Œ๋ฅญํ•œ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•œ๋‹ค๋Š” ๋А๋‚Œ์„ ๋งŽ์ด ๋ฐ›์•„ ํ”„๋ฆฌ์ฝ”์Šค๋ฅผ ์ฆ๊ฒ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์™€ ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ์˜ ์ค‘์š”์„ฑ์„ ์ฒด๊ฐํ–ˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋” ๋‚˜์€ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.


3์ฃผ์ฐจ์—์„œ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์šด์ 

App์—์„œ constroller ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

class App {
  async run() {
    const lottoController = new LottoController();
    await lottoController.run();
  }
}
 
export default App;

๋ณดํ†ต controller ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ• ๋• App์—์„œ ์ƒ์„ฑ์„ ํ•œ๋‹ค.
ํ•˜์ง€๋งŒ ์™œ? ๋ผ๋Š” ์ด์œ ๋ฅผ ๋ฌป์ง€ ์•Š๊ณ  ๊ทธ์ € ์“ฐ๊ธฐ๋งŒ ํ•˜์˜€๋‹ค.

์ฐจ์ด๋Š” ์ด๋ ‡๋‹ค.

ํด๋ž˜์Šค์˜ constructor์—์„œ ํ•„์š”ํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด, ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ดˆ๊ธฐํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง„๋‹ค.

์ฆ‰, constructor์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ํด๋ž˜์Šค์˜ ์ƒํƒœ๋ฅผ ์ƒ์„ฑ ์ฆ‰์‹œ ๊ณ ์ •์‹œํ‚ค๊ณ , ์ดํ›„์—๋Š” ์žฌ์„ค์ •๋˜์ง€ ์•Š๋Š” ์ƒํƒœ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

ํ•˜์ง€๋งŒ,

run ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด,
๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์‹ค์ œ ์‚ฌ์šฉ๋˜๋Š” ์‹œ์ ์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ, ์ธ์Šคํ„ด์Šค๋ฅผ ํด๋ž˜์Šค ์ „๋ฐ˜์—์„œ ์žฌ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜, ์ดˆ๊ธฐํ™”๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜๋‹ค๋ฉด constructor์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
๋ฐ˜๋ฉด, ์ธ์Šคํ„ด์Šค๋ฅผ ๋งค๋ฒˆ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๊ณ , ์ง€์—ฐ๋œ ์ดˆ๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•  ๊ฒฝ์šฐ run ๋‚ด๋ถ€์—์„œ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ์œ ๋ฆฌํ•˜๋‹ค.


deepFreeze

export const PROMPT_MESSAGES = Object.freeze({
  INPUT: {
    PURCHACE_PRICE: '๊ตฌ์ž…๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.\n',
    WINNING_NUMBER: '\n๋‹น์ฒจ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.\n',
    BONUS_NUMBER: '\n๋ณด๋„ˆ์Šค ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.\n',
  },
  OUTPUT: {
    PURCHACE_QUANTITY: '๊ฐœ๋ฅผ ๊ตฌ๋งคํ–ˆ์Šต๋‹ˆ๋‹ค.',
    WINNING_RESULT: '๋‹น์ฒจ ํ†ต๊ณ„',
  },
});

์ด ์ฝ”๋“œ์—์„œ๋Š” INPUT ๊ณผ OUTPUT ์˜ ํ•˜์œ„๊ฐ์ฒด๋“ค์€ freeze๋ฅผ ๋ฐ›์ง€ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค.
๊ทธ๋ž˜์„œ ๊ฐ๊ฐ freeze๋ฅผ ๋˜ ํ•ด์ฃผ๋˜๊ฐ€ ์•„๋‹ˆ๋ฉด deepFreeze๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•˜์œ„ ๊ฐ์ฒด๋„ ๋ถˆ๋ณ€ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.


jsdoc

class LottoService {
  #lottos;
  #winningNumbers;
  #bonusNumber;
  /**
   * @type {object<string, number>} - 3๊ฐœ, 4๊ฐœ, 5๊ฐœ, 5๊ฐœ + ๋ณด๋„ˆ์Šค, 6๊ฐœ ์ผ์น˜ํ•˜๋Š” ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฐ์ฒด
   */
  #lottoResult;
 
  constructor(lottos, winningNumber, bonusNumber) {
    this.#lottos = lottos;
    this.#winningNumbers = winningNumber;
    this.#bonusNumber = bonusNumber;
    this.#lottoResult = { 3: 0, 4: 0, 5: 0, 5.5: 0, 6: 0 };
  }
 

์ด ์ฝ”๋“œ์—์„œ object<string, number> ๋Š” any ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค. ์ฆ‰, ์ด๋Ÿฌํ•œ jsdoc ๋ฌธ๋ฒ•์€ ๋งž์ง€๊ฐ€ ์•Š๋‹ค.

3๊ฐ€์ง€๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ

(1)

 /**
 *@type {Record<string, number>}
 */

(2)

/**
*@type {{ [key: string]: number }}
*/

(3)

/**
   * @type {{
   *   '3': number,
   *   '4': number,
   *   '5': number,
   *   '5.5': number,
   *   '6': number
   * }}
   */

์ด๋ ‡๊ฒŒ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

Posted inwoowacourse
Written byEunwoo