๐ค Chapter 5: ๊ตฌ๋ถ๋ฌ์ง๊ฑฐ๋ ๋ถ๋ฌ์ง๊ฑฐ๋
ํ๋์ ๋ฏธ์น ๋ฏ์ด ๋น ๋ฅธ ๋ณํ ์๋๋ฅผ ๋ฐ๋ผ๊ฐ๋ ค๋ฉด ๋ชจ๋ ์๋จ์ ๋์ํ์ฌ ๊ฐ๋ฅํ ํ ๋์จํ๊ณ ์ ์ฐํ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค.
๐ญ Topic 28. ๊ฒฐํฉ๋ ์ค์ด๊ธฐโ
๊ฒฐํฉ๋๊ฐ ๋์ผ๋ฉด ์ด๋ฆฌ์ ๋ฆฌ ์ฐ๊ฒฐ๋์ด ์์ด์ ์ฌ๋ฌ ๊ฐ์ง๋ฅผ ๋์์ ๋ฐ๊ฟ์ผ ํ๋ค. ๊ทธ๋์ ๋ฐ๊พธ๊ธฐ ๋ ์ด๋ ค์์ง๋ค. ์ฌ๋ฌ๋ถ์ ์ด๋ช ์ ๋ ์ค ํ๋๋ค. ๋ฐ๊ฟ์ผ ํ๋ ๊ณณ์ ๋ชจ๋ ์ฐพ์๋ด๋๋ผ ์๊ฐ์ ๋ค์ด๊ฑฐ๋, ์๋๋ฉด "๋ฑ ํ๋๋ง" ๋ฐ๊พธ๊ณ ๊ฒฐํฉ๋ ๋ค๋ฅธ ๊ฒ๋ค์ ์์ ์ฑ ์ ํ๋ก๊ทธ๋จ์ด ์ฃฝ๋์ง ๊ณ ๋ฏผํ๋๋ผ ์๊ฐ์ ๋ค์ด๊ฑฐ๋.
์ํํธ์จ์ด ๊ตฌ์กฐ๋ ์ ์ฐํด์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์ฐํ๋ ค๋ฉด ๊ฐ๊ฐ์ ๋ถํ์ด ๋ค๋ฅธ ๋ถํ์ ๊ฐ๋ฅํ ํ ์กฐ๊ธ๋ง ์ฐ๊ฒฐ๋์ด์ผ ํ๋ค.
Tip 44. ๊ฒฐํฉ๋๊ฐ ๋ฎ์ ์ฝ๋๊ฐ ๋ฐ๊พธ๊ธฐ ์ฝ๋ค.
๐ฅ ์ด์ฐจ ์ฌ๊ณ โ
public void applyDiscount(customer, order_id, discount) {
totals = customer
.orders
.find(order_id)
getTotals();
totals.grandTotal = totals.grandTotal - discount;
totals.discount = discount;
}
์ด ์ฝ๋๋ ํฉ๊ณ๊น์ง ๋ค์ฏ ๋จ๊ณ์ ์ถ์ํ๋ฅผ ์ค๊ฐ๋ค. ๊ฒฐ๊ตญ ์ต์์ ์ฝ๋๊ฐ ๋ชจ๋ ๊ฒ์ ์์์ผ ํ๋ค. ์ฝ๋๋ฅผ ์ฐ๊ฑฐ๋ ์ดํดํ๊ธฐ ์ํด ์์์ผ ํ๋ ๊ฒ์ด ๋๋ฌด ๋ง๋ค. ์ค์๊ฐ์์ผ๋ก ์ด ์ฝ๋๋ฅผ ๊ณ์ ์ง์ํ๊ธฐ ์ํด์ ์์ผ๋ก ๋ฐ๊พธ๋ฉด ์ ๋๋ ๊ฒ๋ ๋๋ฌด ๋ง๋ค.
Tip 45. ๋ฌป์ง ๋ง๊ณ ๋งํ๋ผ(Tell, Don't Ask)
์ด ์์น์ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ด๋ถ ์ํ์ ๋ฐ๋ผ ํ๋จ์ ๋ด๋ฆฌ๊ณ ๊ทธ ๊ฐ์ฒด๋ฅผ ๊ฐฑ์ ํด์๋ ์ ๋๋ค๋ ๊ฒ์ด๋ค. ๊ฐ์ฒด์ ๋ด๋ถ ์ํ๋ฅผ ๋ฌป๋ ๊ฒ์ผ๋ก ์ธํ์ฌ ์บก์ํ์ ์ฅ์ ์ ์์ ํ ์ฌ๋ผ์ง๊ณ , ๋ ๊ทธ ๊ณผ์ ์์ ๊ตฌํ์ ๋ํ ์ง์์ด ์ฝ๋ ์ฌ๊ธฐ์ ๊ธฐ๋ก ํผ์ ธ ๋ฒ๋ฆฐ๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ ์ด์ฐจ ์ฌ๊ณ ๋ฅผ ๊ณ ์น๋ ์ฒซ ๋ฐ์ง์ ํ ์ธ ์ฒ๋ฆฌ๋ฅผ totals
๊ฐ์ฒด์ ์์ํ๋ ๊ฒ์ด๋ค.
public void applyDiscount(customer, order_id, discount) {
customer
.orders
.find(order_id)
.getTotals()
.applyDiscount(discount);
}
์ฃผ๋ฌธ ์ปฌ๋ ์ ์ ๊ฐ์ ธ์์ ์ฃผ๋ฌธ์ ์ฐพ์์๋ ์ ๋๋ค. ๊ณ ๊ฐ ๊ฐ์ฒด์์ ๋ฐ๋ก ์ฃผ๋ฌธ ๊ฐ์ฒด๋ฅผ ์ป์ด ์์ผ ํ๋ค.
public void applyDiscount(customer, order_id, discount) {
customer
.findOrder(order_id)
.getTotals()
.applyDiscount(discount);
}
๋ง์ฐฌ๊ฐ์ง ๋ ผ๋ฆฌ๋ฅผ ์ฃผ๋ฌธ ๊ฐ์ฒด์ ํฉ๊ณ์๋ ์ ์ฉํ ์ ์๋ค. ์ฃผ๋ฌธ ๊ฐ์ฒด๋ฅผ ๊ตฌํํ ๋ ํฉ๊ณ๋ฅผ ๋ณ๋์ ๊ฐ์ฒด์ ์ ์ฅํ๋ค๋ ์ฌ์ค์ ์ ์จ ์ธ์ ์ฌ๋๋ค์ด ์์์ผ ํ๊ฒ ๋๊ฐ?
public void applyDiscount(customer, order_id, discount) {
customer
.findOrder(order_id)
.applyDiscount(discount);
}
๋ฐ๋ฉํ ๋ฅด ๋ฒ์น(๋๋ฏธํฐ ๋ฒ์น, Law of Demeter)โ
Tip 46. ๋ฉ์์ค ํธ์ถ์ ์ญ์ง ๋ง๋ผ.
๋ฌด์ธ๊ฐ์ ์ ๊ทผํ ๋ "."์ ๋ฑ ํ๋๋ง ์ฐ๋ ค๊ณ ๋ ธ๋ ฅํด ๋ณด๋ผ. "๋ฌด์ธ๊ฐ์ ์ ๊ทผ"ํ๋ค๋ ๊ฑด ์ค๊ฐ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊น์ง ํฌํจํด์ผ ํ๋ค.
# ์ข์ง ์์ ๋ฐฉ์์ด๋ค.
amount = customer.orders.last().totals().amount;
# ๋ง์ฐฌ๊ฐ์ง๋ก ์ข์ง ์๋ค.
orders = customer.orders;
last = orders.last();
totals = last.totals();
amount = totals.amount;
์ ํ๋ ๊ท์น์๋ ํฐ ์์ธ๊ฐ ํ๋ ์๋ค. ์ฎ๋ ๊ฒ๋ค์ด ์ ๋๋ก ๋ฐ๋์ง ์์ ๊ฒ ๊ฐ๋ค๋ฉด ์ด ๊ท์น์ ์งํค์ง ์์๋ ๋๋ค. ์ธ์ด์ ๊ธฐ๋ณธ์ผ๋ก ํฌํจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋ง ๊ฝค ์์ ์ ์ผ ๊ฒ์ด๊ณ , ๋ค์๊ณผ ๊ฐ์ด ์จ๋ ๋ ๊ฒ์ด๋ค.
people
.sort_by { |person| person.age }
.first(10)
.map {| person | person.name }
์ฐ์์ ํ์ดํ๋ผ์ธโ
ํ์ดํ๋ผ์ธ์ ํจ์์์ ํจ์๋ก ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ ๊ฐ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ๋ค. ์ด๋ฐ ํ์ดํ๋ผ์ธ์ ๋ฉ์๋ ํธ์ถ๋ก ์ด๋ฃจ์ด์ง ์ด์ฐจ ์ฌ๊ณ ์๋ ๋ค๋ฅด๋ค. ์จ๊ฒจ์ง ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ์์กดํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ ๋ค๊ณ ํ์ดํ๋ผ์ธ์ด ๊ฒฐํฉ์ ํ๋๋ ๋ง๋ค์ง ์๋ ๊ฒ์ ์๋๋ค. ํ์ดํ๋ผ์ธ์ ํจ์์์ ๋ฐํํ๋ ๋ฐ์ดํฐ๋ ๋ฐ๋์ ๋ค์ ํจ์๊ฐ ์ฒ๋ฆฌํ ์ ์๋ ํ์์ด์ด์ผ ํ๋ค.
๐ฅ ๊ธ๋ก๋ฒํ์ ํด์ โ
์ด๋์๋ ์ ๊ทผํ ์ ์๋ ๋ฐ์ดํฐ๋ ๊ต๋ฌํ๊ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ปดํฌ๋ํธ ๊ฐ์ ๊ฒฐํฉ์ ๋ง๋ค์ด ๋ธ๋ค. ์ ์ญ ๋ฐ์ดํฐ ํ๋ํ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ๋ฉ์๋์ ๊ฐ์๊ธฐ ๋งค๊ฐ ๋ณ์๊ฐ ์ถ๊ฐ๋ ๊ฒ๊ณผ ๊ฐ์ ํจ๊ณผ๋ฅผ ๋ธ๋ค. ์ ์ญ ๋ฐ์ดํฐ๋ ๋ชจ๋ ๋ฉ์๋ ์์์ ์ฌ์ฉํ ์ ์์ผ๋ ๋ง์ด๋ค.
์ ์ญ ๋ฐ์ดํฐ๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ฝ๋์ ๊ฒฐํฉ๋๋ฅผ ๋์ธ๋ค. ์ ์ญ ๋ฐ์ดํฐ์ ๊ตฌํ์ ๋ณ๊ฒฝํ ๋ ์์คํ ์ฝ๋ ์ ์ฒด์ ์ํฅ์ ์ค ์ ์์์ ๋ถ๋ช ํ๋ค.
์ ์ญ ๋ฐ์ดํฐ๋ ์ฝ๋๋ฅผ ๋ผ์ด ๋ด๋ ๊ฒฝ์ฐ์๋ ๋ฌธ์ ๋ฅผ ๋ง๋ ๋ค. ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ํด์ผ ํ๋ค๋ ์๊ฐ์ด ์ฝ๋ฉ ์ต๊ด์ด ์ผ๋ถ๊ฐ ๋์ด์ผ ํ๋ค. ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ค๋ฉด ๊นจ๋ํ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค๊ณ ๋๋จธ์ง ์ฝ๋์์ ๊ฒฐํฉ์ ์์ ์ผ ํ๋ค. ๊ทธ๋์ผ ๋๋จธ์ง ๊ฒ๋ค์ด ์ฐ๋ฅด๋ฅด ๋ธ๋ ค ๋ค์ด์ค๋ ์ผ ์์ด ๋ฉ์๋๋ ๋ชจ๋์ ๋ฝ์๋ผ ์ ์๋ค.
์ ์ญ ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ ์ฝ๋์ ๋จ์ ํ ์คํธ๋ฅผ ๋ง๋ค๋ค ๋ณด๋ฉด ์ด๋ฐ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๊ฒ ๋๋ค. ๊ทธ์ ํ ์คํธ๋ฅผ ์คํํ๋ ค๋ ๊ฒ๋ฟ์ธ๋ฐ ์ ์ญ ํ๊ฒฝ์ ์์ฑํ๋ ์ฝ๋๋ฅผ ํ์ฐธ์ด๋ ์จ์ผ ํ๋ค.
์ฑ๊ธํด(singleton)๋ ์ ์ญ ๋ฐ์ดํฐ๋คโ
์์์ ์ฐ๋ฆฌ๋ ์ผ๋ถ๋ฌ ์ ์ญ ๋ณ์๊ฐ ์๋๋ผ ์ ์ญ ๋ฐ์ดํฐ๋ผ๊ณ ๊ณ์ ๋งํ๋ค. ๊ฐ๋์ฉ "์ด๊ฒ ๋ณด์ธ์. ์ ์ญ ๋ณ์๋ ์์ด์. ๋ชจ๋ ์ธ์คํด์ค ๋ฐ์ดํฐ๋ก ์ฑ๊ธํด์ด๋ ์ ์ญ ๋ชจ๋ ์์ ๋ฃ์์ด์."๋ผ๊ณ ๋งํ๋ ์ฌ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ฌ๋ฌ๋ถ์ ์ฝ๋์ ์๋ ๊ฒ์ด ์ฑ๊ธํด๋ฟ์ด๋๋ผ๋, ์ธ๋ถ๋ก ๋ ธ์ถ๋ ์ธ์คํด์ค ๋ณ์๊ฐ ์๋ฉ ์๋ ์ฑ๊ธํด์ ์ฌ์ ํ ์ ์ญ ๋ฐ์ดํฐ๋ค. ๊ทธ์ ์ด๋ฆ์ด ์ข ๊ธธ ์ด์ก์ ๋ฟ์ด๋ค.
์ธ๋ถ ๋ฆฌ์์ค๋ ์ ์ญ ๋ฐ์ดํฐ๋คโ
์์ ๊ฐ๋ฅํ ์ธ๋ถ ๋ฆฌ์์ค๋ ๋ชจ๋ ์ ์ญ ๋ฐ์ดํฐ๋ค. ์ฌ๋ฌ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ ์ฅ์, ํ์ผ ์์คํ , ์๋น์ค API ๋ฑ์ ์ฌ์ฉํ๋ค๋ฉด ์ ์ญ ๋ฐ์ดํฐ์ ํจ์ ์ ๋น ์ง ์ํ์ด ์๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์๋ ํด๋ฒ์ ๋ฐ๋์ ์ด ๋ฆฌ์์ค๋ค์ ์ฌ๋ฌ๋ถ์ด ์์ฑํ๋ ์ฝ๋๋ก ๋ชจ๋ ๊ฐ์ธ๋ ๊ฒ์ด๋ค.
Tip 48. ์ ์ญ์ ์ด์ด์ผ ํ ๋งํผ ์ค์ํ๋ค๋ฉด API๋ก ๊ฐ์ธ๋ผ.
๐ฅ ์์์ ๊ฒฐํฉ์ ๋๋ฆฐ๋คโ
์์์ผ๋ก ๋ค๋ฅธ ํด๋์ค์ ์ํ์ ํ๋์ ๊ทธ๋๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค. ์์์ ์๋ชป ์ฌ์ฉํ๋ ๋ฌธ์ ๋ ๋๋ฌด ์ค์ํด์ ๋ณ๋๋ก ํญ๋ชฉ์ ๋ง๋ค์๋ค. (ํญ๋ชฉ 31. ์์์ธ ์ฐธ๊ณ )
๐ฅ ๊ฒฐ๊ตญ์ ๋ชจ๋ ETCโ
๊ฒฐํฉ๋ ์ฝ๋๋ ๋ฐ๊พธ๊ธฐ ํ๋ค๋ค. ์ฝ๋์ ํ ๊ณณ์ ๋ฐ๊พธ๋ฉด ๋ค๋ฅธ ๊ณณ์ ์ฌํ๊ฐ ๋ฏธ์น ์ ์๋ค. ๊ฐ๋์ ์ฐพ๊ธฐ ํ๋ ๊ณณ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ ๋ฐ๋์ ํ ๋ฌ ํ์๋ ์๋น์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด์ ๋ฌธ์ ์ ์ค์์ด ๋๋ฌ๋๊ธฐ๋ ํ๋ค.
์ง์ ์ ์ผ๋ก ์๋ ๊ฒ๋ง ๋ค๋ฃจ๋ ๋ถ ๋๋ผ์์ด ์ฝ๋๋ฅผ ๊ณ์ ์ ์งํ๋ผ. ๊ทธ๋ฌ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ๊ฒ ์ ์งํ ์ ์์ ๊ฒ์ด๊ณ , ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฝ๋๋ฅผ ๋ฐ๊พธ๊ธฐ ์ฌ์์ง ๊ฒ์ด๋ค.
๐ญ Topic 29. ์ค์ธ๊ณ๋ฅผ ๊ฐ๊ณ ์ ๊ธ๋งํ๊ธฐโ
๐ฅ ์ด๋ฒคํธโ
์ด๋ฒคํธ๋ ๋ฌด์ธ๊ฐ ์ ๋ณด๊ฐ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ ๋ณด๋ ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ํด๋ฆญํ๊ฑฐ๋, ์ฃผ๊ฐ ์ ๋ณด๊ฐ ๊ฐฑ์ ๋ ๋์ฒ๋ผ ์ธ๋ถ์์ ์ฌ ์ ์๋ค.
๐ฅ ์ ํ ์ํ ๊ธฐ๊ณโ
์ค์ฉ์ฃผ์ FSM ํด๋ถํโ
๊ธฐ๋ณธ์ ์ผ๋ก ์ํ ๊ธฐ๊ณ๋ ์ด๋ฒคํธ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ์ ์ํ ๋ช ์ธ์ผ ๋ฟ์ด๋ค. ์ ํด์ง ์ํ๋ค์ด ์๊ณ ๊ทธ์ค ํ๋๊ฐ "ํ์ฌ ์ํ"๋ค. ์ํ๋ง๋ค ๊ทธ ์ํ์ผ ๋ ์๋ฏธ๊ฐ ์๋ ์ด๋ฒคํธ๋ค์ ๋์ดํ๊ณ , ์ด๋ฒคํธ๋ณ๋ก ์์คํ ์ ๋ค์ "ํ์ฌ ์ํ"๋ฅผ ์ ์ํ๋ค.
FSM์ ๋ฉ์ง ์ ์ FSM์ ์ค๋ก์ง ๋ฐ์ดํฐ๋ง์ผ๋ก ํํํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
ํ๋ ์ถ๊ฐํ๊ธฐโ
ํน์ ํ ์ํ ์ดํ์ด ์ผ์ด๋ ๋ ์ํํ๋ ํ๋์ ์ถ๊ฐํ์ฌ FSM์ ๋ ๊ฐ๋ ฅํ๊ฒ ๋ง๋ค ์ ์๋ค.
์ํ ๊ธฐ๊ณ๋ ์์์ผ ๋ฟโ
์ํ ๊ธฐ๊ณ๋ ๊ฐ๋ฐ์๋ค์๊ฒ ์ ํ๊ฐ๋์ด ์๋ค. ์ฌ๋ฌ๋ถ์ด ์ํ ๊ธฐ๊ณ๋ฅผ ์ ์ฉํ ์ ์๋ ๊ณณ์ ํ๋ฒ ์ฐพ์๋ณด๋ฉด ์ข๊ฒ ๋ค. ํ์ง๋ง ์ํ ๊ธฐ๊ณ๊ฐ ์ด๋ฒคํธ์ ๊ด๋ จ๋ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ ๋ชปํ๋ค.
๐ฅ ๊ฐ์์ ํจํดโ
๊ฐ์์ ํจํด์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋ ์ชฝ์ธ ๊ฐ์ ๋์๊ณผ ์ด๋ฐ ์ด๋ฒคํธ์ ๊ด์ฌ์ด ์๋ ํด๋ผ์ด์ธํธ์ธ ๊ฐ์์๋ก ์ด๋ฃจ์ด์ง๋ค.
๊ฐ์์๋ ์์ ์ด ๊ด์ฌ ์๋ ์ด๋ฒคํธ๋ฅผ ๊ฐ์ ๋์์ ๋ฑ๋กํ๋ค. ๋ณดํต์ ํธ์ถ๋ ํจ์์ ์ฐธ์กฐ๋ ๋ฑ๋กํ ๋ ํจ๊ป ๋๊ธด๋ค. ๋์ค์ ํด๋น ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ๊ฐ์ ๋์์ ๋ฑ๋ก๋ ๊ฐ์์ ๋ชฉ๋ก์ ๋ณด๋ฉด์ ํจ์๋ค์ ์ผ์ผ์ด ํธ์ถํ๋ค. ์ด๋, ๋ฐ์ํ ์ด๋ฒคํธ๋ฅผ ๊ฐ์์ ํจ์์ ์ธ์๋ก ๋๊ธด๋ค.
๊ฐ์ ๋์์ ๋ง๋๋ ์ฝ๋๋ ๋ณ๊ฒ ์๋ค. ํจ์ ์ฐธ์กฐ๋ฅผ ๋ฆฌ์คํธ์ ์ถ๊ฐํ๊ณ , ์ด๋ฒคํธ๊ฐ ์ผ์ด๋๋ฉด ์ด ํจ์๋ค์ ํธ์ถํ๋ค.
"๊ฐ์์-๊ฐ์ ๋์" ํจํด์ ์์ญ ๋ ๊ฐ ์ฐ์ฌ ์๊ณ , ์ ์๋ํ๋ค. ํนํ ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์์คํ ์ ์ ๋๋ฆฌ ์ฐ์ด๋๋ฐ, ์ด๋ค ์ํธ ์์ฉ์ด ์ผ์ด๋ฌ๋ค๋ ๊ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๋ฐฑ์ผ๋ก ์๋ ค์ฃผ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
ํ์ง๋ง ๊ฐ์์ ํจํด์๋ ๋ฌธ์ ๊ฐ ํ๋ ์๋ค. ๋ชจ๋ ๊ฐ์์๊ฐ ๊ฐ์ ๋์์ ๋ฑ๋ก์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ฒฐํฉ์ด ์๊ธด๋ค. ๋๊ตฐ๋ค๋ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ ๋์์ด ์ฝ๋ฐฑ์ ์ง์ ํธ์ถํ๋๋ก ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ์ด ๋ถ๋ถ์ด ์ฑ๋ฅ ๋ณ๋ชฉ์ด ๋ ์ ์๋ค.
๋๊ธฐ์ ์ฒ๋ฆฌ์ ํน์ฑ์ ์ฝ๋ฐฑ ์คํ์ด ๋๋ ๋๊น์ง ๊ฐ์ ๋์์ด ๊ณ์ ๊ธฐ๋ค๋ ค์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ๋ฌธ์ ๋ ๋ค์ ์ ๋ต์ธ "๊ฒ์-๊ตฌ๋
"์ผ๋ก ํด๊ฒฐํ๋ค.
๐ฅ ๊ฒ์-๊ตฌ๋ โ
๊ฒ์-๊ตฌ๋ ํน์ ๋ฐํ-๊ตฌ๋ ๋ชจ๋ธ์ ์ค์ฌ์ ํ์ญ์ด๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ ๊ฐ์์ ํจํด์ ์ผ๋ฐํํ ๊ฒ์ด๋ค. ๋์์ ๊ฐ์์ ๋ชจ๋ธ์ ๊ฒฐํฉ๋๋ฅผ ๋์ด๋ ๋ฌธ์ ์ ์ฑ๋ฅ ๋ฌธ์ ๋ ํด๊ฒฐํ๋ค.
๊ฒ์-๊ตฌ๋ ๋ชจ๋ธ์๋ ๊ฒ์์์ ๊ตฌ๋ ์๊ฐ ์๊ณ , ์ด๋ค์ ์ฑ๋๋ก ์ฐ๊ฒฐ๋๋ค. ์ฑ๋์ ๋ณ๋ ์ฝ๋๋ก ๊ตฌํ๋๋๋ฐ, ์ด๋ฐ ์์ธํ ๊ตฌํ ๋ด์ฉ์ ์ฌ๋ฌ๋ถ์ ์ฝ๋๋ก๋ถํฐ ์จ๊ฒจ์ ธ ์๋ค.
๊ฐ ์ฑ๋์๋ ์ด๋ฆ์ด ์๋ค. ๊ตฌ๋ ์๋ ๊ด์ฌ์ฌ๋ฅผ ํ๋ ์ด์์ ์ฑ๋์ ๋ฑ๋กํ๊ณ , ๊ฒ์์๋ ์ฑ๋์ ์ด๋ฒคํธ๋ฅผ ๋ณด๋ธ๋ค. ๊ฐ์์ ํจํด๊ณผ๋ ๋ค๋ฅด๊ฒ ๊ฒ์์์ ๊ตฌ๋ ์ ์ฌ์ด์ ํต์ ์ ์ฌ๋ฌ๋ถ์ ์ฝ๋ ๋ฐ์์ ์ผ์ด๋๋ค. ์๋ง ๋น๋๊ธฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง ๊ฒ์ด๋ค.
๊ฒ์-๊ตฌ๋ ๋ชจ๋ธ์ ์ถ๊ฐ์ ์ธ ๊ฒฐํฉ ์์ด ๋น๋๊ธฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ๊ธฐ์ ์์ฃผ ์ข์ ๊ธฐ์ ์ด๋ค. ๋์ ๋จ์ ์ ๊ฒ์-๊ตฌ๋ ๋ชจ๋ธ์ ์์ฃผ ๋ง์ด ์ฌ์ฉํ๋ ์์คํ ์์๋ ํ์ฌ ์ด๋ค ์ผ์ด ๋ฒ์ด์ง๊ณ ์๋์ง ํ์ ํ๊ธฐ๊ฐ ํ๋ค๋ค๋ ๊ฒ์ด๋ค. ๊ฒ์์๊ฐ ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ๊ฒ์ ํ์ธํ๋๋ผ๋ ์ด๋ค ๊ตฌ๋ ์๊ฐ ๊ทธ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๋์ง ๋ฐ๋ก ์ด์ด์ ๋ณผ ์ ์๋ค.
๐ฅ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ๊ณผ ์คํธ๋ฆผ ๊ทธ๋ฆฌ๊ณ ์ด๋ฒคํธโ
์ด๋ค ์
์ ๋ค์ด ์๋ ์์์์ ๋ค๋ฅธ ์
์ ์ฐธ์กฐํ๊ณ ์์ ๋, ์ฐธ์กฐ๋ ์
์ ๊ฐ์ ๋ฐ๊พธ๋ฉด ์ฒซ ๋ฒ์งธ ์
์ ๊ฐ๋ ๋ฐ๋๋ค. ๊ฐ์ด ๋ฐ๋๋ฉด ๊ทธ ๊ฐ์ ์ฌ์ฉํ๋ ๋ค๋ฅธ ๊ฐ์ด "๋ฐ์ํ๋" ๊ฒ์ด๋ค.
์ด๋ฐ ๋ฐ์ดํฐ ์์ค์ ๋ฐ์์ฑ์ ๊ตฌํํ ์ ์๋ ํ๋ ์์ํฌ๊ฐ ๋ง์ด ์๋ค. ๋ธ๋ผ์ฐ์ ์ธ๊ณ์์๋ ํ์ฌ ๋ฆฌ์กํธ์ ๋ทฐ์ ์ธ๊ธฐ๊ฐ ๊ฐ์ฅ ๋๋ค.
์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๊ฐ ๋ฐ์ํ๋๋ก ํ ์ ์๋ค๋ ๊ฒ์ ๋ช ๋ฐฑํ๋ค. ํ์ง๋ง ์ด๋ฒคํธ๋ฅผ ์ด๋ฆฌ์ ๋ฆฌ ์ฐ๊ฒฐํ๋ ๊ฒ๋ ์ฝ์ง๋ง์ ์๋ค. ๊ทธ๋์ ์คํธ๋ฆผ์ด ํ์ํ๋ค.
์คํธ๋ฆผ์ ์ด๋ฒคํธ๋ฅผ ์ผ๋ฐ์ ์ธ ์๋ฃ ๊ตฌ์กฐ์ฒ๋ผ ๋ค๋ฃฐ ์ ์๊ฒ ํด ์ค๋ค. ์ด๋ฒคํธ์ ๋ฆฌ์คํธ๋ฅผ ๋ค๋ฃฌ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. ์๋ก์ด ์ด๋ฒคํธ๊ฐ ๋์ฐฉํ๋ฉด ์ด ๋ฆฌ์คํธ๊ฐ ๊ธธ์ด์ง๋ ์ ์ด๋ค. ์ด๋ฐ ๋ฐฉ์์ด ์ข์ ์ด์ ๋ ์ต์ํ ๋ฐฉ์์ผ๋ก ์คํธ๋ฆผ์ ๋ค๋ฃฐ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ณ , ์กฐํฉํ๊ณ , ๊ณจ๋ผ๋ด๋ ๋ฑ ์ฐ๋ฆฌ๊ฐ ์๋ ์จ๊ฐ ์์ ์ ์ผ๋ฐ์ ์ธ ์๋ฃ ๊ตฌ์กฐ์ ๋ง์ฐฌ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ํ ์ ์๋ค. ์ฌ์ง์ด ์ด๋ฒคํธ ์คํธ๋ฆผ๊ณผ ์ผ๋ฐ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์กฐํฉํ ์๋ ์๋ค. ๋ํ ์คํธ๋ฆผ์ ๋น๋๊ธฐ์ ์ผ๋ก ์๋ํ ์๋ ์๋๋ฐ, ์ด๋ฒคํธ๊ฐ ๋์ฐฉํ์ ๋ ์ฌ๋ฌ๋ถ์ ์ฝ๋๊ฐ ์ด๋ฒคํธ์ ์๋ตํ ๊ธฐํ๋ฅผ ์ป๋๋ค.
์ฒซ ๋ฒ์งธ ์์ ๋ ๋ ๊ฐ์ ์คํธ๋ฆผ์ ๋ฐ์์ ํ๋๋ก ์ฎ๋๋ค. ๊ทธ๋ฌ๋ฉด ๊ฒฐ๊ณผ๋ก ์๋ก์ด ์คํธ๋ฆผ์ด ์๊ธฐ๋๋ฐ, ์ฒซ ๋ฒ์ฌ ์คํธ๋ฆผ์์ ์์ ํ๋, ๋ ๋ฒ์งธ ์คํธ๋ฆผ์์ ์์ ํ๋๋ฅผ ๊ฐ์ ธ์์ ํ๋๋ก ๋ฌถ์ ๊ฒ์ด ์๋ก์ด ์คํธ๋ฆผ์ ์์๊ฐ ๋๋ค. ๋ค์ ์์์ ์ฒซ ๋ฒ์งธ ์คํธ๋ฆผ์ ๊ทธ๋ฅ ๋๋ฌผ ์ด๋ฆ ๋ค์ฏ ๊ฐ๋ค. ๋ ๋ฒ์งธ ์คํธ๋ฆผ์ ์ข ๋ ํฅ๋ฏธ๋ก์ด๋ฐ, 500ms๋ง๋ค ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํค๋ ๋ฐ๋ณต ํ์ด๋จธ๋ค. ๋ ์คํธ๋ฆผ์ด ์ง์ผ๋ก ์ฎ์๊ธฐ ๋๋ฌธ์ ๋ ๋ชจ๋์ ๋ฐ์ดํฐ๊ฐ ์์ ๋๋ง ์ฎ์ธ ์คํธ๋ฆผ์ ๊ฒฐ๊ณผ๊ฐ ์๊ธด๋ค. ์ฆ, ์ถ๋ ฅ ์คํธ๋ฆผ์ 0.5์ด์ ํ ๋ฒ์ฉ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ณด๋ธ๋ค.
import * as Observable from 'rxjs';
import { logValues } from '../rxcommon/logger.js';
let animals = Observable.of("ant", "bee", "cat", "dog", "elk");
let ticker = Observable.interval(500)
let combined = Observable.zip(animals, ticker);
combined.subscribe(next => logValues(JSON.stringify(next)));
์ ์ฝ๋๋ ๋ธ๋ผ์ฐ์ ์ฐฝ์ ๋ชฉ๋ก์ ์๋ก์ด ํญ๋ชฉ์ ์ถ๊ฐํ๋ ๊ฐ๋จํ ๋ก๊น ํจ์๋ฅผ ์ฌ์ฉํ๋ค. ๊ฐ ํญ๋ชฉ์๋ ํ๋ก๊ทธ๋จ์ด ์์๋ ํ๋ถํฐ ํ๋ฅธ ์๊ฐ์ ๋ฐ๋ฆฌ์ด ๋จ์๋ก ๋ถ์ธ๋ค. 500ms๋ง๋ค ํ๋์ฉ ์คํธ๋ฆผ์์ ์ด๋ฒคํธ๋ฅผ ๋ฐ๊ณ ์๋ค. ๋ธ๋ผ์ฐ์ ์์ ์คํํด ๋ณด๋ฉด ๋ก๊ทธ ํญ๋ชฉ์ด ์ ํํ๊ฒ 0.5์ด๋ง๋ค ๋ํ๋๋ค.