[์šฐํ…Œ์ฝ”] ๐Ÿ˜€ํ”„๋ฆฌ์ฝ”์Šค 2์ฃผ์ฐจ ํšŒ๊ณ 

Frog Lemonยท2024๋…„ 10์›” 30์ผ
2

์šฐ์•„ํ•œํ…Œํฌ์ฝ”์Šค

๋ชฉ๋ก ๋ณด๊ธฐ
2/3
post-thumbnail

๐Ÿงพ์„œ๋ก 

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


pr ์ฃผ์†Œ

https://github.com/woowacourse-precourse/java-racingcar-7/pull/873


๐Ÿ“—2์ฃผ์ฐจ ๋ชฉํ‘œ ํšŒ๊ณ 

2์ฃผ์ฐจ ๊ณผ์ œ์—์„œ๋Š” ์ค‘์ ์ ์œผ๋กœ ์ €๋ฒˆ ์ฃผ์ฐจ ๊ณผ์ œ์—์„œ ์•„์‰ฌ์šด ์ ๋“ค์„ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์˜€์Šต๋‹ˆ๋‹ค!
๋ชฉํ‘œ ๋‹ฌ์„ฑ์„ ์œ„ํ•ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋„ ํ•œ ๋‹จ๊ณ„ ํ•œ ๋‹จ๊ณ„์”ฉ ์‹ ์ค‘ํžˆ ๊ฐœ์„ ์ ์„ ์ƒ๊ฐํ–ˆ๊ธฐ ๋–„๋ฌธ์— ์‹œ๊ฐ„์ด ๋”์šฑ ์˜ค๋ž˜ ๊ฑธ๋ ธ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.๐Ÿ˜ข
๋ชฉํ‘œ๋ฅผ ์ž˜ ์ด๋ค˜๋Š”์ง€? ๋ฐ‘์˜ ๊ธ€์„ ํ†ตํ•ด ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

<์ตœ์ข… ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ>
๊ณผ์ œ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ์— ์•ž์„œ ํ”„๋กœ์ ํŠธ์˜ ์ „์ฒด์ ์ธ ๊ตฌ์กฐ๋ฅผ ๋จผ์ € ๊ตฌ์„ฑํ•˜์˜€๊ณ  ์ด๋ฅผ ํ† ๋Œ€๋กœ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค๐Ÿ‘

src
โ””โ”€โ”€ main
    โ”œโ”€โ”€ java
    โ”‚   โ””โ”€โ”€ racingcar
    โ”‚       โ”œโ”€โ”€ config
    โ”‚       โ”‚   โ””โ”€โ”€ AppConfig.java
    โ”‚       โ”œโ”€โ”€ controller
    โ”‚       โ”‚   โ””โ”€โ”€ RacingGameController.java
    โ”‚       โ”œโ”€โ”€ domain
    โ”‚       โ”‚   โ”œโ”€โ”€ car
    โ”‚       โ”‚   โ”‚   โ””โ”€โ”€ Car.java
    โ”‚       โ”œโ”€โ”€ exception
    โ”‚       โ”‚   โ””โ”€โ”€ ErrorMessage.java
    โ”‚       โ”œโ”€โ”€ service
    โ”‚       โ”‚   โ”œโ”€โ”€ CarSetupService.java
    โ”‚       โ”‚   โ”œโ”€โ”€ CarSetup.java
    โ”‚       โ”‚   โ”œโ”€โ”€ RacingGameService.java
    โ”‚       โ”‚   โ””โ”€โ”€ RacingGame.java
    โ”‚       โ”œโ”€โ”€ validator
    โ”‚       โ”‚   โ””โ”€โ”€ InputValidator.java 
    โ”‚       โ””โ”€โ”€ view
    โ”‚           โ”œโ”€โ”€ InputView.java
    โ”‚           โ””โ”€โ”€ OutputView.java
    test
    โ””โ”€โ”€ java
        โ””โ”€โ”€ racingcar
            โ”œโ”€โ”€ validator
            โ”‚   โ”œโ”€โ”€ CarNameValidatorTest.java 
            โ”‚   โ””โ”€โ”€ AttemptCountValidatorTest.java 
            โ”œโ”€โ”€ service
            โ”‚   โ”œโ”€โ”€ CarSetupServiceTest.java 
            โ”‚   โ””โ”€โ”€ RacingGameServiceTest.java
            โ””โ”€โ”€ ApplicationTest

1.๊ฐ์ฒด์ง€ํ–ฅ์›์น™์— ๋”ฐ๋ฅธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ[โ—โ—โ—]

1-1 ๊ฐ์ฒด ์ƒ์„ฑ์„ ์ „๋‹ดํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ โญ•

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

<Appconfig.java>

์ด๋ ‡๊ฒŒ ๊ฐ์ฒด์˜ ์ƒ์„ฑ์„ ๋ถ„๋ฆฌํ•˜๋‹ˆ ๊ด€๋ฆฌํ•˜๊ธฐ๋„ ํŽธํ•˜๊ณ  ์ปจํŠธ๋กค๋Ÿฌ๋‚˜ ๋ฉ”์ธ์—์„œ ๋งŽ์€ ์—ญํ• ์„ ์ฃผ์ง€ ์•Š์•„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ท„๋‹ค๊ณ  ์ €๋Š” ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค!๐Ÿ‘

1-2 ์ธํ„ฐํŽ˜์ด์Šค ํ™œ์šฉํ•˜๊ธฐ โญ•

Service๋‹จ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ํด๋ž˜์Šค๋“ค์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค! ์ œ๊ฐ€ ์ด๋ฒˆ ๊ณผ์ œ์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์“ด ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” ๋ช…ํ™•ํ•œ ์„ค๊ณ„ ๊ตฌ์กฐ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š”๋ฐ ์ดˆ์ ์„ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฅผ ํ†ตํ•˜์—ฌ ๊ตฌํ˜„๋ฐ›์€ ํด๋ž˜์Šค๋“ค์ด ๋ฌด์Šจ ์—ญํ™œ์ธ์ง€ ์ง๊ด€์ ์œผ๋กœ ๋ณด์ผ ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

์˜๋ฌธ์ ๊ณผ ๊ณ ๋ฏผ๐Ÿ˜…

์ €๋Š” ์ด์ œ๊นŒ์ง€ ๊ณตํ†ต์ ์ธ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ ํด๋ž˜์Šค๋“ค์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ถ€์—ฌํ•˜์—ฌ ๋‹คํ˜•์„ฑ์„ ์ถ”๊ตฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์Šคํ„ฐ๋””๋ฅผ ํ†ตํ•ด ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•ด ๋งŽ์€ ์˜๊ฒฌ์„ ๋‚˜๋ˆ„์—ˆ๊ณ , ๊ทธ ์ค‘ ๊ธฐ์–ต์— ๋‚จ์€ ๋ง์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์—๋งŒ ์‚ฌ์šฉํ•  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๊ฒŒ ์ข‹์€ ๋ฐฉ๋ฒ•์ธ๊ฐ€?

์ด์ œ๊นŒ์ง€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์˜จ ์ €๋กœ์„œ๋Š” ์ƒ๊ฐ์ง€ ๋ชปํ•œ ๋ง์ด์˜€๊ณ , ๊ทธ ์งˆ๋ฌธ์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ–ˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์˜ ์žฅ์ ๋“ค์„ ๋‚˜์—ดํ•˜์ž๋ฉด ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด ๋ช…ํ™•ํ•œ ๋‹ต์ด ๋‚˜์˜ค์ง€๋งŒ ์ž๊ธฐ ์ž์‹ ์—๊ฒŒ "์–ด๋–ค ์˜๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‚˜?" ๋ผ๋Š” ์งˆ๋ฌธ์„ ๋˜์งˆ ์ˆ˜ ์žˆ์—ˆ๊ณ  ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๊ณต๋ถ€์™€ ์Šค์Šค๋กœ์˜ ๋ฐ˜์„ฑ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.๐Ÿ˜ค

โŒ๊ฐœ์„ ์ :

๋„ˆ๋ฌด๋‚˜๋„ ํฐ ์‹ค์ˆ˜๋ฅผ ํ•˜์˜€๊ธฐ์— ๊ฐœ์„ ์ ์— ํฌ๊ฒŒ!!!!!! ํ‘œ์‹œํ•˜์˜€์Šต๋‹ˆ๋‹ค.
์Šค์Šค๋กœ๋„ ๋งŽ์ด ๋ฐ˜์„ฑํ•˜๊ณ  ์žˆ๊ณ  ๊ธด ์‹œ๊ฐ„ ๋งŽ์€ ๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์„ ๊ฑฐ์ณค๋Š”๋ฐ๋„ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋‹ˆ, ๋ฐ˜์„ฑ !! ๋˜ ๋ฐ˜์„ฑ์ž…๋‹ˆ๋‹ค!!

๐Ÿšซ๋‚˜๋Š” MVC ํŒจํ„ด ์œ„๋ฐ˜์„ ํ•˜์˜€๋‹ค..

<RacingGameService.java>

    private final OutputView outputView;

    public RacingGameService(OutputView outputView) {
        this.outputView = outputView;
    }

    @Override
    public void raceGame(List<Car> cars, int count) {
        for (int i = 0; i < count; i++) {
            playRound(cars);
            outputView.displayCarPositions(cars);
        }
    }

์ €์˜ ์ค‘๋Œ€ํ•œ ์‹ค์ˆ˜๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ณด์ด์‹ค๊นŒ์š”?? ๋งŽ์€ ๋ถ„๋“ค์ด ๋ด๋ฒ„๋ฆฐ ์ €์˜ ์‹ค์ˆ˜๋Š”

service ๋‹จ์—์„œ view๋ฅผ ์˜์กด์„ฑ ์ฃผ์ž… ๋ฐ›์•„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿ˜ฑ๐Ÿ˜ฑ ์•„์ฐจ์ฐจ! Controller ๋‹จ์—์„œ Service์™€ View๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์—ฐ๊ฒฐํ•˜๋ ค ํ–ˆ๊ฑด๋งŒ, ์–ด๋А ์ˆœ๊ฐ„ Service์—์„œ ๋ฐ”๋กœ View๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋„˜๊ฒจ ์ฒ˜๋ฆฌํ•ด๋ฒ„๋ฆฐ ๊ฒƒ์„ ๋’ค๋Šฆ๊ฒŒ์•ผ ์•Œ์•„์ฐจ๋ฆฌ๋‹ค๋‹ˆ์š”โ€ฆ! TDD ๋ฐฉ์‹์œผ๋กœ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๊ธฐ๋Šฅ์„ ์ž‘์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ ์ผ์–ด๋‚œ ์‹ค์ˆ˜๋ผ๊ณ ๋Š” ํ•ด๋„, ์—ฌ๋Ÿฌ ์ฐจ๋ก€ ๋ฆฌํŒฉํ† ๋ง์„ ๊ฑฐ์น˜๋Š” ๋™์•ˆ์—๋„ ๋ˆˆ์น˜์ฑ„์ง€ ๋ชปํ•œ ์‚ฌ์‹ค์— ๋ถ€๋„๋Ÿฌ์›Œ ์ˆจ๊ณ  ์‹ถ์„ ์ง€๊ฒฝ์ž…๋‹ˆ๋‹ค. ๐Ÿ˜ญ

๐Ÿ’ก ์ด๋ฒˆ ์‹ค์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐฐ์šด ๊ตํ›ˆ ๐Ÿ’ก

  1. ์—ญํ• ์˜ ์ค‘์š”์„ฑ
    ์ด๋ฒˆ ๊ฒฝํ—˜์€ ๋ ˆ์ด์–ด ๊ฐ„ ์—ญํ•  ๋ถ„๋ฆฌ์˜ ์ค‘์š”์„ฑ์„ ๋‹ค์‹œ๊ธˆ ์ผ๊นจ์›Œ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. Service์—์„œ View๋กœ ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ ์ถœ๋ ฅํ•  ๊ฒฝ์šฐ, Controller๊ฐ€ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ํ๋ฆ„ ์ œ์–ด๊ฐ€ ๋ถ„์‚ฐ๋˜๋ฉฐ ์ฝ”๋“œ์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์งˆ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Œ์„ ์ด๋ฒˆ ์‹ค์ˆ˜๋ฅผ ํ†ตํ•ด ๊นŠ์ด ๊นจ๋‹ซ๊ฒŒ ๋˜์—ˆ๊ณ , ์•ž์œผ๋กœ๋Š” ๊ฐ ๋ ˆ์ด์–ด์˜ ์ฑ…์ž„๊ณผ ์—ญํ• ์„ ๋”์šฑ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ณ ๋ คํ•˜๋ฉฐ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค.

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

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



2.ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ํ™œ์šฉํ•˜๊ธฐ[โญ•]

    test
    โ””โ”€โ”€ java
        โ””โ”€โ”€ racingcar
            โ”œโ”€โ”€ validator
            โ”‚   โ”œโ”€โ”€ CarNameValidatorTest.java 
            โ”‚   โ””โ”€โ”€ AttemptCountValidatorTest.java 
            โ”œโ”€โ”€ service
            โ”‚   โ”œโ”€โ”€ CarSetupServiceTest.java 
            โ”‚   โ””โ”€โ”€ RacingGameServiceTest.java
            โ””โ”€โ”€ ApplicationTest

์ง€๋‚œ์ฃผ ๊ณผ์ œ์—์„œ๋Š” TDD(Test-Driven Development)๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ๋ฏธ์ˆ™ํ•จ์ด ์žˆ์—ˆ๋˜ ์ ์„ ๋ฐœ๊ฒฌํ–ˆ์ง€๋งŒ, ์ด๋ฒˆ ์ฃผ์ฐจ ๊ณผ์ œ๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ณ ์ž ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์˜€์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ์ฝ”๋“œ ์ž‘์„ฑ์˜ ์ดˆ๊ธฐ ๋‹จ๊ณ„๋ถ€ํ„ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์ฃผ๋„์ ์œผ๋กœ ์ž‘์„ฑํ•˜์—ฌ ์ฝ”๋“œ์˜ ํ’ˆ์งˆ์„ ๋†’์ด๊ณ , ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋งŒ๋“œ๋Š” ๋ฐ ์ง‘์ค‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์„ ๋œ ๋ถ€๋ถ„์„ ์ค‘์ ์œผ๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ์„ฑ๊ณผ๋ฅผ ์ด๋ฃจ์—ˆ์Šต๋‹ˆ๋‹ค.


1. ๐Ÿ‘๋‹จ์ผ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ํ›„ ๊ธฐ๋Šฅ ๊ตฌํ˜„

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


2. ๐Ÿ‘JUnit์˜ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ ํ™œ์šฉ

JUnit์˜ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•œ ๊ฒƒ๋„ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์˜ ์„ฑ๊ณผ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ @ParameterizedTest ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ์— ์ „๋‹ฌํ•˜๋ฉฐ ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ @MethodSource๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณตํ†ต ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ์ •๋ฆฌํ•จ์œผ๋กœ์จ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ค„์ด๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ JUnit์˜ ๊ธฐ๋Šฅ๋“ค์„ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜๋ฉฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ๋ณด๋‹ค ํšจ์œจ์ ์ด๊ณ  ๊ฐ€๋…์„ฑ ์žˆ๊ฒŒ ์ž‘์„ฑ๋˜๋Š” ์„ฑ๊ณผ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.


3. ๐Ÿ‘๋‹ค์–‘ํ•œ ์˜ˆ์™ธ ์ƒํ™ฉ์„ ๊ณ ๋ คํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

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

โŒ๊ฐœ์„ ์ 

1. ์šฐํ…Œ์ฝ”์—์„œ ์ œ๊ณตํ•œ ํ…Œ์ŠคํŠธ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ด๋ณด์ž

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


๐Ÿงพ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ชจ์Œ

<์ข‹์€ ์ >

  • ํ…Œ์ŠคํŠธ์ผ€์ด์Šค, ์˜ˆ์™ธ์ผ€์ด์Šค๋ฅผ ๋ฌธ์„œํ™” ํ•œ๊ฒƒ
  • ๊ธฐ๋Šฅ ๋ณ„๋กœ ๊ฐ์ฒด๋กœ ๋ถ„๋ฆฌ๋ฅผ ์ž˜ํ–ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— @ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ž˜ ํ™œ์šฉํ–ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค.
  • stream ์‚ฌ์šฉ์„ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€๋…์„ฑ์ด ์ข‹์•˜๋‹ค.

<๊ฐœ์„ ์ >

  • MVC ํŒจํ„ด์„ ์œ„๋ฐ˜ํ•œ๊ฒƒ
  • ์šฐํ…Œ์ฝ”์—์„œ ์ œ๊ณตํ•œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ
  • InputView์—์„œ ์ž…๋ ฅ๋งŒ ๋ฐ›์ง€๋ง๊ณ  ์ถœ๋ ฅ๊นŒ์ง€ ๋‹ด๋‹นํ•˜๋Š”๊ฒƒ ๊ณ ๋ คํ•˜๊ธฐ
  • ๋™์ผํ•œ ์ถœ๋ ฅ์„ ๋‹ด๋‹นํ•˜๋А ๊ธฐ๋Šฅ์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋งŒ๋“ค์–ด์„œ ์บก์Аํ™” ํ•˜๊ธฐ
  • ๋žœ๋ค ๊ธฐ๋Šฅ์„ ์ธํ„ฐํŽ˜์ด์Šคํ™” ํ•ด์„œ ๊ฒฐํ•ฉ๋„ ๋‚ฎ์ถ”๊ธฐ
  • ๊ฒ€์ฆ๋กœ์ง์„ ์ข€ ๋” ํ•œ๊ณณ์— ๋ชจ์•„๋ณด์ž

๐Ÿ’ก2์ฃผ์ฐจ ์†Œ๊ฐ

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

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

๐Ÿ”ป1. private ์˜ ๋ฒ”์œ„ : private ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋‚˜?

ํด๋ž˜์Šค์—์„œ ๋‚ด๋ถ€์ ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๋“ค์— ๋Œ€ํ•ด์„œ private์œผ๋กœ ์ ‘๊ทผ์ง€์ •์ž๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ๋Œ€์ค‘์ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด TDD๋ฐฉ์‹์œผ๋กœ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•œ๋‹ค๋ฉด ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋“ค์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋“ค๋„ ์ง„ํ–‰ํ•ด์•ผํ•˜๋‚˜? ๋ผ๋Š” ์˜๋ฌธ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
์˜๋ฌธ์„ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ธ€๋“ค์„ ์ฐพ์•„๋ณด์•˜๊ณ  ๊ฒฐ๋ก ์ ์œผ๋กœ ๋งํ•˜์ž๋ฉด TDD๋„ ์œ ์—ฐํ•˜๊ฒŒ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ์ €์˜ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. private ๋ฉ”์„œ๋“œ๋“ค์„ ์“ฐ๋Š” public ๋ฉ”์„œ๋“œ๋ฅผ ํ…Œ์ŠคํŠธ ํ•˜๋ฉด ์ž์—ฐ์Šค๋ ˆ ํ•˜์œ„ ๋ฉ”์„œ๋“œ๋“ค๋„ ํ…Œ์ŠคํŠธ ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€?๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์ด๋ฅผ ์ ์šฉํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”ป2. ์ธํ„ฐํŽ˜์ด์Šค์˜ ์—ญํ™œ : input,output๋„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํ•˜๋ฉด ์žฅ์ 

์ €๋Š” ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์—๋„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ ์šฉํ•  ์ƒ๊ฐ์„ ํ•˜์ง€๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์Šคํ„ฐ๋””์› ํ•œ๋ถ„์ด ์ ์šฉํ•˜์‹ ๊ฑธ ๋ณด์•˜๋Š”๋ฐ์š”, ์ฒ˜์Œ์—๋Š” ์ด๋ ‡๊ฒŒ๊นŒ์ง€ ํ•ด์•ผํ•˜๋‚˜? ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์ง€๋งŒ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ๊ทธ์— ๋”ฐ๋ฅธ ํŽธ๋ฆฌํ•จ๊ณผ ์œ ์šฉ์„ฑ์ด ๋งค์šฐ ์ปธ์Šต๋‹ˆ๋‹ค! ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๋ฉด
์ž…๋ ฅ์„ ๋ฐ›๋Š” ๊ธฐ๋Šฅ์„ ๋ช…์‹œํ•œ Input์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ๊ณ  ์ด๋ฅผ ๊ตฌํ˜„ํ•œ ๋‘๊ฐœ์˜ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

<Input ์ธํ„ฐํŽ˜์ด์Šค>

    public interface Input {
    String read(); // ์ž…๋ ฅ์„ ์ฝ๋Š” ๋ฉ”์„œ๋“œ
    } 

<ํŒŒ์ผ์ž…๋ ฅ ํด๋ž˜์Šค์™€, ์ฝ˜์†”์ž…๋ ฅ ํด๋ž˜์Šค>

//ํŒŒ์ผ ์ž…๋ ฅ ํด๋ž˜์Šค
public class FileInput implements Input {

    @Override
    public String read() {

    }
    
// ์ฝ˜์†” ์ž…๋ ฅ ํด๋ž˜์Šค
public class ConsoleInput implements Input {

    @Override
    public String read() {

    }
}

<main.java>

public class Main {
  public static void main(String[] args) {
      // Input ์ž๋ฃŒํ˜•์œผ๋กœ ConsoleInput ๊ฐ์ฒด ์ƒ์„ฑ
      Input consoleInput = new ConsoleInput(); 
      String userInput = consoleInput.read(); // ์ฝ˜์†”๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ ๋ฐ›๊ธฐ
      System.out.println("User Input: " + userInput);

      // Input ์ž๋ฃŒํ˜•์œผ๋กœ FileInput ๊ฐ์ฒด ์ƒ์„ฑ
      Input fileInput = new FileInput("input.txt");
      String fileData = fileInput.read(); // ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ์ž…๋ ฅ ๋ฐ›๊ธฐ
      System.out.println("File Input: " + fileData);
  }

๊ทธ๋ ‡๋‹ค๋ฉด main์—์„œ๋Š” ํ•„์š”์— ๋”ฐ๋ผ ์œ ์—ฐํ•˜๊ฒŒ ํด๋ž˜์Šค๋“ค์„ ๊ต์ฒดํ•˜๋ฉด์„œ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด์— ๋”ฐ๋ฅธ ์žฅ์ ์œผ๋กœ๋Š”

  • โญ•์œ ์—ฐ์„ฑ:
    Input ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ConsoleInput ๋˜๋Š” FileInput ๊ฐ์ฒด๋ฅผ ๋™์ ์œผ๋กœ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • โญ•๋‹คํ˜•์„ฑ:
    ๋™์ผํ•œ ํƒ€์ž…(Input)์„ ํ†ตํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์–ด, ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.
  • โญ•์ฝ”๋“œ ๊ฐ„๊ฒฐ์„ฑ: ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž๋ฃŒํ˜•์œผ๋กœ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ, ์ฝ”๋“œ๊ฐ€ ๋”์šฑ ๊ฐ„๊ฒฐํ•˜๊ณ  ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค.

๐Ÿ”ป3. MVC๋ฅผ ๋ฐ˜๋“œ์‹œ ์ ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€? main์—์„œ ๋ชจ๋“  ์ฒ˜๋ฆฌ๋ฅผ ๋‹คํ•˜๋ฉด ์•ˆ๋˜๋‚˜?

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

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

๐Ÿ”ป4. static ์˜ ํ•„์š”์„ฑ์€?

์ €๋Š” static ์„ ์ตœ๋Œ€ํ•œ ์ง€์–‘ํ•˜๋ผ๊ณ  ๋ฐฐ์› ๊ณ  ๊ทธ๋ ‡๊ฒŒ ์จ์™”์Šต๋‹ˆ๋‹คโ— ํ•˜์ง€๋งŒ ์ •ํ™•ํžˆ ์–ธ์ œ static์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ• ์ง€ ๊ณ ๋ฏผ์ด ๋งŽ์•˜์—ˆ๋Š”๋ฐ์š”, ์ด๋ฒˆ ๊ธฐํšŒ์— ๊ณต๋ถ€๋ฅผ ํ•˜์—ฌ ์ถ”ํ›„์— ํ˜‘์—… ํ”„๋กœ์ ํŠธ ์ง„ํ–‰์‹œ util ๊ณผ ๊ฐ™์ด ๊ณตํ†ต์ ์œผ๋กœ ์“ฐ๊ธฐ ํŽธํ•œ ํด๋ž˜์Šค์— ์ ์šฉํ•ด๋ณด๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค!.

๐Ÿ˜ค์•ž์œผ๋กœ์˜ ๋‹ค์ง

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

profile
๋…ธ๋ ฅ๊ณผ ๋ˆ๊ธฐ๋ฅผ ์ถ”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ๋ชฌ์ด ์ข‹์•„!

0๊ฐœ์˜ ๋Œ“๊ธ€