๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐ•์˜ ์ •๋ฆฌ/TDD, ํด๋ฆฐ ์ฝ”๋“œ with Java

TDD, ํด๋ฆฐ ์ฝ”๋“œ with Java (๋ฏธ์…˜ 1. ์ž๋™์ฐจ ๊ฒฝ์ฃผ - ๋‹จ์œ„ ํ…Œ์ŠคํŠธ)

by ์ฃผ๋ฐœ2 2023. 4. 25.
๋ฐ˜์‘ํ˜•

4์›” ์ดˆ๋ถ€ํ„ฐ NEXTSTEP์—์„œ ์ง„ํ–‰ํ•˜๋Š” TDD, ํด๋ฆฐ ์ฝ”๋“œ with Java ๊ณผ์ •์„ ๋“ฃ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘๋…„๋ถ€ํ„ฐ ๊ณ„์† ๋“ค์–ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋‹ค๊ฐ€ ์˜ฌํ•ด ๋“ฃ๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ๋งˆ์นจ ๋น„์Šทํ•œ ์‹œ๊ธฐ์— ๋ฒˆ์•„์›ƒ์ด ์™€๋ฒ„๋ ค์„œ.. ๐Ÿ˜ญ ์ฒซ ๋ฒˆ์งธ ๋ฏธ์…˜๋„ ๊ต‰์žฅํžˆ ์˜ค๋ž˜ ๊ฑธ๋ ธ๋„ค์š”. ๐Ÿ˜ญ๐Ÿ˜ญ

 

๊ต์œก์—์„œ ์ง„ํ–‰ํ•œ ๋ฏธ์…˜๋“ค์„ ํ† ๋Œ€๋กœ ๋ฐฐ์šด ๋‚ด์šฉ ๋ฐ ํ”ผ๋“œ๋ฐฑ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

 

(ํ˜น์‹œ ๋‹ค๋ฅด๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋Š” ํฌ์ธํŠธ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด, ๋ง์”€ํ•ด ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค ๐Ÿ™)

 

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

 

 

1๋‹จ๊ณ„ - ํ•™์Šต ํ…Œ์ŠคํŠธ ์‹ค์Šต

1๋‹จ๊ณ„ ๋ฏธ์…˜์€ String, Collection(Set)์˜ ํด๋ž˜์Šค์—์„œ ํŠน์ • ํ•จ์ˆ˜์— ๋Œ€ํ•ด ๊ตฌํ˜„ํ•˜๊ณ  ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ํ•™์Šตํ•˜๋Š” ๋ฏธ์…˜์ž…๋‹ˆ๋‹ค.

 

JUnit - containsExactly()

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ 2๊ฐœ์˜ ์›์†Œ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•  ๋•Œ size๋‚˜ ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ, 

containsExactly() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ •ํ™•ํ•œ ๊ฐ’์„ ๊ฐ„๋‹จํžˆ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” ์›์†Œ์˜ ์ˆœ์„œ๋„ ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

 

 

2๋‹จ๊ณ„ - ๋ฌธ์ž์—ด ๋ง์…ˆ ๊ณ„์‚ฐ๊ธฐ

2๋‹จ๊ณ„ ๋ฏธ์…˜์€ ์‰ผํ‘œ(,) ๋˜๋Š” ์ฝœ๋ก (:)์„ ๊ตฌ๋ถ„์ž๋กœ ๊ฐ€์ง€๋Š” ๋ฌธ์ž์—ด์„ ์ž…๋ ฅ๋ฐ›๊ณ , ๊ตฌ๋ถ„์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ถ„๋ฆฌํ•œ ์ˆซ์ž์˜ ํ•ฉ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

 

๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ๋ง์ž

์œ„ ์ฝ”๋“œ์˜ 41๋ฒˆ ๋ผ์ธ์—์„œ Pattern ๊ฐ์ฒด๋Š” ๋ฌด์ƒํƒœ ๊ฐ์ฒด์˜ ์„ฑ๊ฒฉ์„ ๊ฐ€์ง€๊ธฐ์— ๋งค๋ฒˆ ์ƒˆ๋กœ์šด Pattern์„ ์ƒ์„ฑํ•  ํ•„์š”๋Š” ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

 

JUnit - @NullAndEmptySource

์œ„ ๋‘ ํ…Œ์ŠคํŠธ๋Š” ๊ฐ๊ฐ null, empty๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ์ฝ”๋“œ๋กœ @NullAndEmptySource ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๋กœ ๊ฐ™์ด ํ…Œ์ŠคํŠธ๋ฅผ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

๋ฉ”์„œ๋“œ์˜ ๋„ค์ด๋ฐ์— ๊ด€ํ•˜์—ฌ

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

  • ๋นŒ๋”: ๋ฌด์–ธ๊ฐ€๋ฅผ ๋งŒ๋“ค๊ณ  ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜
  • ์กฐ์ •์ž: ๊ฐ์ฒด๋กœ ์ถ”์ƒํ™”ํ•œ ์‹ค์„ธ๊ณ„ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋กœ ๋ฐ˜ํ™˜ ํƒ€์ž…์ด void
๋นŒ๋”(builder) ๋ฉ”์„œ๋“œ ์˜ˆ์‹œ
 - int pow(int base, int power);
 - float speed();
 - Employee employee(String name);

์กฐ์ •์ž(manipulator) ๋ฉ”์„œ๋“œ ์˜ˆ์‹œ
 - void save(String content);
 - void put(String key, int value);
 - void remove(int index);

 

3๋‹จ๊ณ„ - ์ž๋™์ฐจ ๊ฒฝ์ฃผ

3๋‹จ๊ณ„๋ถ€ํ„ฐ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์ž๋™์ฐจ ๊ฒฝ์ฃผ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฏธ์…˜์ž…๋‹ˆ๋‹ค.

์š”๊ตฌ์‚ฌํ•ญ์€ ๋Œ€๋žต์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ž๋™์ฐจ ๋Œ€์ˆ˜์™€ ์‹œ๋„ ํšŸ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ , ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ž๋™์ฐจ๋Š” ์ „์ง„ ๋ฐ ๋ฉˆ์ถœ ์ˆ˜ ์žˆ๊ณ , ์ž๋™์ฐจ์˜ ์ƒํƒœ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. (Console)

 

ํด๋ž˜์Šค ๋„ค์ด๋ฐ๊ณผ ์˜๋„

InputCar ํด๋ž˜์Šค๋ช…์ด ์˜๋„๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค๋‹ค๋Š” ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ›์•˜๋Š”๋ฐ, ์ €๋„ ์ž‘์„ฑํ•  ๋•Œ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค๋‹ค๋Š” ๋Š๋‚Œ์„ ๋ฐ›์•˜์—ˆ์Šต๋‹ˆ๋‹ค.

์กฐ๊ธˆ ๋” ๋ช…ํ™•ํ•œ ์˜๋„๋ฅผ ๊ฐ€์ง„ UserInput ๋“ฑ์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋” ์ข‹์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

 

๊ฒฝ๊ณ—๊ฐ’์— ๋Œ€ํ•œ ๊ผผ๊ผผํ•œ ํ…Œ์ŠคํŠธ

ํ…Œ์ŠคํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ, ๋ฌด์—‡์„ ์ž˜ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š”์ง€ ์•„์ง๊นŒ์ง€ ๋‹ต์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๋ฐฐ์šด ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋Š” ๊ฒฝ๊ณ—๊ฐ’์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

์ž๋™์ฐจ ๊ฒฝ์ฃผ ๋ฏธ์…˜์—์„œ๋Š” ๋žœ๋ค ๊ฐ’์ด 4 ์ด์ƒ์ด๋ฉด ์ „์ง„์„, 4 ๋ฏธ๋งŒ์ด๋ฉด ๋ฉˆ์ถฐ์žˆ๋Š” ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ ์—ฌ๊ธฐ์„œ ๊ฒฝ๊ณ—๊ฐ’์€ 4์ž…๋‹ˆ๋‹ค.

๋ณดํ†ต ๊ฒฝ๊ณ—๊ฐ’์— ๋Œ€ํ•ด ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ํ™•๋ฅ ์ด ๋†’๊ธฐ์— ๊ฒฝ๊ณ—๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

๋˜ํ•œ ์œ„ ํ…Œ์ŠคํŠธ๋Š” 4 ์ด์ƒ์ธ ๊ฒฝ์šฐ๋งŒ ํ…Œ์ŠคํŠธ๊ฐ€ ์กด์žฌํ•˜๊ธฐ์— 4 ๋ฏธ๋งŒ์ธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด์„œ๋„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋”์šฑ ๊ผผ๊ผผํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ๋  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

๋ฌด์˜๋ฏธํ•œ ๊ฐ์ฒด

์œ„ ์ฝ”๋“œ์—์„œ ๋žœ๋ค ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š” ์ฑ…์ž„์€ ThreadLocalRandom์ด ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , RandomValue๋Š” ์–ด๋– ํ•œ ์กฐ์ž‘์ด๋‚˜ ๋กœ์ง ์—†์ด ๋žœ๋ค ๊ฐ’๋งŒ ์ƒ์„ฑํ•ด์„œ ์ „๋‹ฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ThreadLocalRandom ํด๋ž˜์Šค๋ฅผ ํ•œ ๋ฒˆ ๊ฐ์‹ผ ๊ฒƒ์„ ์ œ์™ธํ•˜๋ฉด ๋”ฑํžˆ ํด๋ž˜์Šค์˜ ํ•„์š”์„ฑ์ด ๋ถˆ๋ถ„๋ช…ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

 

์ด๊ฒƒ๊ณผ๋Š” ๋ณ„๊ฐœ๋กœ ์œ„ ์ฝ”๋“œ๋Š” nextInt() ๋ฉ”์„œ๋“œ๊ฐ€ ๋žœ๋ค ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ์— ํ…Œ์ŠคํŠธํ•˜๊ธฐ๋„ ์‰ฝ์ง€ ์•Š์•„ ๋ณด์ด๋Š”๋ฐ์š”, 

์œ„ ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธ๊ฐ€ ์šฉ์ดํ•œ ์ฝ”๋“œ๋กœ์˜ ์ž‘์—…์€ ์ดํ›„ ๋‹จ๊ณ„์—์„œ ์ง„ํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ™‚

 

 

4๋‹จ๊ณ„ - ์ž๋™์ฐจ ๊ฒฝ์ฃผ(์šฐ์Šน์ž)

4๋‹จ๊ณ„ ๋ฏธ์…˜์€ 3๋‹จ๊ณ„ ๋ฏธ์…˜์—์„œ ์•„๋ž˜์˜ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์ถ”๊ฐ€๋œ ๋ฏธ์…˜์ž…๋‹ˆ๋‹ค.

  • ์ž๋™์ฐจ์— ์ด๋ฆ„์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ž๋™์ฐจ ๊ฒฝ์ฃผ ๊ฒŒ์ž„ ์™„๋ฃŒ ํ›„ ์šฐ์Šน์ž๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. (์šฐ์Šน์ž๋Š” ํ•œ ๋ช… ์ด์ƒ์ผ ์ˆ˜ ์žˆ๋‹ค.)

 

๋ชจ๋“  ์›์‹œ๊ฐ’๊ณผ ๋ฌธ์ž์—ด์„ ํฌ์žฅํ•˜๋ผ (Car - Position, Name)

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

 

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

 

public์œผ๋กœ ์ œ๊ณต๋˜๋Š” API์— ๋Œ€ํ•ด์„œ๋Š” ๊ฐ€๋Šฅํ•œ ์ „๋ถ€ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜์ž.

์œ„ Car ๊ฐ์ฒด์™€ ์—ฐ๊ด€๋˜๋Š” ๋ถ€๋ถ„์œผ๋กœ ์ž๋™์ฐจ ๊ฒฝ์ฃผ์™€ ๊ด€๋ จ๋œ ๋กœ์ง์€ ๋Œ€๋ถ€๋ถ„ Position, Name ๊ฐ์ฒด์— ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— Car ๊ฐ์ฒด์˜ ๋ฉ”์„œ๋“œ๋“ค์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋„ ํ•„์š”ํ•œ๊ฐ€?์— ๋Œ€ํ•œ ๋Œ€๋‹ต์ด public ๋ฉ”์„œ๋“œ๋Š” ๊ฐ€๋Šฅํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด๋ผ ์˜€์Šต๋‹ˆ๋‹ค. (์‚ฌ์‹ค์€ ๊ท€์ฐฎ์•„์„œ...)

 

๋‹จ์ˆœํžˆ Name, Position ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” public ๋ฉ”์„œ๋“œ๋ณด๋‹ค๋Š” winner์ธ์ง€ ํ™•์ธํ•˜๋Š” isWinner ๋ฉ”์„œ๋“œ ์ •๋„๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์„๊นŒ ์‹ถ์Šต๋‹ˆ๋‹ค.

 

ํ…Œ์ŠคํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ publicํ•˜๊ฒŒ ์ œ๊ณต๋˜๋Š” API๋Š” ๋ชจ๋‘ ์ตœ๋Œ€ํ•œ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.
publicํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ์™ธ๋ถ€์— ๊ณต๊ฐœ๋œ๋‹ค๋Š” ๊ฒƒ์€ ๊ทธ ์ดํ›„๋กœ๋Š” deprecated ์‹œํ‚ค๊ธฐ ์–ด๋ ต๊ณ  ๊ณ„์†ํ•ด์„œ ํ˜ธํ™˜์ด ๋˜์–ด์•ผ ํ•˜๊ณ  ์•ˆ์ „์„ฑ์„ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๊ธฐ๋„ ํ•˜๊ฑฐ๋“ ์š”

 

Test Fixture ์ƒ์„ฑ

ํ˜„์žฌ ๋กœ์ง์—์„œ๋Š” ์ž๋™์ฐจ์˜ ๊ธฐ๋ณธ ๊ฑฐ๋ฆฌ๋Š” 0์ด๊ณ , ์ž๋™์ฐจ๊ฐ€ ์ „์ง„ํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•œ ํ›„ ์ „์ง„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ์šฐ์Šน์ž์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด forward() ๋ฉ”์„œ๋“œ๊ฐ€ ์„ ํ–‰์ด ๋˜์–ด์•ผ ํ•˜๋Š” ์กฐ๊ฑด์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Fixture๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, Fixture๋ž€ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์œ„ ์ฝ”๋“œ์—์„  forward() ๋ฉ”์„œ๋“œ๋ฅผ Fixture๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

์œ„์—์„œ๋Š” Test Fixture๋ฅผ ์œ„ํ•ด Position์—์„œ distance๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š” ์ƒ์„ฑ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ํ”„๋Ÿฌ๋•์…˜ ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ƒ์„ฑ์ž๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•˜๋Š”๊ฒƒ์€ ๊ดœ์ฐฎ์ง€ ์•Š์„๊นŒ? ํ•˜๋Š” ์ƒ๊ฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿง

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

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

(์ž๋™์ฐจ์˜ ์ตœ์ดˆ ๊ฑฐ๋ฆฌ๋Š” 0์ธ๋ฐ, ๋ˆ„๊ตฐ๊ฐ€ ์ƒ์„ฑ์ž๋ฅผ ์ž˜๋ชป ์‚ฌ์šฉํ•˜์—ฌ ์ตœ์ดˆ ์ž๋™์ฐจ ๊ฑฐ๋ฆฌ๋ฅผ ์ž„์˜๋กœ ์ง€์ •ํ•˜๋Š” ๋“ฑ์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

 

๊ฒฐ๊ตญ ๊ฐ ์„ ํƒ์—๋Š” ์žฅ๋‹จ์ ์ด ์กด์žฌํ•˜๊ณ , ํ˜„์žฌ ์ƒํ™ฉ์— ๋” ์ ํ•ฉํ•œ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค.

 

๋ฌธ์„œํ™”์˜ ์„ธ๋ถ„ํ™”

// Before
- ์ž๋™์ฐจ์— ์ด๋ฆ„์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค. (์ด๋ฆ„์€ 5๊ธ€์ž๋ฅผ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†๋‹ค.)

// After
- ์ž๋™์ฐจ์— ์ด๋ฆ„์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  - 5๊ธ€์ž ์ด๋‚ด์˜ ์ด๋ฆ„์œผ๋กœ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ ์ •์ƒ์ ์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.
  - 5๊ธ€์ž ์ด์ƒ์˜ ์ด๋ฆ„์œผ๋กœ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ IllegalArgumentException ์˜ˆ์™ธ๋ฅผ ๋˜์ง„๋‹ค.

๊ธฐ๋Šฅ ๋ชฉ๋ก์— ๋Œ€ํ•ด ๋ฌธ์„œํ™”๋ฅผ ํ•˜๋ฉด ๋”์šฑ ๋ช…ํ™•ํ•ด์ง€๊ณ  ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์—๋„ ์—ฐ์Šต์ด ๋  ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค.

 

์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด์„ ํ†ตํ•ด ๊ฐ์ฒด ์ƒ์„ฑ์„ ๋ช…ํ™•ํ•˜๊ฒŒ, ๋‚ด์šฉ์€ ์€๋‹‰ํ•˜๊ธฐ

https://tecoble.techcourse.co.kr/post/2020-05-26-static-factory-method/

๋ชจ๋‘๊ฐ€ 0์ธ Position์„ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ๋ฐ›๋Š”๋‹ค๋ฉด ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ ํŒจํ„ด์„ ํ™œ์šฉํ•ด์„œ ํ•ด๋‹น ๋‚ด์šฉ์„ ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋กœ ์˜ฌ๋ฆฌ๊ณ  ๋‚ด์šฉ์€ ์€๋‹‰ํ•ด๋„ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

5๋‹จ๊ณ„ - ์ž๋™์ฐจ ๊ฒฝ์ฃผ(๋ฆฌํŒฉํ„ฐ๋ง)

5๋‹จ๊ณ„ ์š”๊ตฌ์‚ฌํ•ญ์€ 3~4๋‹จ๊ณ„์˜ ์ž๋™์ฐจ ๊ฒฝ์ฃผ์— ๋Œ€ํ•ด ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋ฅผ domain ํŒจํ‚ค์ง€, UI๋ฅผ view ํŒจํ‚ค์ง€ ๋“ฑ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

 

์•ž ๋‹จ๊ณ„์—์„œ ์กฐ๊ธˆ์”ฉ ๋ถ„๋ฆฌ๋ฅผ ํ•ด๋†”์„œ ๋”ฐ๋กœ ๋งŽ์€ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์ž‘์—…์„ ํ•˜์ง€๋Š” ์•Š์•˜์Šต๋‹ˆ๋‹ค.

 

์ž๋™์ฐจ์˜ ์ „์ง„ ์กฐ๊ฑด์„ ์ œ์–ดํ•˜๋Š” ์ „๋žต ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜์ž.

๊ธฐ์กด As-Is ์ฝ”๋“œ์—์„œ๋Š” ๋žœ๋ค ๊ฐ’์ด playing() ๋ฉ”์„œ๋“œ์—์„œ ์ƒ์„ฑ๋˜์–ด ํ…Œ์ŠคํŠธ๋„ ์–ด๋ ต๊ณ , Position ๊ฐ์ฒด๊ฐ€ ์Šค์Šค๋กœ ์กฐ๊ฑด์„ ํŒ๋ณ„ํ•ด ์ „์ง„์„ ํ•˜๋Š” ์–ด์ƒ‰ํ•œ ์ƒํ™ฉ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

 

๋˜ํ•œ ํ˜„์žฌ ์š”๊ตฌ ์‚ฌํ•ญ์€ ์ „์ง„ ์กฐ๊ฑด๋งŒ ์กด์žฌํ•˜์ง€๋งŒ, ์ถ”ํ›„ ์š”๊ตฌ ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝํ•˜์—ฌ ํ›„์ง„ ์กฐ๊ฑด ๋“ฑ์ด ์ถ”๊ฐ€๋œ๋‹ค๋ฉด ๋น„์ฆˆ๋‹ˆ์Šค ๋‚ด์šฉ(์กฐ๊ฑด)์ด ์ถ”์ƒํ™”๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ์— ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

 

๋žœ๋ค ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š” ๋กœ์ง์€ ๋ถ„๋ฆฌํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ค์šด ๋ถ€๋ถ„์„ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋กœ ๊ฐœ์„ ํ•˜๊ณ , ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ถ”์ƒํ™” ํ•˜๋Š” ๋ฆฌํŒฉํ„ฐ๋ง์„ ์ง„ํ–‰ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

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

 

์ถ”๊ฐ€์ ์œผ๋กœ ForwardStrategy ์ธํ„ฐํŽ˜์ด์Šค์˜ isMovable() ๋ฉ”์„œ๋“œ์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ boolean์ด ์•„๋‹Œ intํ˜•์œผ๋กœ ์„ ์–ธํ•˜๊ณ , ๊ตฌํ˜„์ฒด์—์„œ ๋ฆฌํ„ด ๊ฐ’์„ 0์ด๋‚˜ 1๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด forward() ๋ฉ”์„œ๋“œ์—์„œ if ์กฐ๊ฑด๋ฌธ๋„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

 

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

 

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€