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

๐Ÿค” 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์ดˆ๋งˆ๋‹ค ๋‚˜ํƒ€๋‚œ๋‹ค.

๐Ÿฅ• ์–ด๋””์—๋‚˜ ์ด๋ฒคํŠธ๊ฐ€ ์žˆ๋‹คโ€‹

์ด๋ฒคํŠธ๋Š” ๋ชจ๋“  ๊ณณ์— ์žˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€๋Š” ๋ป”ํ•˜๋‹ค. ๋งˆ์šฐ์Šค ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ํƒ€์ด๋จธ๊ฐ€ ์šธ๋ฆฐ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ๋ป”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋กœ๊ทธ์ธํ•˜๊ฑฐ๋‚˜ ํŒŒ์ผ์˜ ํŠน์ • ์ค„์ด ํŒจํ„ด๊ณผ ์ผ์น˜ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฒคํŠน ์–ด๋””์„œ ๋ฐœ์ƒํ•˜๋“  ์ด๋ฒคํŠธ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ณต๋“ค์—ฌ ๋งŒ๋“  ์ฝ”๋“œ๋Š” ์ผ์ง์„ ์œผ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ์ฝ”๋“œ๋ณด๋‹ค ๋” ์ž˜ ๋ฐ˜์‘ํ•˜๊ณ  ๊ฒฐํ•ฉ๋„๊ฐ€ ๋” ๋‚ฎ๋‹ค.

๐Ÿญ Topic 30. ๋ณ€ํ™˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐโ€‹

๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•œ๋‹ค. ๋ฐ›์€ ์ž…๋ ฅ์€ ์ถœ๋ ฅ์œผ๋กœ ๋ฐ”๊พผ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์„ค๊ณ„๋ฅผ ๊ณ ๋ฏผํ•  ๋•Œ ๋ณ€ํ™˜์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋Š” ๊ฑฐ์˜ ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค. ์˜ค์ง ํด๋ž˜์Šค์™€ ๋ชจ๋“ˆ, ์ž๋ฃŒ ๊ตฌ์กฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์–ธ์–ด, ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฑฑ์ •ํ•  ๋ฟ์ด๋‹ค.

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

Tip 49. ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ฝ”๋“œ์— ๊ด€ํ•œ ๊ฒƒ์ด์ง€๋งŒ, ํ”„๋กœ๊ทธ๋žจ์€ ๋ฐ์ดํ„ฐ์— ๊ด€ํ•œ ๊ฒƒ์ด๋‹ค.

๐Ÿฅ• ๋ณ€ํ™˜ ์ฐพ๊ธฐโ€‹

๋•Œ์— ๋”ฐ๋ผ์„  ์š”๊ตฌ ์‚ฌํ•ญ์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒŒ ๋ณ€ํ™˜์„ ์ฐพ๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด๋‹ค. ์š”๊ตฌ ์‚ฌํ•ญ์—์„œ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์ด ๋ฌด์—‡์ธ์ง€ ์ฐพ์œผ๋ฉด ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ•จ์ˆ˜๊ฐ€ ์ •ํ•ด์ง„๋‹ค. ์ด์ œ ์ž…๋ ฅ์„ ์ถœ๋ ฅ์œผ๋กœ ๋ฐ”๊ฟ” ๊ฐ€๋Š” ๋‹จ๊ณ„๋“ค์„ ์ฐพ์œผ๋ฉด ๋œ๋‹ค. ์ผ์ข…์˜ ํ•˜ํ–ฅ์‹ ์ ‘๊ทผ ๋ฐฉ์‹์ด๋‹ค.

๐Ÿฅ• ์ด๊ฒƒ์ด ์™œ ๊ทธ๋ฆฌ ๋Œ€๋‹จํ•œ๊ฐ€?โ€‹

word
|> all_subset_longer_than_three_characters()
|> sa_unique_signatures()
|> find_in_dictionary()
|> group_by_length()

์š”๊ตฌ ์‚ฌํ•ญ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒƒ์€ ํ•˜๋‚˜๋กœ ์—ฐ๊ฒฐ๋œ ๋ณ€ํ™˜๋“ค๋ฟ์ด๋‹ค. ๊ฐ๊ฐ์€ ์•ž์˜ ๋ณ€ํ™˜์—์„œ ์ž…๋ ฅ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์Œ ๋ณ€ํ™˜์œผ๋กœ ๋„˜๊ฒจ์ค€๋‹ค. ์ด๋ณด๋‹ค ๊ธ€์ฒ˜๋Ÿผ ์ฝ๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋Š” ๋งŒ๋“ค๊ธฐ ์–ด๋ ค์šธ ๊ฒƒ์ด๋‹ค.

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

Tip 50. ์ƒํƒœ๋ฅผ ์Œ“์•„ ๋†“์ง€ ๋ง๊ณ  ์ „๋‹ฌํ•˜๋ผ.

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

๐Ÿฅ• ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜.โ€‹

์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๊ด€๋ก€๊ฐ€ ํ•˜๋‚˜ ์žˆ๋‹ค. ๋ฐ”๋กœ ๋ณ€ํ™˜ ์‚ฌ์ด์— ๊ฐ’์„ ์ ˆ๋Œ€ ๋‚ ๊ฒƒ์œผ๋กœ ๋„˜๊ธฐ์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค. ๋Œ€์‹  ๋ž˜ํผ ์—ญํ• ์„ ํ•˜๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ๋‚˜ ํƒ€์ž…์œผ๋กœ ๊ฐ’์„ ์‹ธ์„œ ๋„˜๊ธด๋‹ค. ์ด๋Ÿฐ ์ž๋ฃŒ ๊ตฌ์กฐ๋‚˜ ํƒ€์ž…์€ ์•ˆ์— ๋“ค์–ด ์žˆ๋Š” ๊ฐ’์ด ์œ ํšจํ•œ์ง€๋ฅผ ์ถ”๊ฐ€๋กœ ์•Œ๋ ค ์ค€๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•˜์Šค์ผˆ์—์„œ ์ด๋Ÿฐ ๋ž˜ํผ๋ฅผ Maybe๋ผ๊ณ  ๋ถ€๋ฅด๊ณ , F#๊ณผ ์Šค์นผ๋ผ์—์„œ๋Š” Option์ด๋‹ค.

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

๐Ÿฅ• ๋ณ€ํ™˜์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ณ€ํ™˜ํ•œ๋‹คโ€‹

์ฝ”๋“œ๋ฅผ ์ผ๋ จ์˜ (์ค‘์ฒฉ๋œ) ๋ณ€ํ™˜์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•ด๋ฐฉ์‹œํ‚จ๋‹ค. ์ต์ˆ™ํ•ด์ง€๋Š” ๋ฐ๋Š” ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆฌ์ง€๋งŒ, ์ผ๋‹จ ์Šต๊ด€์„ ๋“ค์ด๋ฉด ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๊ฐ€ ๋” ๋ช…ํ™•ํ•ด์ง€๊ณ , ํ•จ์ˆ˜๋Š” ์งง์•„์ง€๋ฉฐ, ์„ค๊ณ„๋Š” ๋‹จ์ˆœํ•ด์งˆ ๊ฒƒ์ด๋‹ค.

๐Ÿญ Topic 31. ์ƒ์†์„ธโ€‹

๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋Š”๊ฐ€? ์ƒ์†์„ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?
๊ทธ๋ ‡๋‹ค๋ฉด ๋ฉˆ์ถฐ๋ผ! ์•„๋งˆ ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ํ•„์š”ํ•œ ๊ฒƒ์€ ์ƒ์†์ด ์•„๋‹ ๊ฒƒ์ด๋‹ค.

๐Ÿฅ• ์•ฝ๊ฐ„์˜ ๋ฐฐ๊ฒฝ์ง€์‹โ€‹

์šฐ๋ฆฌ๊ฐ€ ๋งž๋‹ฅํŠธ๋ฆฐ ๊ฐ์ฒด ์ง€ํ–ฅ ๊ฐœ๋ฐœ์ž ์„ธ๋Œ€๋Š” ๋‹ค์Œ ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ ์ด์œ ๋กœ ์ƒ์†์„ ์‚ฌ์šฉํ•œ๋‹ค. ํƒ€์ž…์ด ์‹ซ์–ด์„œ ์•„๋‹ˆ๋ฉด ํƒ€์ž…์ด ์ข‹์•„์„œ.

ํƒ€์ž…์„ ์‹ซ์–ดํ•˜๋Š” ์ด๋“ค์€ ์ž…๋ ฅํ•˜๋Š” ๊ธ€์ž ์ˆ˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ƒ์†์„ ์“ด๋‹ค. ์ƒ์†์œผ๋กœ ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค์—์„œ ์ž์‹ ํด๋ž˜์Šค๋กœ ๋„˜๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค. User ํด๋ž˜์Šค์™€ Product ํด๋ž˜์Šค๋Š” ๋ชจ๋‘ ActiveRecord::Base์˜ ํ•˜์œ„ ํด๋ž˜์Šค๋‹ค.
ํƒ€์ž…์„ ์ข‹์•„ํ•˜๋Š” ์ด๋“ค์€ ์ƒ์†์œผ๋กœ ํด๋ž˜์Šค ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค. Car๋Š” Vehicle์˜ ์ผ์ข…์ด๋‹ค.
์•ˆํƒ€๊น์ง€๋งŒ ๋‘ ๊ฐ€์ง€ ์ƒ์† ๋ชจ๋‘ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

๐Ÿฅ• ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์†์„ ์“ธ ๋•Œ์˜ ๋ฌธ์ œโ€‹

์ƒ์†๋„ ์ผ์ข…์˜ ๊ฒฐํ•ฉ์ด๋‹ค. ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๋ถ€๋ชจ ํด๋ž˜์Šค, ๋ถ€๋ชจ์˜ ๋ถ€๋ชจ, ๋˜ ๊ทธ ๋ถ€๋ชจ์—๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒƒ์€ ๋ฌผ๋ก ์ด์š”, ์ž์‹ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋„ ์ด ํด๋ž˜์Šค์˜ ๋ชจ๋“  ์กฐ์ƒ๊ณผ ์–ฝํžˆ๊ฒŒ ๋œ๋‹ค. ๋‹ค์Œ ์˜ˆ๋ฅผ ๋ณด์ž.

class Vehicle
def initialize
@speed = 0
end
def stop
@speed = 0
end
def move_at(speed)
@speed = speed
end
end

class Car < Vehicle
def info
"#{@speed}์˜ ์†๋„๋กœ ์ฃผํ–‰ ์ค‘์ธ ์ฐจ์ž…๋‹ˆ๋‹ค."
end
end

# ์ตœ์ƒ์œ„ ์ฝ”๋“œ
my_car = Car.new
my_car.move_at(30)

์ตœ์ƒ์œ„ ์ฝ”๋“œ์—์„œ my_car.move_at์„ ํ˜ธ์ถœํ•˜๋ฉด Car์˜ ๋ถ€๋ชจ์ธ Vehicle์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค.
Vehicle ๋‹ด๋‹น ํ”„๋กœ๊ทธ๋ž˜๋จธ์‚ฌ API๋ฅผ ๋ฐ”๊พผ๋‹ค๊ณ  ํ•ด ๋ณด์ž. move_at์€ set_velocity๋กœ, ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ @speed๋Š” @velocity๋กœ ๋ฐ”๊พธ์—ˆ๋‹ค.
API๊ฐ€ ๋ฐ”๋€Œ๋ฉด Vehicle ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ๋‹น์—ฐํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์•ž์—์„œ ๋ณธ ์ตœ์ƒ์œ„ ์ฝ”๋“œ์˜ ๋‹ด๋‹น์ž๋Š” ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์•„ ๊นœ์ง ๋†€๋ž„ ๊ฒƒ์ด๋‹ค. ์ž์‹ ์€ Car๋ฅผ ์“ฐ๊ณ  ์žˆ๋‹ค๊ณ ๋งŒ ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. Car ํด๋ž˜์Šค๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š”์ง€๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์‹ ๊ฒฝ ์“ธ ๋ถ€๋ถ„์ด ์•„๋‹ˆ์ง€๋งŒ, Car๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๊นŒ์ง€ ํ•จ๊ผ ๋ง๊ฐ€์ง€๊ณ  ๋งŒ๋‹ค.

๋น„์Šทํ•˜๊ฒŒ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์€ ์˜จ์ „ํžˆ ๋‚ด๋ถ€ ๊ตฌํ˜„์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด๋‹ค. ํ•˜์ง€๋งŒ Vehicle์ด ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋ฐ”๊พธ์ž ์–ด๋Š์ƒˆ Car๊ฐ€ ๋ง๊ฐ€์กŒ๋‹ค.
๊ฒฐํ•ฉ์ด ๋„ˆ๋ฌด ๋งŽ๋‹ค.

๐Ÿฅ• ํƒ€์ž…์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์†์„ ์“ธ ๋•Œ์˜ ๋ฌธ์ œโ€‹

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

Tip 51. ์ƒ์†์„ธ๋ฅผ ๋‚ด์ง€ ๋ง๋ผ.

๐Ÿฅ• ๋” ๋‚˜์€ ๋Œ€์•ˆโ€‹

๋”๋Š” ์ƒ์†์„ ์“ธ ํ•„์š”๊ฐ€ ์—†๊ฒŒ ํ•ด ์ฃผ๋Š” ์„ธ ๊ฐ€์ง€ ๊ธฐ๋ฒ•์„ ์†Œ๊ฐœํ•˜๊ฒ ๋‹ค.

  • ์ธํ„ฐํŽ˜์ด์Šค์™€ ํ”„๋กœํ† ์ฝœ
  • ์œ„์ž„ ๋ฏน์Šค์ธ๊ณผ ํŠธ๋ ˆ์ดํŠธ

์ธํ„ฐํŽ˜์ด์Šค์™€ ํ”„๋กœํ† ์ฝœโ€‹

๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด๋Š” ํด๋ž˜์Šค๊ฐ€ ํŠน์ •ํ•œ ๋™์ž‘์„ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๋Ÿฌ ๋™์ž‘์„ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์˜ˆ๋ฅผ ๋“ค์–ด Car ํด๋ž˜์Šค๊ฐ€ Drivable ๋™์ž‘๊ณผ Locatable ๋™์ž‘์„ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ๋ฒ•์€ ์–ธ์–ด๋งˆ๋‹ค ์ƒ์ดํ•œ๋‹ค. ์ž๋ฐ”์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

public class Car implements Drivable, Locatable {
// Car ํด๋ž˜์Šค์˜ ์ฝ”๋“œ, ์ด ์ฝ”๋“œ๋Š” Drivable๊ณผ Locatable์ด
// ์š”๊ตฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
}

Drivable๊ณผ Locatable ๊ฐ™์€ ์ž๋ฐ”์—์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ํ”„๋กœํ† ์ฝœ์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์–ธ์–ด๋„ ์žˆ๊ณ  ํŠธ๋ ˆ์ดํŠธ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ์–ธ์–ด๋„ ์žˆ๋‹ค.
์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•œ๋‹ค.

public interface Drivable {
double getSpeed();
void stop();
}

public interface Locatable {
Coordinate getLocation();
boolean locationIsValid();
}

์ด ์„ ์–ธ๋“ค์€ ์•„๋ฌด๋Ÿฐ ์ฝ”๋“œ๋„ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ƒฅ Drivable์„ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋Š” ๋ชจ๋‘ getSpeed์™€ stop ๋‘ ๊ฐœ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ง€์‹œํ•  ๋ฟ์ด๋‹ค. Locatableํ•œ ํด๋ž˜์Šค๋Š” getLocation๊ณผ locationIsValid๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ํ”„๋กœํ† ์ฝœ์ด ๊ฐ•๋ ฅํ•œ ๊นŒ๋‹ญ์€ ์ด๋“ค์„ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ํ•ด๋‹น ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋ผ๋ฉด ๋ฌด์—‡์ด๋“  ๊ทธ ํƒ€์ž…๊ณผ ํ˜ธํ™˜๋˜๊ธฐ ๋–„๋ฌธ์ด๋‹ค. ๋งŒ์•ฝ Car์™€ Phone์ด ๋ชจ๋‘ Locatable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค๋ฉด ๋‘˜ ๋‹ค Locatableํ•œ ๊ฒƒ์„ ๋‹ด๋Š” ๋ฆฌ์ŠคํŠธ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.

List<Locatable> items = new ArrayList<>();

items.add(new Car(...));
items.add(new Phone(...));
items.add(new Car(...));

์ด ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ๋Š” ๋ชจ๋“  ์›์†Œ๊ฐ€ getLocation๊ณผ locationIsValid๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

void printLocation(Locatable item) {
if (item.locationIsValid()) {
print(item.getLocation().asString());
}
}

// ...

items.forEach(printLocation);

Tip 52. ๋‹คํ˜•์„ฑ์€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์ธํ„ฐํŽ˜์ด์Šค์™€ ํ”„๋กœํ† ์ฝœ์€ ์ƒ์† ์—†์ด๋„ ๋‹คํ˜•์„ฑ์„ ๊ฐ€์ ธ๋‹ค์ค€๋‹ค.

์œ„์ž„โ€‹

์ƒ์†์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ ์  ๋” ๋ฉ”์„œ๋“œ๊ฐ€ ๋งŽ์€ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๋„๋ก ์œ ๋„ํ•œ๋‹ค. ๋ถ€๋ชจ ํด๋ž˜์Šค์— ๋ฉ”์„œ๋“œ๊ฐ€ 20๊ฐœ ์žˆ์œผ๋ฉด ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ๊ทธ์ค‘ ๋”ฑ ๋‘ ๊ฐœ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋”๋ผ๋„ ํ•„์š” ์—†๋Š” 18๊ฐœ์˜ ๋ฉ”์„œ๋“œ๊นŒ์ง€ ํ•จ๊ป˜ ๋”ฐ๋ผ์™€์„œ ์ž๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๊ณ  ํ˜ธ์ถœ๋˜๊ธฐ๋งŒ์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ํด๋ž˜์Šค๊ฐ€ ์ž์‹ ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

class Account < PersistenceBaseClass
end

์ด์ œ Account ํด๋ž˜์Šค๋Š” ์˜์†์„ฑ ํด๋ž˜์Šค API๋ฅผ ๋ชจ๋‘ ๋‹ฌ๊ณ  ๋‹ค๋…€์•ผ ํ•œ๋‹ค. ์ด๋Ÿฌ๋Š” ๋Œ€์‹  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์œ„์ด๋ฏˆ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–จ์ง€ ์ƒ๊ฐํ•ด ๋ณด๋ผ.

class Account
def initialize(. . .)
@repo = Persister.for(self)
end

def save
@repo.save()
end
end

์ด์ œ Account ํด๋ž˜์Šค๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํ”„๋ ˆ์ž„์›Œํฌ์˜ API๋ฅผ ์ „ํ˜€ ๋…ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ฒฐํ•ฉ์ด ์‚ฌ๋ผ์ง„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฟ ์•„๋‹ˆ๋ผ ์šฐ๋ฆฌ๋Š” ๋” ์ด์ƒ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ API์— ์ œ์•ฝ์„ ๋ฐ›์ง€ ์•Š๊ณ , ํ•„์š”ํ•œ API๋ฅผ ๋งˆ์Œ๋Œ€๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ฑด๋„ˆ๋›ฐ๊ณ  ์ƒ์†๋ฐ›๋Š” ์˜์†์„ฑ API๋ฅผ ์‚ฌ์šฉํ•  ์œ„ํ—˜์ด ์žˆ์—ˆ๋‹ค. ์ด์ œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ชจ๋“  ๊ฒƒ์„ ์ œ์–ดํ•œ๋‹ค.

Tip 53. ์„œ๋น„์Šค์— ์œ„์ž„ํ•˜๋ผ. Has-A๊ฐ€ Is-A๋ณด๋‹ค ๋‚ซ๋‹ค.

Account๊ฐ€ ์™œ ์˜์†์„ฑ์— ๊ด€ํ•ด ์•Œ์•„์•ผํ•˜๊ฒ ๋Š”๊ฐ€? Account ํด๋ž˜์Šค๋Š” ๊ณ„์ •์— ๊ด€ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์›๋ž˜ ํ•  ์ผ ์•„๋‹Œ๊ฐ€?

class Account
# ๊ณ„์ •์— ๊ด€๋ จ๋œ ์ผ๋งŒ ํ•จ
end

class AccountRecord
# Account๋ฅผ ๊ฐ์‹ธ์„œ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ธฐ๋Šฅ์„ ๋”ํ•จ
end

์ด์ œ๋Š” ์ง„์งœ ๊ฒฐํ•ฉ์ด ์‚ฌ๋ผ์กŒ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์—๋Š” ๊ณ„์‚ฐ์„œ๊ฐ€ ๋ถ™๋Š”๋‹ค. ์ฝ”๋“œ๋ฅผ ๋” ๋งŽ์ด ์จ์•ผ ํ•œ๋‹ค. ๊ทธ์ค‘ ์ผ๋ถ€๋Š” ํ‹€์— ๋ฐ•ํžŒ ์ฝ”๋“œ์ผ ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋งˆ ๋ชจ๋“  ๋ ˆ์ฝ”๋“œ ํด๋ž˜์Šค์— "์ฐพ๊ธฐ" ๋ฉ”์„œ๋“œ๊ฐ€ ํ•„์š”ํ•  ํ…Œ๋‹ˆ ์ผ์ผ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

๋‹คํ–‰ํžˆ๋„ ๋ฏน์Šค์ธ๊ณผ ํŠธ๋ ˆ์ดํŠธ๊ฐ€ ํ•˜๋Š” ์ผ์ด ๋ฐ”๋กœ ์ด๊ฒƒ์ด๋‹ค.

๋ฏน์Šค์ธ, ํŠธ๋ ˆ์ดํŠธ, ์นดํ…Œ๊ณ ๋ฆฌ, ํ”„๋กœํ† ์ฝœ ํ™•์žฅ ๋“ฑโ€‹

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

์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ, ๋ฐ”๋กœ ๊ธฐ์กด์˜ ๊ฒƒ๊ณผ ์ƒˆ๋กœ์šด ๊ฒƒ์˜ ๊ธฐ๋Šฅ ์ง‘ํ•ฉ์„ ํ•ฉ์น˜๋Š” ๊ฒƒ์ด๋‹ค.

์•ž์˜ AccountRecord ์˜ˆ์ œ์—์„œ AccountRecord๊ฐ€ ๊ณ„์ •๊ณผ ์˜์†์„ฑ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ชจ๋‘ ์•Œ์•„์•ผ ํ•œ๋‹ค๊ณ  ํ•˜๊ณ ์„  ๋ฉˆ์ถ”์—ˆ๋‹ค. ์˜์†์„ฑ ๊ณ„์ธต์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฉ”์„œ๋“œ ์ค‘ ๋ฐ”๊นฅ์„ธ์ƒ์— ๋…ธ์ถœํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๋“ค์„ ์ผ์ผ์ด ์œ„์ž„ํ•˜๋Š” ์ผ๋„ ํ•ด์•ผ ํ•œ๋‹ค.

๋ฏน์Šค์ธ์ด ๋Œ€์•ˆ์„ ์ œ์‹œํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์˜์†์„ฑ ๊ณ„์ธต์˜ ์ฐพ๊ธฐ ๋ฉ”์„œ๋“œ ์„ธ ๊ฐ€์ง€ ์ค‘ ๋‘ ๊ฐ€์ง€๋งŒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฏน์Šค์ธ์„ ๋งŒ๋“ ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ๋Ÿฐ ๋‹ค์Œ AccountRecord์— ์ด ๋ฏน์Šค์ธ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Account ๋ง๊ณ  ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ๋„ ์ด ๋ฏน์Šค์ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

mixin CommonFinders {
def find(id) { ... }
def findAll() { ... }
}

class AccountRecord extends BasicRecord with CommonFinders
class OrderRecord extends BasicRecord with CommonFinders

์—ฌ๊ธฐ์„œ ๋” ๋ฐœ์ „์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์šฐ๋ฆฌ ์‹œ์Šคํ…œ์— ๋‚˜์œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ผ์–ด ๋“ค์–ด์˜ค๋Š” ๊ฒƒ์„ ๋ง‰์•„์•ผ ํ•˜๋ฏ€๋กœ ๋‹น์—ฐํžˆ ๋น„์ฆˆ๋‹ˆ์Šค ๊ฐ์ฒด์— ๊ฒ€์ฆ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

class AccountForCustomer extends Account with AccountValidations, AccountCustomerValidations
class AccountForAdmin extends Account with AccountValidations, AccountCustomerValidations

์—ฌ๊ธฐ์„œ๋Š” ๋‘ ํŒŒ์ƒ ํด๋ž˜์Šค ๋ชจ๋‘ ๊ณ„์ • ๊ฐ์ฒด์— ๊ณตํ†ต์œผ๋กœ ์ ์šฉํ•ด์•ผ ํ•  ๊ฒ€์ฆ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค. ๊ณ ๊ฐ์šฉ ํด๋ž˜์Šค์ธ AccountForCustomer๋Š” ๊ณ ๊ฐ์ด ์‚ฌ์šฉํ•˜๋Š” API์— ์ ํ•ฉํ•œ ๊ฒ€์ฆ์„ ์ถ”๊ฐ€๋กœ ํฌํ•จํ•˜๊ณ  ์žˆ๊ณ , ๊ด€๋ฆฌ์ž์šฉ ํด๋ž˜์Šค์ธ AccountForAdmin์€ ์•„๋งˆ ์ œํ•œ์ด ๋” ๋Š์Šจํ•  ๊ด€๋ฆฌ์ž์šฉ ๊ฒ€์ฆ์„ ์ถ”๊ฐ€๋กœ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.
์ด์ œ AccountForCustomer์™€ AccountForAdmin์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ด๋ฆฌ์ €๋ฆฌ ๋„˜๊ธธ๋•Œ ์ž๋™์œผ๋กœ ์ •ํ™•ํ•œ ๊ฒ€์ฆ์„ ์ˆ˜ํ–‰ํ•˜๋ฆฌ๋ผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

Tip 54. ๋ฏน์Šค์ธ์œผ๋กœ ๊ธฐ๋Šฅ์„ ๊ณต์œ ํ•˜๋ผ.

๐Ÿฅ• ์ƒ์†์ด ๋‹ต์ธ ๊ฒฝ์šฐ๋Š” ๋“œ๋ฌผ๋‹คโ€‹

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

๐Ÿญ Topic 32. ์„ค์ •โ€‹

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ถœ์‹œ๋œ ์ดํ›„ ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ๋Š” ๊ฐ’์— ์ฝ”๋“œ๊ฐ€ ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๊ทธ ๊ฐ’์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์™ธ๋ถ€์—์„œ ๊ด€๋ฆฌํ•˜๋ผ. ์—ฌ๋Ÿฌ๋ถ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ์—์„œ ํ˜น์€ ์—ฌ๋Ÿฌ ๊ณ ๊ฐ์„ ์œ„ํ•ด ์‹คํ–‰๋œ๋‹ค๋ฉด ํŠน์ • ํ™˜๊ฒฝ์ด๋‚˜ ํŠน์ • ๊ณ ๊ฐ์—๊ฒŒ ํ•œ์ •๋œ ๊ฐ’์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์™ธ๋ถ€์—์„œ ๊ด€๋ฆฌํ•˜๋ผ. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์—ฌ๋Ÿฌ๋ถ„์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ฝ”๋“œ๊ฐ€ ์ž์‹ ์ด ์‹คํ–‰๋˜๋Š” ํ™˜๊ฒฝ์— ์ ์‘ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

Tip 55. ์™ธ๋ถ€ ์„ค์ •์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ผ.

์ผ๋ฐ˜์ ์œผ๋กœ ์„ค์ • ๋ฐ์ดํ„ฐ ์•ˆ์— ๋„ฃ๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

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

๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚˜์ค‘์— ๋ฐ”๋€Œ๋ฆฌ๋ผ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ, ์†Œ์Šค ์ฝ”๋“œ ๋ณธ์ฒด ๋ฐ”๊นฅ์— ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์ฐพ์•„๋ผ. ๊ทธ๋ฆฌ๊ณ  ์„ค์ • ๋”๋ฏธ์— ๋˜์ ธ ๋„ฃ์–ด๋ผ.

๐Ÿฅ• ์ •์  ์„ค์ •โ€‹

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

์šฐ๋ฆฌ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ์ถ”์ฒœํ•œ๋‹ค. ๋Œ€์‹  ์„ค์ • ์ •๋ณด๋ฅผ (์–‡์€) API ๋’ค๋กœ ์ˆจ๊ฒจ๋ผ. ๊ทธ๋Ÿฌ๋ฉด ์„ค์ •์„ ํ‘œํ˜„ํ•˜๋Š” ์„ธ๋ถ€ ์‚ฌํ•ญ์œผ๋กœ๋ถ€ํ„ฐ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ๋–ผ์–ด ๋†“์„ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿฅ• ์„œ๋น„์Šคํ˜• ์„ค์ •โ€‹

์„ค์ • ์ •๋ณด๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์™ธ๋ถ€์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๋™์ผํ•˜์ง€๋งŒ, ์ผ๋ฐ˜ ํŒŒ์ผ์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ์„œ๋น„์Šค API ๋’ค์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•œ๋‹ค. ์„œ๋น„์Šคํ˜• ์„ค์ •์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์žฅ์ ์ด ์žˆ๋‹ค.

  • ์—ฌ๋Ÿฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„ค์ • ์ •๋ณด๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค์— ๊ฑธ์ณ์„œ ์ „์ฒด ์„ค์ •์„ ํ•œ๋ฒˆ์— ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.
  • ์„ค์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ „์šฉ UI๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์„ค์ • ๋ฐ์ดํ„ฐ๋ฅผ ๋™์ ์œผ๋กœ ๊ณ„์† ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿฅ• ๋„๋„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ๋ง๋ผโ€‹

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