Skip to content

[3์›” 2์ฃผ์ฐจ] java-vending machineย #1

@baekeunsun

Description

@baekeunsun

๐Ÿ“ java-vengdingmachine-precourse

์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค ํ”„๋ฆฌ์ฝ”์Šค์˜ vendingmachine์„ ํ™œ์šฉํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
๋ฏธ์…˜์†Œ๊ฐœ๋Š” ์ „๋ถ€ ๋™์ผํ•˜์ง€๋งŒ, TDD ์Šคํ„ฐ๋””๋ฅผ ์œ„ํ•ด ์•„๋ž˜์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ถ€๋ถ„ ์ž˜ ์ฝ์œผ์‹œ๊ณ  ๋ฏธ์…˜ ์ง„ํ–‰ํ•ด์ฃผ์„ธ์š”~!

๋ฏธ์…˜์„ 100% ๋‹ค ํ•ด๋‚ด์ง€ ๋ชปํ•˜์…”๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. TDD์Šคํ„ฐ๋””์ธ ๋งŒํผ TDD๋ฅผ ์ง€ํ‚ค๋ฉด์„œ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ๋ฏธ์…˜์„ ๊ตฌํ˜„ํ•ด์ฃผ์„ธ์š”!

๐Ÿ’ฌ ๋ฏธ์…˜ ์†Œ๊ฐœ

๋ธŒ๋žœ์น˜ mission#1 ์— ํ•ด๋‹น ๋ฏธ์…˜๋‚ด์šฉ์„ ์˜ฌ๋ ค๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์ž ์ž๊ธฐ์ด๋ฆ„์˜ ๋ธŒ๋žœ์น˜(mission#1-baekeunsun)๋ฅผ ํŒŒ์„œ mission#1๋ธŒ๋žœ์น˜์— PR ์˜ฌ๋ฆฌ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค
(์ด ๋ฐฉ๋ฒ•์€ ํ–ฅํ›„์— ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Œ)

  • ๋ฏธ์…˜ ์†Œ๊ฐœ

๐Ÿ“Œ ๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ

๋ฐ˜ํ™˜๋˜๋Š” ๋™์ „์ด ์ตœ์†Œํ•œ์ด ๋˜๋Š” ์žํŒ๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

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

โœ๐Ÿป ์ž…์ถœ๋ ฅ ์š”๊ตฌ์‚ฌํ•ญ

โŒจ๏ธ ์ž…๋ ฅ

  • ์ƒํ’ˆ๋ช…, ๊ฐ€๊ฒฉ, ์ˆ˜๋Ÿ‰์€ ์‰ผํ‘œ๋กœ, ๊ฐœ๋ณ„ ์ƒํ’ˆ์€ ๋Œ€๊ด„ํ˜ธ([])๋กœ ๋ฌถ์–ด ์„ธ๋ฏธ์ฝœ๋ก (;)์œผ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค.
[์ฝœ๋ผ,1500,20];[์‚ฌ์ด๋‹ค,1000,10]

๐Ÿ–ฅ ์ถœ๋ ฅ

  • ์žํŒ๊ธฐ๊ฐ€ ๋ณด์œ ํ•œ ๋™์ „
500์› - 0๊ฐœ
100์› - 4๊ฐœ
50์› - 1๊ฐœ
10์› - 0๊ฐœ
  • ์ž”๋ˆ์€ ๋ฐ˜ํ™˜๋œ ๋™์ „๋งŒ ์ถœ๋ ฅํ•œ๋‹ค.
100์› - 4๊ฐœ
50์› - 1๊ฐœ
  • ์˜ˆ์™ธ ์ƒํ™ฉ ์‹œ ์—๋Ÿฌ ๋ฌธ๊ตฌ๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. ๋‹จ, ์—๋Ÿฌ ๋ฌธ๊ตฌ๋Š” [ERROR]๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค.
[ERROR] ๊ธˆ์•ก์€ ์ˆซ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ป ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹คํ–‰ ๊ฒฐ๊ณผ ์˜ˆ์‹œ

์žํŒ๊ธฐ๊ฐ€ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.
450

์žํŒ๊ธฐ๊ฐ€ ๋ณด์œ ํ•œ ๋™์ „
500์› - 0๊ฐœ
100์› - 4๊ฐœ
50์› - 1๊ฐœ
10์› - 0๊ฐœ

์ƒํ’ˆ๋ช…๊ณผ ๊ฐ€๊ฒฉ, ์ˆ˜๋Ÿ‰์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.
[์ฝœ๋ผ,1500,20];[์‚ฌ์ด๋‹ค,1000,10]

ํˆฌ์ž… ๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.
3000

ํˆฌ์ž… ๊ธˆ์•ก: 3000์›
๊ตฌ๋งคํ•  ์ƒํ’ˆ๋ช…์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.
์ฝœ๋ผ

ํˆฌ์ž… ๊ธˆ์•ก: 1500์›
๊ตฌ๋งคํ•  ์ƒํ’ˆ๋ช…์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”.
์‚ฌ์ด๋‹ค

ํˆฌ์ž… ๊ธˆ์•ก: 500์›
์ž”๋ˆ
100์› - 4๊ฐœ
50์› - 1๊ฐœ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ์‚ฌํ•ญ - Coin

  • Coin ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•ด ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
  • ํ•„๋“œ(์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜)์ธ amount์˜ ์ ‘๊ทผ ์ œ์–ด์ž private์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.
public enum Coin {
    COIN_500(500),
    COIN_100(100),
    COIN_50(50),
    COIN_10(10);

    private final int amount;

    Coin(final int amount) {
        this.amount = amount;
    }

    // ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„
}

โ€ผ๏ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ์‚ฌํ•ญ

  • ํ”„๋กœ๊ทธ๋žจ ๊ตฌํ˜„์„ ์™„๋ฃŒํ–ˆ์„ ๋•Œ src/test/java ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ApplicationTest์— ์žˆ๋Š” ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์„ฑ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ”„๋กœ๊ทธ๋žจ์ด ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋Œ€ํ•ด ์‘๋‹ตํ•  ๋•Œ, JSON ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ์ž‘์—…์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ ๋ฐ ํ•„์š”ํ•œ ์ •๋ณด๋Š” JSON ๊ฐ์ฒด์— ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ , ๋ฐ์ดํ„ฐ์˜ ์ €์žฅ ๋ฐ ์กฐํšŒ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ” ์„ธ๋ถ€์‚ฌํ•ญ

์ถ”๊ฐ€์ ์ธ ์„ธ๋ถ€์‚ฌํ•ญ์„ ์ •์˜ํ•˜๊ณ  ์•„๋ž˜ ์„ธ๋ถ€์‚ฌํ•ญ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • JDK 17์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ž๋ฐ” ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ด๋„ ์ข‹์œผ๋‚˜ JDK 17์—์„œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ํ”„๋กœ๊ทธ๋žจ์˜ ์‹œ์ž‘์ ์€ Application.main() ์ž…๋‹ˆ๋‹ค.
  • build.gradle์— ๊ธฐ๋ณธ ์„ค์ •๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์™ธ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์ข‹์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋„์ž… ๊ณผ์ •๊ณผ ์ด์œ ๋ฅผ docs/TECH.md์— ๋ช…ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๊ณ  ์‚ฌ์šฉ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ธฐ์ˆ ๊ฒ€์ฆ๊ณผ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์—์„œ System.exit()์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ๋กœ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

Metadata

Metadata

Labels

documentationImprovements or additions to documentation

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions