[Book] Refactoring: 7 ์บก์ํ
๋ฆฌํฉํฐ๋ง
์ถ์ฒ: ๋ฆฌํฉํฐ๋ง 2ํ, ๋งํด ํ์ธ๋ฌ
07 ์บก์ํ
7.1 ๋ ์ฝ๋ ์บก์ํํ๊ธฐ
- 1ํ์์์ ์ด๋ฆ: ๋ ์ฝ๋๋ฅผ ๋ฐ์ดํฐ ํด๋์ค๋ก ์ ํ
organization = { name: "์ ํฌ๋ฏธ ๊ตฌ์ค๋ฒ ๋ฆฌ", country: "GB" };
class Organization {
constructor(data) {
this._name = data.name;
this._country = data.country;
}
get name() {
return this._name;
}
set name(arg) {
this._name = arg;
}
get country() {
return this._country;
}
set country(arg) {
this._country = arg;
}
}
๋ฐฐ๊ฒฝ
๋ ์ฝ๋๋ ์ฐ๊ด๋ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฅผ ์ง๊ด์ ์ธ ๋ฐฉ์์ผ๋ก ๋ฌถ์ ์ ์์ด์ ๊ฐ๊ฐ์ ๋ฐ๋ก ์ทจ๊ธํ ๋๋ณด๋ค ํจ์ฌ ์๋ฏธ ์๋ ๋จ์๋ก ์ ๋ฌํ ์ ์๊ฒ ํด์ค๋ค. ๋ ์ฝ๋๋ ๋จ์ ์ด ์๋ค. ๊ณ์ฐํด์ ์ป์ ์ ์๋ ๊ฐ๊ณผ ๊ทธ๋ ์ง ์์ ๊ฐ์ ๋ช ํํ ๊ตฌ๋ถํด ์ ์ฅํด์ผ ํ๋ ์ ์ด ๋ฒ๊ฑฐ๋กญ๋ค. ์ด ๋๋ฌธ์ ๊ฐ๋ณ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ฉ๋๋ก๋ ๋ ์ฝ๋๋ณด๋ค ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ค.
์ ์ฐจ
- ๋ ์ฝ๋๋ฅผ ๋ด์ ๋ณ์๋ฅผ ์บก์ํํ๋ค.
- ๋ ์ฝ๋๋ฅผ ๊ฐ์ผ ๋จ์ํ ํด๋์ค๋ก ํด๋น ๋ณ์์ ๋ด์ฉ์ ๊ต์ฒดํ๋ค. ์ด ํด๋์ค์ ์๋ณธ ๋ ์ฝ๋๋ฅผ ๋ฐํํ๋ ์ ๊ทผ์๋ ์ ์ํ๊ณ , ๋ณ์๋ฅผ ์บก์ํํ๋ ํจ์๋ค์ด ์ด์ ๊ทผ์๋ฅผ ์ฌ์ฉํ๋๋ก ์์ ํ๋ค.
- ํ ์คํธํ๋ค.
- ์๋ณธ ๋ ์ฝ๋ ๋์ ์๋ก ์ ์ํ ํด๋์ค ํ์ ์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํจ์๋ค์ ์๋ก ๋ง๋ ๋ค.
- ๋ ์ฝ๋๋ฅผ ๋ฐํํ๋ ์์ ํจ์๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ 4์์ ๋ง๋ ์ ํจ์๋ฅผ ์ฌ์ฉํ๋๋ก ๋ฐ๊พผ๋ค. ํ๋์ ์ ๊ทผํ ๋๋ ๊ฐ์ฒด์ ์ ๊ทผ์๋ฅผ ์ฌ์ฉํ๋ค. ์ ์ ํ ์ ๊ทผ์๊ฐ ์๋ค๋ฉด ์ถ๊ฐํ๋ค. ํ ๋ถ๋ถ์ ๋ฐ๊ฟ ๋๋ง๋ค ํ ์คํธํ๋ค.
- ํด๋์ค์์ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ ์ ๊ทผ์์ ์๋ณธ ๋ ์ฝ๋๋ฅผ ๋ฐํํ๋ ํจ์๋ค์ ์ ๊ฑฐํ๋ค.
- ํ ์คํธํ๋ค.
- ๋ ์ฝ๋์ ํ๋๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ธ ์ค์ฒฉ ๊ตฌ์กฐ๋ผ๋ฉด ๋ ์ฝ๋ ์บก์ํํ๊ธฐ์ ์ปฌ๋ ์ ์บก์ํํ๊ธฐ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ ์ฉํ๋ค.
7.2 ์ปฌ๋ ์ ์บก์ํํ๊ธฐ
class Person {
get courses() {
return this._courses;
}
set courses(aList) {
this._courses = aList;
}
}
class Person {
get courses() {return this._courses.slice();}
addCourse(aCourse) {...}
removeCourse(aCourse) {...}
}
๋ฐฐ๊ฒฝ
์ปฌ๋ ์ ์ ๋ค๋ฃฐ ๋ ์ปฌ๋ ์ ์ ๊ฐ์ผ ํด๋์ค์ add()์ remove()๋ผ๋ ์ด๋ฆ์ ์ปฌ๋ ์ ๋ณ๊ฒฝ์ ๋ฉ์๋๋ฅผ ๋ง๋ ๋ค. ์ด๋ ๊ฒ ํญ์ ์ปฌ๋ ์ ์ ์์ ํ ํด๋์ค๋ฅผ ํตํด์๋ง ์์๋ฅผ ๋ณ๊ฒฝํ๋๋ก ํ๋ฉด ํ๋ก๊ทธ๋จ์ ๊ฐ์ ํ๋ฉด์ ์ปฌ๋ ์ ๋ณ๊ฒฝ ๋ฐฉ์๋ ์ํ๋ ๋๋ก ์์ ํ ์ ์๋ค.
์ ์ฐจ
- ์์ง ์ปฌ๋ ์ ์ ์บก์ํํ์ง ์์๋ค๋ฉด ๋ณ์ ์บก์ํํ๊ธฐ๋ถํฐ ํ๋ค.
- ์ปฌ๋ ์ ์ ์์๋ฅผ ์ถ๊ฐ/์ ๊ฑฐํ๋ ํจ์๋ฅผ ์ถ๊ฐํ๋ค.
- ์ ์ ๊ฒ์ฌ๋ฅผ ์ํํ๋ค.
- ์ปฌ๋ ์ ์ ์ฐธ์กฐํ๋ ๋ถ๋ถ์ ๋ชจ๋ ์ฐพ๋๋ค. ์ปฌ๋ ์ ์ ๋ณ๊ฒฝ์๋ฅผ ํธ์ถํ๋ ์ฝ๋๊ฐ ๋ชจ๋ ์์์ ์ถ๊ฐํ ์ถ๊ฐ/์ ๊ฑฐ ํจ์๋ฅผ ํธ์ถํ๋๋ก ์์ ํ๋ค. ํ๋์ฉ ์์ ํ ๋๋ง๋ค ํ ์คํธํ๋ค.
- ์ปฌ๋ ์ ๊ฒํฐ๋ฅผ ์์ ํด์ ์๋ณธ ๋ด์ฉ์ ์์ ํ ์ ์๋ ์ฝ๊ธฐ์ ์ฉ ํ๋ฝ์๋ ๋ณต์ ๋ณธ์ ๋ฐํํ๊ฒ ํ๋ค.
- ํ ์คํธํ๋ค.
7.3 ๊ธฐ๋ณธํ์ ๊ฐ์ฒด๋ก ๋ฐ๊พธ๊ธฐ
Replace Primitive with Object
- 1ํ์์์ ์ด๋ฆ
- ๋ฐ์ดํฐ ๊ฐ์ ๊ฐ์ฒด๋ก ์ ํ
- ๋ถ๋ฅ ๋ถํธ๋ฅผ ํด๋์ค๋ก ์ ํ
// before
orders.filter((o) => "high" === o.priority || "rush" === o.priority);
// after
orders.filter((o) => o.priority.higherThan(new Priority("normal")));
๋ฐฐ๊ฒฝ
๊ฐ๋จํ๋ ์ ๋ณด๋ค์ด ๋ณต์กํ๊ฒ ๋ณํ ๋, ๊ทธ ๋ฐ์ดํฐ๋ฅผ ํํํ๋ ์ ์ฉ ํด๋์ค๋ฅผ ์ ์ํ๋ค.
์ ์ฐจ
- ์์ง ๋ณ์๋ฅผ ์บก์๋กํํ์ง ์์๋ค๋ฉด ์บก์ํํ๋ค.
- ๋จ์ํ ๊ฐ ํด๋์ค๋ฅผ ๋ง๋ ๋ค. ์์ฑ์๋ ๊ธฐ์กด ๊ฐ์ ์ธ์๋ก ๋ฐ์์ ์ ์ฅํ๊ณ , ์ด ๊ฐ์ ๋ฐํํ๋ ๊ฒํฐ๋ฅผ ์ถ๊ฐํ๋ค.
- ์ ์ ๊ฒ์ฌ๋ฅผ ์ํํ๋ค.
- ๊ฐ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์๋ก ๋ง๋ค์ด์ ํ๋์ ์ ์ฅํ๋๋ก ์ธํฐ๋ฅผ ์์ ํ๋ค. ์ด๋ฏธ ์๋ค๋ฉด ํ๋์ ํ์ ์ ์ ์ ํ ๋ณ๊ฒฝํ๋ค.
- ์๋ก ๋ง๋ ํด๋์ค์ ๊ฒํฐ๋ฅผ ํธ์ถํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋๋ก ๊ฒํฐ๋ฅผ ์์ ํ๋ค.
- ํ ์คํธํ๋ค.
- ํจ์ ์ด๋ฆ์ ๋ฐ๊พธ๋ฉด ์๋ณธ ์ ๊ทผ์์ ๋์์ ๋ ์ ๋๋ฌ๋ผ ์ ์๋์ง ๊ฒํ ํ๋ค.
7.4 ์์ ๋ณ์๋ฅผ ์ง์ ํจ์๋ก ๋ฐ๊พธ๊ธฐ
Replace Temp with Query
// before
const basePrice = this._quantity * this._itemPrice;
if (basePrice > 1000) {
return basePrice * 0.95;
} else {
return basePrice * 0.98;
}
// after
get basePrice() {this._quantity * this._itemPrice;}
//...
if (this.basePrice > 1000) {
return this.basePrice * 0.95;
} else {
return this.basePrice * 0.98;
}
๋ฐฐ๊ฒฝ
์์ ๋ณ์๊ฐ ์ ์ฉํ์ง๋ง ์์ ํจ์๋ก ๋ง๋ค์ด ์ฌ์ฉํ๋ ํธ์ด ๋์ ๋๊ฐ ๋ง๋ค. ๋น์ทํ ๊ณ์ฐ์ ์ํํ๋ ๋ค๋ฅธ ํจ์์์๋ ์ฌ์ฉํ ์ ์๋ค ์ฝ๋ ์ค๋ณต์ด ์ค์ด๋ ๋ค.
์ ์ฐจ
- ๋ณ์๊ฐ ์ฌ์ฉ๋๊ธฐ ์ ์ ๊ฐ์ด ํ์คํ ๊ฒฐ์ ๋๋์ง, ๋ณ์๋ฅผ ์ฌ์ฉํ ๋๋ง๋ค ๊ณ์ฐ ๋ก์ง์ด ๋งค๋ฒ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ด์ง๋ ์๋์ง ํ์ธํ๋ค.
- ์ฝ๊ธฐ์ ์ฉ์ผ๋ก ๋ง๋ค ์ ์๋ ๋ณ์๋ ์ฝ๊ธฐ์ ์ฉ์ผ๋ก ๋ง๋ ๋ค.
- ํ ์คํธํ๋ค.
- ๋ณ์ ๋์ ๋ฌธ์ ํจ์๋ก ์ถ์ถํ๋ค.
- ํ ์คํธํ๋ค.
- ๋ณ์ ์ธ๋ผ์ธํ๊ธฐ๋ก ์์ ๋ณ์๋ฅผ ์ ๊ฑฐํ๋ค.
7.5 ํด๋์ค ์ถ์ถํ๊ธฐ
Extract Class
- ๋ฐ๋ ๋ฆฌํฉํฐ๋ง: ํด๋์ค ์ธ๋ผ์ธํ๊ธฐ
// before
class Person {
get officeAreaCode() {
return this._officeAreaCode;
}
get offceNumber() {
return this._officeNumber;
}
}
// after
class Person {
get officeAreaCode() {
return this._telephoneNumber.areaCode;
}
get officeNumber() {
return this._telephoneNumber.number;
}
}
class TelephoneNumber {
get areaCode() {
return this._areaCode;
}
get number() {
return this._number;
}
}
๋ฐฐ๊ฒฝ
ํด๋์ค๋ ๋ฐ๋์ ๋ช ํํ๊ฒ ์ถ์ํํ๊ณ ์์์ ์ฃผ์ด์ง ์ญํ ๋ง ์ฒ๋ฆฌํด์ผ ํ๋ค. ๋ฉ์๋์ ๋ฐ์ดํฐ๊ฐ ๋๋ฌด ๋ง์ ํด๋์ค๋ ์ดํดํ๊ธฐ ์ฝ์ง ์์ผ๋ ์ ์ดํด๋ณด๊ณ ์ ์ ํ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ข๋ค.
์ ์ฐจ
- ํด๋์ค์ ์ญํ ์ ๋ถ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ํ๋ค.
- ๋ถ๋ฆฌ๋ ์ญํ ์ ๋ด๋นํ ํด๋์ค๋ฅผ ์๋ก ๋ง๋ ๋ค.
- ์๋ ํด๋์ค์ ์์ฑ์์์ ์๋ก์ด ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ ํ๋์ ์ ์ฅํด๋๋ค.
- ๋ถ๋ฆฌ๋ ์ญํ ์ ํ์ํ ํ๋๋ค์ ์ ํด๋์ค๋ก ์ฎ๊ธด๋ค. ํ๋์ฉ ์ฎ๊ธธ ๋๋ง๋ค ํ ์คํธํ๋ค.
- ๋ฉ์๋๋ค๋ ์ ํด๋์ค๋ก ์ฎ๊ธด๋ค. ์ด๋ ์ ์์ค ๋ฉ์๋, ์ฆ ๋ค๋ฅธ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ๋ณด๋ค๋ ํธ์ถ์ ๋นํ๋ ์ผ์ด ๋ง์ ๋ฉ์๋๋ถํฐ ์ฎ๊ธด๋ค. ํ๋์ฉ ์ฎ๊ธธ๋๋ง๋ค ํ ์คํธํ๋ค.
- ์์ชฝ ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ ์ดํด๋ณด๋ฉด์ ๋ถํ์ํ ๋ฉ์๋๋ฅผ ์ ๊ฑฐํ๊ณ , ์ด๋ฆ๋ ์๋ก์ด ํ๊ฒฝ์ ๋ง๊ฒ ๋ฐ๊พผ๋ค.
- ์ ํด๋์ค๋ฅผ ์ธ๋ถ๋ก ๋ ธ์ถํ ์ง ์ ํ๋ค. ๋ ธ์ถํ๋ ค๊ฑฐ๋ ์ ํด๋์ค์ ์ฐธ์กฐ๋ฅผ ๊ฐ์ผ๋ก ๋ฐ๊พธ๊ธฐ๋ฅผ ์ ์ฉํ ์ง ๊ณ ๋ฏผํด๋ณธ๋ค.
7.6 ํด๋์ค ์ธ๋ผ์ธํ๊ธฐ
Inline Class
- ๋ฐ๋ ๋ฆฌํฉํฐ๋ง: ํด๋์ค ์ถ์ถํ๊ธฐ
// before
class Person {
get officeAreaCode() {
return this._telephoneNumber.areaCode;
}
get officeNumber() {
return this._telephoneNumber.number;
}
}
class TelephoneNumber {
get areaCode() {
return this._areaCode;
}
get number() {
return this._number;
}
}
// after
class Person {
get officeAreaCode() {
return this._officeAreaCode;
}
get officeNumber() {
return this._officeNumber;
}
}
๋ฐฐ๊ฒฝ
ํด๋์ค ์ธ๋ผ์ธํ๊ธฐ๋ ํด๋์ค ์ถ์ถํ๊ธฐ๋ฅผ ๊ฑฐ๊พธ๋ก ๋๋ฆฌ๋ ๋ฆฌํฉํฐ๋ง์ด๋ค. ๋ ์ด์ ์ ์ญํ ์ ๋ชป ํด์ ๊ทธ๋๋ก ๋๋ฉด ์ ๋๋ ํด๋์ค๋ฅผ ์ธ๋ผ์ธ ํ๋ค. ๋ ํด๋์ค์ ๊ธฐ๋ฅ์ ์ง๊ธ๊ณผ ๋ค๋ฅด๊ฒ ๋ฐฐ๋ถํ๊ณ ์ถ์ ๋๋ก ํด๋์ค๋ฅผ ์ธ๋ผ์ธํ๋ค. ํ๋๋ก ํฉ์น ๋ค์ ์๋ก์ด ํด๋์ค๋ฅผ ์ถ์ถํ๋ ๊ฒ ์ฌ์ธ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ ์ฐจ
- ์์ค ํด๋์ค์ ๊ฐ public ๋ฉ์๋์ ๋์ํ๋ ๋ฉ์๋๋ค์ ํ๊น ํด๋์ค์ ์์ฑํ๋ค. ์ด ๋ฉ์๋๋ค์ ๋จ ์ํ ์์ ์ ์์ค ํด๋์ค๋ก ์์ํด์ผ ํ๋ค.
- ์์ค ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ๋ชจ๋ ํ๊น ํด๋์ค์ ์์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋๋ก ๋ฐ๊พผ๋ค. ํ๋์ฉ ๋ฐ๊ฟ ๋๋ง๋ค ํ ์คํธํ๋ค.
- ์์ค ํด๋์ค์ ๋ฉ์๋์ ํ๋๋ฅผ ๋ชจ๋ ํ๊น ํด๋์ค๋ก ์ฎ๊ธด๋ค. ํ๋์ฉ ์ฎ๊ธธ ๋๋ง๋ค ํ ์คํธํ๋ค.
- ์์ค ํด๋์ค๋ฅผ ์ญ์ ํ๊ณ ์กฐ์๋ฅผ ํํ๋ค.
7.7 ์์ ์จ๊ธฐ๊ธฐ
Hide Delegate
- ๋ฐ๋ ๋ฆฌํฉํฐ๋ง: ์ค๊ฐ์ ์ ๊ฑฐํ๊ธฐ
//before
manager = aPerson.department.manager;
// after
manager = aPerson.manager;
class Person {
get manager() {
return this.department.manager;
}
}
๋ฐฐ๊ฒฝ
๋ชจ๋ํ ์ค๊ณ๋ฅผ ์ ๋๋ก ํ๋ ํต์ฌ์ ์บก์ํ๋ค. ๊ฐ์ฒด ์งํฅ์ ์ฒ์ ๋ฐฐ์ธ ๋๋ ์บก์ํํ ํ๋๋ฅผ ์จ๊ธฐ๋ ๊ฒ์ด๋ผ๊ณ ๋ฐฐ์ด๋ค. ๊ทธ๋ฌ๋ค ๊ฒฝํ์ด ์์ด๋ฉด์ ์บก์ํ์ ์ญํ ์ด ๊ทธ๋ณด๋ค ๋ง๋ค๋ ์ฌ์ค์ ๊นจ๋ซ๋๋ค.
์ ์ฐจ
- ์์ ๊ฐ์ฒด์ ๊ฐ ๋ฉ์๋์ ํด๋นํ๋ ์์ ๋ฉ์๋๋ฅผ ์๋ฒ์ ์์ฑํ๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์์ ๊ฐ์ฒด ๋์ ์๋ฒ๋ฅผ ํธ์ถํ๋๋ก ์์ ํ๋ค. ํ๋์ฉ ๋ฐ๊ฟ ๋๋ง๋ค ํ ์คํธํ๋ค.
- ๋ชจ๋ ์์ ํ๋ค๋ฉด, ์๋ฒ๋ก๋ถํฐ ์์ ๊ฐ์ฒด๋ฅผ ์ป๋ ์ ๊ทผ์๋ฅผ ์ ๊ฑฐํ๋ค.
- ํ ์คํธํ๋ค.
7.8 ์ค๊ฐ์ ์ ๊ฑฐํ๊ธฐ
Remove Middle Man
- ๋ฐ๋ ๋ฆฌํฉํฐ๋ง: ์์ ์จ๊ธฐ๊ธฐ
// before
manager = aPerson.manager;
class Person {
get manager() {
return this.department.manager;
}
}
// after
manager = aPerson.department.manager;
๋ฐฐ๊ฒฝ
์์ ์จ๊ธฐ๊ธฐ๋ฅผ ํ๋ค ๋ณด๋ฉด ๋จ์ํ ์ ๋ฌ๋ง ํ๋ ์์ ๋ฉ์๋๋ค์ด ์ ์ ์ฑ๊ฐ์ ์ง๋ค. ๊ทธ๋ฌ๋ฉด ์๋ฒ ํด๋์ค๋ ๊ทธ์ ์คใฑ๊ฐ์ ์ญํ๋ก์ ๋ฝํ์ฌ, ์ฐจ๋ผ๋ฆฌ ํด๋ผ์ด์ธํธ๊ฐ ์์ ๊ฐ์ฒด๋ฅผ ์ง์ ํธ์ถํ๋ ๊ฒ ๋์ ์ ์๋ค.
์ ์ฐจ
- ์์ ๊ฐ์ฒด๋ฅผ ์ป๋ ๊ฒํฐ๋ฅผ ๋ง๋ ๋ค.
- ์์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ชจ๋ ์ด ๊ฒํฐ๋ฅผ ๊ฑฐ์น๋๋ก ์์ ํ๋ค. ํ๋์ฉ ๋ฐ๊ฟ ๋๋ง๋ค ํ ์คํธํ๋ค.
- ๋ชจ๋ ์์ ํ๋ค๋ฉด ์์ ๋ฉ์๋๋ฅผ ์ญ์ ํ๋ค.
7.9 ์๊ณ ๋ฆฌ์ฆ ๊ต์ฒดํ๊ธฐ
Substitute Algorithm
//before
function foundPerson(people) {
for (let i = 0; i < people.length; i++) {
if (people[i] === "Don") {
return "Don";
}
if (people[i] === "John") {
return "John";
}
if (people[i] === "Kent") {
return "Kent";
}
}
return "";
}
//after
function foundPerson(people) {
const candidates = ["Don", "John", "Kent"];
return people.find((p) => candidates.includes(p)) || "";
}
๋ฐฐ๊ฒฝ
๋ ๊ฐ๋ช ํ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ณ ์น๋ค.
์ ์ฐจ
- ๊ต์ฒดํ ์ฝ๋๋ฅผ ํจ์ ํ๋์ ๋ชจ์๋ค.
- ์ด ํจ์๋ง์ ์ด์ฉํด ๋์์ ๊ฒ์ฆํ๋ ํ ์คํธ๋ฅผ ๋ง๋ จํ๋ค.
- ๋์ฒดํ ์๊ณ ๋ฆฌ์ฆ์ ์ค๋นํ๋ค.
- ์ ์ ๊ฒ์ฌ๋ฅผ ์ํํ๋ค.
- ๊ธฐ์กด ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํ๋ ํ ์คํธ๋ฅผ ์ํํ๋ค. ๋ ๊ฒฐ๊ณผ๊ฐ ๊ฐ๋ค๋ฉด ๋ฆฌํฉํฐ๋ง์ด ๋๋๋ค. ๊ทธ๋ ์ง ์๋ค๋ฉด ๊ธฐ์กด ์๊ณ ๋ฆฌ์ฆ์ ์ฐธ๊ณ ํด์ ์ ์๊ณ ๋ฆฌ์ฆ์ ํ ์คํธํ๊ณ ๋๋ฒ๊น ํ๋ค.