๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

๐ŸŒˆ Chapter 22: ๋ณต์žกํ•œ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ๋งŒ๋“ค๊ธฐ

  • ํ…Œ์ŠคํŠธ์—์„œ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑ์ž ์ธ์ž๋ฅผ ๋ชจ๋‘ ์ง์ ‘ ์ œ๊ณตํ•ด์•ผ๋งŒ ํ•œ๋‹ค.
@Test public void chargesCustomerForTotalCostOfAllOrderedItems() {
Order order = new Order(
new Customer("Sherlock Holmes",
new Address("221b Baker Street", "London",
new PostCode("MW1", "3RX"))));

order.addLine(new OrderLine("Deerstalker Hat", 1));
order.addLine(new OrderLie("Tweed Cape", 1));
}
  • ์ด ๋ชจ๋“  ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ๋Š” ํ…Œ์ŠคํŠธ ๋Œ€์ƒ์ด ๋˜๋Š” ํ–‰์œ„์— ๊ธฐ์—ฌํ•˜์ง€ ์•Š๋Š” ์ •๋ณด๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ฑ„์›Œ ๋„ฃ์–ด ํ…Œ์ŠคํŠธ๊ฐ€ ์ฝ๊ธฐ ์–ด๋ ค์›Œ์ง„๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์ƒ์„ฑ์ž ์ธ์ž๋‚˜ ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ–ˆ์„ ๋•Œ ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ๊ฐ€ ๊นจ์งˆ ๊ฒƒ์ด๋ฏ€๋กœ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ถˆ์•ˆ์ •ํ•ด์ง„๋‹ค.
  • ๊ฐ์ฒด ๋ชจ์ฒด ํŒจํ„ด์€ ์ด ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ์‹œ๋„์— ํ•ด๋‹นํ•œ๋‹ค. ๊ฐ์ฒด ๋ชจ์ฒด๋Š” ํ…Œ์ŠคํŠธ์—์„œ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์—ฌ๋Ÿฌ ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹ด๊ธด ํด๋ž˜์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  • ๊ฐ์ฒด ๋ชจ์ฒด๋Š” ์ƒˆ ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ๋ฅผ ๋ฌถ๊ณ  ๊ฑฐ๊ธฐ์— ์ด๋ฆ„์„ ๋ถ€์—ฌํ•จ์œผ๋กœ์จ ํ…Œ์ŠคํŠธ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ธ๋‹ค. ๊ทธ๋ฟ ๋งŒ์•„๋‹ˆ๋ผ ๊ฐ์ฒด ๋ชจ์ฒด์˜ ๊ธฐ๋Šฅ์€ ํ…Œ์ŠคํŠธ ์‚ฌ์ด์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์œ ์ง€ ๋ณด์ˆ˜์—๋„ ๋„์›€์ด ๋œ๋‹ค.
  • ํ•œํŽธ์œผ๋กœ๋Š” ๊ฐ์ฒด ๋ชจ์ฒด ํŒจํ„ด์€ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€ํ˜•๋˜๋ฉด ์ž˜ ๋Œ€์ฒ˜ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์‚ฌ์†Œํ•œ ์ฐจ์ด๊ฐ€ ์žˆ์„ ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋•Œ๋ฌธ์— ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ๊ฐ์ฒด ๋ชจ์ฒด ์ž์ฒด๊ฐ€ ์ค‘๋ณต๋œ ์ฝ”๋“œ๋กœ ๊ฐ€๋“ ์ฐจ๊ฑฐ๋‚˜ ๋ฌด์ˆ˜ํžˆ ๋งŽ์€ ๋ฏธ์„ธ ๋ฉ”์„œ๋“œ๋กœ ๋ฆฌํŒฉํ„ฐ๋ง๋˜์–ด ์ง€์›ํ•˜๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์–ด๋ ค์›Œ์งˆ์ง€๋„ ๋ชจ๋ฅธ๋‹ค.

๐Ÿ“š ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ๋นŒ๋”โ€‹

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

๐Ÿ“š ๋น„์Šทํ•œ ๊ฐ์ฒด ์ƒ์„ฑโ€‹

  • ๋‹ค์ˆ˜์˜ ๋น„์Šทํ•œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•  ๋•Œ ๋นŒ๋”๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋นŒ๋” ํ•˜๋‚˜๋งŒ์„ ๊ณตํ†ต์ ์ธ ์ƒํƒœ๋กœ ์ดˆ๊ธฐํ™”ํ•œ ๋‹ค์Œ ์ƒ์„ฑ๋  ๊ฐ ๊ฐ์ฒด๋ฅผ ๋Œ€์ƒ์œผ๋กœ ๊ฐ’์„ ๋‹ค๋ฅด๊ฒŒ ์ •์˜ํ•œ ํ›„ build() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋œ๋‹ค.
OrderBuilder hatAndCape = new OrderBuilder()
.withLine('Deerstalker Hat', 1)
.withLine('Tweed Cape', 1);

Order orderWithSmallDiscount = hatAndCape.withDiscount(0.10).build();
Order orderWithLargeDiscount = hatAndCape.withDiscount(0.25).build();
  • ๋” ์ ์€ ์ฝ”๋“œ๋กœ๋„ ์ฐจ์ด์— ๋” ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค. ๊ธฐ๋Šฅ์„ ํ† ๋Œ€๋กœ ๋นŒ๋”์˜ ์ด๋ฆ„์„ ์ง“๊ณ  ์ฐจ์ด์ ์„ ํ† ๋Œ€๋กœ ๋„๋ฉ”์ธ ๊ฐ์ฒด์˜ ์ด๋ฆ„์„ ์ง€์„ ์ˆ˜ ์žˆ๋‹ค.
  • ์ด ๊ธฐ๋ฒ•์€ ๊ฐ์ฒด์˜ ๋™์ผ ํ•„๋“œ๊ฐ€ ๋‹ฌ๋ผ์งˆ ๊ฒฝ์šฐ ๊ฐ€์žฅ ํšจ๊ณผ์ ์ด๋‹ค.
Order orderWithDiscount = new OrderBuilder(hatAndCape)
.withDiscount(0.10)
.build();

Order orderWithGiftVoucher = new OrderBuilder(hatAndCape)
.withDiscount("abc")
.build();

๐Ÿ“š ๋นŒ๋” ์กฐํ•ฉโ€‹

  • ๊ฐ ๊ฐ์ฒด์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ๋นŒ๋”๊ฐ€ '์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„' ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ทธ ๋Œ€์ƒ ๊ฐ์ฒด ๋Œ€์‹  ๊ฐ์ฒด์˜ ๋นŒ๋”๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด build() ๋ฉ”์„œ๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜์–ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ๋‹จ์ˆœํ•ด์งˆ ๊ฒƒ์ด๋‹ค.
Order order = new OrderBuilder()
.fromCustomer(
new CustomerBuilder()
.withAddress(new AddressBuilder().withNoPostcode().build())
.build())
.build();

// ๋ณ€๊ฒฝ ํ›„
Order order = new OrderBuilder()
.fromCustomer(
new CustomerBuilder()
.withAddress(new AddressBuilder().withNoPostcode()))
.build();

๐Ÿ“š ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•œ ๋„๋ฉ”์ธ ๋ชจ๋ธ ๊ฐ•์กฐโ€‹

  • ๋นŒ๋”๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋ถ„์„ ํŒฉํ„ฐ๋ฆฌ๋ฉ”์„œ๋“œ๋กœ ๊ฐ์‹ธ๋ฉด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ์žˆ๋Š” ์žก์Œ์„ ๋”์šฑ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
Order order = anOrder().fromCustomer(
aCustomer().withAddress(anAddress().withNoPostcode())).build();
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์••์ถ•ํ•˜๋‹ค๋ณด๋ฉด ๋นŒ๋”์— ํฌํ•จ๋œ ์ค‘๋ณต ์ฝ”๋“œ๋Š” ์ข€ ๋” ๋‘๋“œ๋Ÿฌ์ ธ ๋ณด์ธ๋‹ค. ์ด๋ฅผ ์ž๋ฐ”์˜ ๋ฉ”์„œ๋“œ ์ค‘๋ณต ์ •์˜(method overload)๋ฅผ ํ™œ์šฉํ•ด with() ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜๋กœ ์ค„์—ฌ์„œ ์ž๋ฐ”์˜ ํƒ€์ž… ์‹œ์Šคํ…œ์ด ์–ด๋Š ํ•„๋“œ์— ๊ฐฑ์‹ ํ•ด์•ผ ํ• ์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.
Order order = anOrder().from(aCustomer().with(anAddress().withNoPostcode())).build();
  • ์ด ๋ฐฉ๋ฒ•์€ ๊ฐ ํƒ€์ž…์˜ ํ•œ ์ธ์ž์— ๋Œ€ํ•ด์„œ๋งŒ ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค.

๐Ÿ“š ์‚ฌ์šฉ ์‹œ์ ์—์„œ ์ค‘๋ณต ์—†์• ๊ธฐโ€‹

  • ํ…Œ์ŠคํŠธ๋ฅผ ๊ตฌ์กฐํ™”ํ•ด์„œ ํŠน์ • ๋งฅ๋ฝ์—์„œ ์ด๋Ÿฌํ•œ ๋นŒ๋”๋ฅผ ๊ฐ€์žฅ ์ž˜ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
  • 303P ~ 305P ์˜ˆ์ œ ์ฐธ๊ณ 

๐ŸŽˆ ์šฐ์„  ์ค‘๋ณต์„ ์ œ๊ฑฐํ•œ๋‹คโ€‹

  • ๊ฐ์ฒด ๋ชจ์ฒด ํŒจํ„ด ์ˆ˜ํ–‰
  • ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ธ ๋นŒ๋”์˜ ์ธ์ž๊ฐ€ ์•„๋‹ˆ๋ผ ๋นŒ๋”๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. (๋นŒ๋” ์กฐํ•ฉ)

๐ŸŽˆ ๊ทธ๋Ÿฌ๊ณ  ๋‚˜์„œ ๊ธฐ๋Ÿ‰์„ ํ–ฅ์ƒํ•œ๋‹คโ€‹

  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ์ด๋ฆ„์„ ๋ฐ”๊ฟ” ์“ฐ๋Š” ์‹์œผ๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์—์„œ ๊ฐ•์กฐํ•˜๋Š” ๋ฐ”๋ฅผ ํ…Œ์ŠคํŠธ์˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์ด ์•„๋‹Œ ํ…Œ์ŠคํŠธ์—์„œ ์˜ˆ์ƒํ•˜๋Š” ํ–‰์œ„๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“š ์˜์‚ฌ์†Œํ†ต์ด ์šฐ์„ ์ด๋‹คโ€‹

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