๐ 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()
๋ฉ์๋๋ฅผ ํธ์ถํด ํ๋ ๊ฐ์ ํ ๋๋ก ๋์ ๊ฐ์ฒด์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด๋ธ๋ค. - ์ด๋ ๊ฒ ํ๋ฉด ํ
์คํธ์ ์์ ๊ฒฐ๊ณผ์ ๊ด๋ จ์ด ์๋ ๊ฐ๋ง ํฌํจ๋์ด ํ
์คํธ ํํ๋ ฅ์ด ๋์์ง๋ค. ๋ํ ๋ณํ์ ํ๋ ฅ์ ์ผ๋ก ๋์ํ ์ ์๋ค.
- ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ๋ฌธ๋ฒ์ ์ผ๋ก ์ง์ ๋ถํ ๋ถ๋ถ์ ๋๋ถ๋ถ ๊ฐ๋ ค์ค๋ค.
- ๊ธฐ๋ณธ์ ์ธ ๊ฒฝ์ฐ๋ฅผ ๋จ์ํ๊ฒ ํ๊ณ ํน๋ณํ ๊ฒฝ์ฐ๋ผ๋ ๊ทธ๋ฆฌ ๋ณต์กํ๊ฒ ๋ง๋ค์ง ์๋๋ค.
- ํ ์คํธ ๊ฐ์ฒด์ ๊ตฌ์กฐ์ ์ธ ๋ณํ๋ก๋ถํฐ ํ ์คํธ๋ฅผ ๋ค์ ํ ๋ฒ ๋ณดํธํ๋ค. ์์ฑ์์ ์ธ์๋ฅผ ์ถ๊ฐํ๋ค๋ฉด, ์ ์ธ์๊ฐ ํ์ํ๋ ๋ถ๋ถ๊ณผ ๊ด๋ จ๋ ๋น๋์ ํ ์คํธ๋ง ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
- ์ฝ๊ธฐ ์ฝ๊ณ ์ค๋ฅ๋ฅผ ์ฐพ๊ธฐ ์ฌ์ด ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค. ๊ฐ ๋น๋ ๋ฉ์๋๊ฐ ํด๋น ๋งค๊ฐ๋ณ์์ ์ฉ๋๋ฅผ ๋ฐํ๊ธฐ ๋๋ฌธ์ด๋ค.
๐ ๋น์ทํ ๊ฐ์ฒด ์์ฑโ
- ๋ค์์ ๋น์ทํ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํ ๋ ๋น๋๋ฅผ ์ด์ฉํ ์ ์๋ค.
- ๋น๋ ํ๋๋ง์ ๊ณตํต์ ์ธ ์ํ๋ก ์ด๊ธฐํํ ๋ค์ ์์ฑ๋ ๊ฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ๊ฐ์ ๋ค๋ฅด๊ฒ ์ ์ํ ํ
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 ์์ ์ฐธ๊ณ
๐ ์ฐ์ ์ค๋ณต์ ์ ๊ฑฐํ๋คโ
- ๊ฐ์ฒด ๋ชจ์ฒด ํจํด ์ํ
- ๋ ๋์ ๋ฐฉ๋ฒ์ธ ๋น๋์ ์ธ์๊ฐ ์๋๋ผ ๋น๋๋ฅผ ์ ๋ฌํ๋ค. (๋น๋ ์กฐํฉ)
๐ ๊ทธ๋ฌ๊ณ ๋์ ๊ธฐ๋์ ํฅ์ํ๋คโ
- ํ ์คํธ ์ฝ๋์์ ์ด๋ฆ์ ๋ฐ๊ฟ ์ฐ๋ ์์ผ๋ก ํ ์คํธ ์ฝ๋์์ ๊ฐ์กฐํ๋ ๋ฐ๋ฅผ ํ ์คํธ์ ๊ตฌํ ๋ฐฉ๋ฒ์ด ์๋ ํ ์คํธ์์ ์์ํ๋ ํ์๋ก ๋ฐ๊ฟ ์ ์๋ค.
๐ ์์ฌ์ํต์ด ์ฐ์ ์ด๋คโ
- ํ ์คํธ ๋ฐ์ดํฐ ๋น๋๋ฅผ ์ด์ฉํด ์ค๋ณต์ ์ค์ด๊ณ ํ ์คํธ ์ฝ๋๋ฅผ ์ข ๋ ํํ๋ ฅ ์๊ฒ ๋ง๋ค์๋ค.
- ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ฝ๋๋ผ๋ ์ธ์ด๋ฅผ ๊ด์ฐฐํ ๋ฐ๋ฅผ ๋ฐ์ํ๋ ๋ ๋ค๋ฅธ ๊ธฐ๋ฒ์ ํด๋นํ๋ฉฐ, ์ด ๊ธฐ๋ฒ์ ์ฝ๋๋ฅผ ์ฝ์ผ๋ ค๊ณ ์๋ ๊ฒ์ด๋ผ๋ ์์น์ ์ํด ์ฃผ๋๋๋ค.
- ์ข ๋ ์ฝ๊ธฐ ์ฝ๊ณ ๊ธฐ๋ฅ์ ์๋๋ฅผ ์์ ํ๋ ์ ์ธ์ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๋ฐ ๋์์ด ๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฒ์ ์ด์ฉํ๋ฉด ๊ธฐ์ ๊ณผ ๊ด๋ จ์ด ์๋ ์ดํด๋น์ฌ์์ ์ง์ ์ ์ผ๋ก ์์ฌ์ํตํ๋ ๋ฐ ํ์ฉํ ์ ์๋ค.