JS๋ก ๋ณด๋ ๊ฐ์ฒด์งํฅ - 2.์์๊ณผ ํฉ์ฑํธ
๐ ๋ณด๋ฆ์นผ๋ผ
๋จ์ ๊ธฐ๋ก๋ณด๋จ ์ข ๋ ์์ง์, ์ ๋ฆฌ๋ ๊ธ์ ์ฐ๊ณ ์ ์์ํ๋ ๋ณด๋ฆ์นผ๋ผ
๋ถ๋ด์์ด ๋งค ๋ณด๋ฆ ํ๋์ ์ฃผ์ ๋ฅผ ๊น๊ฒ ๋ค์ฌ๋ค๋ณผ ์ ์๋ ๊ธฐํ๊ฐ ๋์์ผ๋ฉด ์ข๊ฒ ๋ค.
๊ฐ์ ์ค์ข
์ ๋์ด ์๊ฐ ์ค์ข
์ ์ ํตํด ๊พธ์คํ ์์
์ ๋ด์๋ ๊ฒ๊ณผ ๊ฐ์ด ๋ณด๋ฆ์นผ๋ผ์ ์ ์ด๋ณด์!
๋ณด๋ฆ์นผ๋ผ ๊ท์น
- ๋งค์ผ์ ๊ธฐ๋กํ๋ ์ฑ์ฅ์ผ์ง๋ณด๋ค ์ข๋ ๊น์ ๋ด์ฉ์ ๊ธ์ ์์ฑํ ์ ์๋๋ก ํ์.
- ๋๋ฌด ์์ฌ๋ถ๋ฆฌ์ง๋ง๊ณ ํ๋์ ์ฃผ์ (ํค์๋)์ ์ง์คํ๋ค.
- 2์ฃผ์ ํ ๋ฒ ๋ค๋ฌ์ด์ง ์นผ๋ผ ํํ์ ๊ธ์ ์์ฑํ๋ค.
- ๋ง๊ฐ์ ๋งค์ฃผ ์ผ์์ผ์ ๊ธฐ์ค์ผ๋ก ํ๋ค.
๐ ๊ธ๋ 8๊ธฐ
๊ฐ๋ฐ์๋ค์ด ๋ชจ์ฌ ํจ๊ป ๊ธ์ ์ฐ๊ณ ํผ๋๋ฐฑํ๋ ์ปค๋ฎค๋ํฐ์ธ ๊ธ๋(๊ธ์ฐ๋ ๋๋ผ์ด๊ฐ ์ธ์์ ๋ฐ๊พผ๋ค.)์์
ํ๋ํ๊ฒ ๋์ด ๋ณด๋ฆ์นผ๋ผ์ ๊ท์น์ ๊ธ๋์ ๊ท์น์ ๋ฐ๋ฅด๊ธฐ๋ก ํ๋ค.
2์ฃผ๋ง๋ค ๊ธ์ ์์ฑํ๋ ๊ท์น์ ๋์ผํ๋ฉฐ, ๊ทธ ๋ง๊ฐ ๋ ์ง๋ ์๋์ ๊ฐ๋ค. ๋ง๊ฐ ๋ ์ง๋ฅผ ์ฒดํฌํ๋ฉฐ ๋งค๋ฒ ๊ธ ์์ฑ์ ๋ํด ์ธ์งํ๋๋ก ํ์!
๐ ๋ค์ด๊ฐ๊ธฐ์ ์์โฆ
์ฒ์ ํ๋ก๊ทธ๋๋ฐ์ ๋ฐฐ์ฐ๊ณ ๊ฐ์ฅ ์ดํด๊ฐ ์๋๊ณ ๊ณต๊ฐ๋์ง ์์๋ ๊ฐ๋ฐ์๋ถ๋ค์ ๋ง์ด ์์๋ค. ์ด๋ค ์ค์ฒดํ๋ ํ์ค ์ธ๊ณ์ ๊ฒ์ ์ฝ๋๋ก ๊ตฌํํ๊ณ ํ์ค์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ ๊ฐ๋ฐ์๋ค.
์ ๊ฐ์ ๋ง๋ค์ด์๋ค.
๋น์ฅ ํ๋ฉด์ Hello, Wolrd!
๋ฅผ ์ฐ์ด๋ด๊ณ , ๋ช๋ช ๊ณ์ฐ์ ํธํ๊ฒ ํ๋ ์ ๋์ ๋์๊ฒ ์ ํ ๊ณต๊ฐ์ด ๋์ง ์์๋ค. ์ดํ ๊ณต๋ถ๋ฅผ ํ๋ฉฐ ๊ทธ ๋ง์ ๋ฐ๋ผ๊ฐ๋ค๋ณด๋ ๊ฐ์ฒด์งํฅ
์ ๋๋ฌํ๋ค.
์ฒ์ ์ฑ
๊ฐ์ฒด์งํฅ์ ์ฌ์ค๊ณผ ์คํด
๋ฅผ ์ฝ์์ ๋, ์ฝ๋ค๊ฐ ์ค๊ฐ์ ํฌ๊ธฐํ์๋ค. ๋๋ฌด ์ข์ ์ฑ
์ด๋ผ๊ณ ์ด์ผ๊ธฐ๋ ๋ค์์ง๋ง, ๊ธฐ๋ณธ์ ์ธ ๊ฐ์ฒด์ ๋ํ ๊ฐ๋
์ด ์๋ ์ํ์์
์ฝ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ด์ฉ์ด ๋๋ฌด ์ถ์์ ์ผ๋ก ๋ค๊ฐ์๊ณ ์ฝ์์๋ก ๋ ํท๊ฐ๋ฆฌ๋ ๋๋์ด์๋ค. ๊ทธ๋ ๊ฒ ์๊ฐ์ด ์กฐ๊ธ ๋ ํ๋ฅด๊ณ ์ด๋์ ๋ ์ ์ฐจ์งํฅ์์ ํจ์, ๋ชจ๋์ ๋๋๊ณ ํด๋์ค๋ฅผ
์ฌ์ฉํ๊ธฐ ์์ํ๋ฉด์ ๋ค์ ์ด ์ฑ
์ ํผ์ณ๋ค์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ฑ
์ ์งง์ ๊ฐ๋ฐ์๋ก์์ ์ธ์์์ ๋ด ์ต์ ์์ ์ด ๋์๋ค. ์ ๋ง ์ ๋ง ์ฌ๋ฏธ์๊ฒ ๋ง์น ๋นจ๋ ค๋ค์ด๊ฐ๋ฏ์ด ์ฝ์๊ณ ๋ค ์ฝ๊ณ ๋ ๋ค,
์ ๋ง ํ์ค์ ์๋ ๋ชจ๋ ๊ฑธ ๋ค ์ฝ๋๋ก ๊ตฌํํ ์ ์์ ๊ฒ๋ง ๊ฐ์๋ค.(๋ฌผ๋ก ์ค์ ๋ก ๊ทธ๋ ์ง ์๋ค. ๐คช)
์ฒ์ ๊ฐ์ฒด
๋ผ๋ ๊ฐ๋
์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ธฐ์จ์ ๊ธฐ์ตํ๊ณ ๋์์ ์ด์ ์ฒ์ ๊ฐ์ฒด์งํฅ
์ ๊ถ๊ธ์ฆ์ด ์๊ธฐ์ ๋ถ๋ค์ด ์ฝ๊ฒ ๊ทธ ๋๋(?)์ ๋ฐ์ผ์
จ์ผ๋ฉด ํ๋ ๋ง์์ผ๋ก ์ด ๊ธ์ ์์ฑํ๋ค.
๐ ๊ฐ๋ฏธ ํด๋์ค
์ด์ ํด๋์ค์ธ ๊ฐ๋ฏธ๋ฅผ ๋ค์ ํ๋ฒ ๋ณด์.
class Ant {
constructor(name, age, position) {
this.name = name;
this.age = age;
this.position = position;
}
move() {
if (Math.random() < 0.5) {
this.position--;
} else {
this.position++;
}
}
report() {
console.log(`${this.name} ๊ฐ๋ฏธ์ ์์น๋ ${this.position} ์ง์ ์
๋๋ค.`)
}
}
๊ธฐ์กด Ant class์์ ๋ณธ์ธ์ ์ ๋ณด๋ฅผ ๋ณด๊ณ ํ๋ report()
๋ฉ์๋๋ง ์ถ๊ฐํด์ฃผ์๋ค.
๐ ๊ฒ์๊ฐ๋ฏธ ํด๋์ค(feat. ์์)
Ant class๋ ์ ๋ฐ์ ์ธ ๊ฐ๋ฏธ๋ฅผ ํํํ๋ค. ๊ทธ๋ ์ง๋ง ํ์ค ์ธ๊ณ์ ๊ฐ๋ฏธ๋ ๊ฒ์๊ฐ๋ฏธ๋ ์๊ณ , ํฐ๊ฐ๋ฏธ๋ ์๊ณ , ๋ถ์๊ฐ๋ฏธ ๋ฑ๋ฑ ๋ค์ํ ์ข
์ด ์กด์ฌํ๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ฐ๋ฏธ๋ณด๋ค ์๋์ ์ผ๋ก ๋ ํ์์ ์๋ ๊ฐ์ฒด๋ ์ด๋ป๊ฒ ๊ตฌํํ ์ ์์๊น? ๋จผ์ Ant class๋ฅผ ์์ํ์ฌ ๊ฒ์๊ฐ๋ฏธ class๋ฅผ ๊ตฌํํด๋ณด์.
class BlackAnt extends Ant {
constructor(name, age, position) {
super(name, age, position);
}
sayColor() {
console.log("I'm Black Ant");
}
}
์์ ๊ฐ์ด ์์ํจ์ผ๋ก์จ Ant class์ ์์ฑ(name, age, position)๊ณผ ๋ฉ์๋(move(), report())๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์ค๋ฉด์
BlackAnt๋ง์ด ๊ฐ๋ sayColor()
๋ผ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋์๋ค.
๐ (์ถ๊ฐ)๊ฒ์๊ฐ๋ฏธ ํด๋์ค๋ฅผ ๊ตณ์ด ์์์ผ๋ก ๋ง๋ค ํ์๊ฐ ์์๊น?
์์์ ์ฌ์ฉํ์ฌ ๊ฒ์๊ฐ๋ฏธ ํด๋์ค๋ฅผ ๊ตฌํํด๋ณด์๋ค. ๊ทธ๋ ์ง๋ง ์ฌ๊ธฐ์ ํ๊ฐ์ง ์๋ฌธ์ด ๋ค ์ ์๋ค. ๊ณผ์ฐ ์์ ๊ฒ์๊ฐ๋ฏธ ํด๋์ค๊ฐ ์ ์ ํ ๊น?
sayColor()
๋ผ๋ ๋ฉ์๋๋ ๊ตณ์ด BlackAnt์๋ง ์กด์ฌํด์ผํ๋์ง ๋ค์ ํ๋ฒ ๊ณ ๋ฏผํด๋ณผ ์ ์๋ค. ๊ตณ์ด ์์์ ์ฌ์ฉํ๊ธฐ ์ํจ์ด ์๋๋ผ๋ฉด ์๋์ ๊ฐ์ด ๊ตฌํํ ์ ์๋ค.
class Ant {
constructor(name, age, position, color) {
this.name = name;
this.age = age;
this.position = position;
this.color = color;
}
move() {
if (Math.random() < 0.5) {
this.position--;
} else {
this.position++;
}
}
report() {
console.log(`${this.name} ๊ฐ๋ฏธ์ ์์น๋ ${this.position} ์ง์ ์
๋๋ค.`)
}
sayColor() {
console.log(`I'm ${this.color} Ant!`)
}
}
const blackFirst = new Ant('ark', 3, 0, 'Black');
4๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ๊ฐ๋ฏธ์ ์๊น์ ์ ๋ฌํจ์ผ๋ก์จ ๊ฒ์๊ฐ๋ฏธ ๊ฐ์ฒด๋ฅผ ํํํ ์ ์์๋ค. ์ด์ ๊ฐ์ด ๊ฐ๋ฐ์๋ ์ ๋ต์ด ์์์ ์ ์ ์๋ค. ๋ณธ์ธ์ด ํ์ํ ๋ฐฉ๋ฒ์ผ๋ก ์๊ฐํด์ ์ฝ๋๋ฅผ ์ง๋ฉด ๋๋ค.
๐ ์ฌ์๊ฐ๋ฏธ ํด๋์ค(feat. ํฉ์ฑ, ์์)
๊ทธ๋ ๋ค๋ฉด ์ด์ ์ฌ์๊ฐ๋ฏธ ํด๋์ค๋ฅผ ๊ตฌํํด๋ณด์. ์ฌ์๊ฐ๋ฏธ๋ ์์์ ๊ตฌํํ ๊ฒ์๊ฐ๋ฏธ๋ฅผ ์์๋ฐ์์ ๊ทธ ๊ฐ๋ฏธ๋ฅผ ๋ค๋ฃจ๋๋ก ํ ๊ฒ์ด๋ค.(์ฌ์๊ฐ๋ฏธ๋๊น ์ง์ ์์ง์ด์ง ์์ ๊ฒ์ด๋ค.) (์ฌ์๊ฐ๋ฏธ๋ ๊ฐ๋ฏธ์ด๋ฏ๋ก Ant๋ฅผ ์์ํด์ผ๊ฒ ์ง๋ง ๊ฐ๋จํ๊ฒ ์ค๋ช ํ๊ธฐ ์ํด ๋ ๋ฆฝ์ ์ธ ์ฌ์๊ฐ๋ฏธ(QueenAnt) ํด๋์ค๋ฅผ ๊ตฌํํด๋ณด๊ฒ ๋ค.)
// ์ฌ๊ธฐ์ BlackAnt ํด๋์ค ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์
class QueenAnt {
constructor(workers = []) {
this.workers = workers;
}
makeWorker(name, age, position) {
const worker = new BlackAnt(name, age, position);
this.workers.push(worker);
}
commandMove() {
this.workers.forEach((worker) => worker.move());
}
commandReport() {
this.workers.forEach((worker) => worker.report());
}
}
์ฝ๋ ์์ด ์กฐ๊ธ ๋์ด๋ฌ์ง๋ง, ๊ทธ ์ปจ์
์ ๊ฐ๋จํ๋ค. ์ฌ์๊ฐ๋ฏธ๋ workers
๋ผ๋ ๋ฐฐ์ด๋ก ์ผ๊ฐ๋ฏธ๋ค์ ๊ฐ๊ณ ์๋ค.
๋ํ makeWorker()
์ ํตํด ์ ๋ฌ๋ name, age, position
์ ๊ฐ๋ ๊ฒ์๊ฐ๋ฏธ๋ฅผ ์์ฑํ๊ณ workers
์ ์ถ๊ฐํ๋ค. ๋ฐ๋ก ์ด ๋, BlackAnt
๊ฐ ์์๋ ๊ฒ์ด๋ค.
์ด์ commandMove()
, commandReport()
๋ฉ์๋๋ฅผ ํตํด์ ๊ฐ๊ฐ์ ๊ฐ๋ฏธ๋ค์ด ์ผ์ ํ ์์ง์ด๊ณ ๋ณธ์ธ์ ์ด๋ฆ๊ณผ ์์น๋ฅผ ๋ณด๊ณ ํ๊ฒ ๋๋ค.
๋ง๊ทธ๋๋ก ์์(ํน์ ํฉ์ฑ; composition)์ ํตํด์ QueenAnt๋ ๊ตณ์ด move, report ๋ฑ์ ๋ฉ์๋ ์์ด๋ BlackAnt๋ฅผ ํตํด ํด๋น ๋ฉ์๋๋ฅผ ์ฌ์ฉ(ํ์ฉ)ํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค. ๋ง์ฝ BlackAnt๋ฅผ ์์ํ์ฌ QueenAnt๋ฅผ ๊ตฌํํ๋ค๋ฉด BlackAnt์ ๋ํ ์์กด์ฑ์ด ๋์์ ธ ์์๋ณด๋ค ๋ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์ธ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.(๋ฌผ๋ก ์ด๊ฒ๋ ๋์ ๋ฐ๋ผ์ ๋ค๋ฅด๋ค.)
๐ ๋๋ค๋ฅธ ์ฌ์๊ฐ๋ฏธ ํด๋์ค(feat. ์์กด์ฑ ์ฃผ์ (DI))
์์กด์ฑ ์ฃผ์
(Dependency Injection; DI)๋ ๋ฌด์์ผ๊น? ํน์ ์ด ๋จ์ด์์ ์ด๋๊ฐ ์ด์ํจ์ ๋๊ปด์ง์ง ์๋๊ฐ? ๊ฐ์ฒด์งํฅ์ ๊ฐ ๊ฐ์ฒด๊ฐ์ ์ฑ
์๊ณผ ์ญํ ์ ๋ถ๋ฆฌํ๋ ๊ฒ ์ฆ, ์์กด์ฑ์ ๋ฎ์ถค์ผ๋ก์จ
์ ํ์ ์ ์ง๋ณด์, ๋ฆฌํฉํ ๋ง, ํ
์คํธ ์ฝ๋ ์์ฑ ๋ฑ์์ ์ ๋ฆฌํจ์ ์ป์ ์ ์๋ค. ๊ทธ๋ฐ๋ฐ ์์กด์ฑ์ ์ฃผ์
ํ๋ค
??? ๋์ด๋ด์ผํ ์์กด์ฑ์ ์ฃผ์
ํ๋ค๋ ๊ฒ์ด ์ด์ํ๊ฒ ๋๊ปด์ง ์ ์๋ค.
์ฌ์ค ์์กด์ฑ ์ฃผ์
์ด๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ์๋ ์ธ๋ถ์์ ์ด๋ค ๊ธฐ๋ฅ์ ์ ๊ณต(์ฃผ์
)๋ฐ์์ผ๋ก์จ
๊ฐ ๊ฐ์ฒด์ ์์กด์ฑ์ ๋ฎ์ถ๋ค๋ ์๋ฏธ๊ฐ ์๋ค.
๊ฑฐ๋์ ๋ฏธํ๊ณ ์์ ์ฝ๋์์ ์์กด์ฑ ์ฃผ์
์ ํตํด ๋๋ค๋ฅธ ์ฌ์๊ฐ๋ฏธ ํด๋์ค๋ฅผ ๊ตฌํํด๋ณด์.
// ๋ง์ฐฌ๊ฐ์ง๋ก BlackAnt ํด๋์ค ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์ (ํน์ import)
class QueenAnt {
constructor(Ant, workers = []) {
this.workers = workers;
this.Ant = Ant;
}
makeWorker(name, age, position) {
const worker = new this.Ant(name, age, position);
this.workers.push(worker);
}
commandMove() {
this.workers.forEach((worker) => worker.move());
}
commandReport() {
this.workers.forEach((worker) => worker.report());
}
}
์, ์ด์ ์ด๋ค๊ฐ? ์ด๋ฒ์ QueenAnt ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋, ์ด๋ค Ant
class๋ฅผ ์ธ์๋ก ๋ฐ๋๋ค. ์ฆ, name, age, position์ ์ธ์๋ก ๋ฐ๋
์ด๋ ํ Ant class๋ ์ธ์๋ก ๋ฐ์์ ํ์ฉํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค. ๊ธฐ์กด์ QueenAnt๋ ์ธ์ ๋ BlackAnt๋ผ๋ class๋ง์ ์ฌ์ฉํ์ง๋ง, ์ด๋ฒ์ ๊ตฌํํ
QueenAnt๋ ์์กด์ฑ์ ์ฃผ์
๋ฐ์์ผ๋ก์จ ์ด๋ ํ Ant๋ ๋ฐ์์ ํ์ฉํ ์ ์๊ฒ ๋๋ค. ๋ํ, ์์กด์ฑ ์ฃผ์
์ ํตํด ํ
์คํธ ์ฝ๋๋ฅผ ๋์ฑ๋ ๊ฐ๋จํ๊ฒ ์์ฑํ ์ ์๊ฒ ๋๋ค.
(๋ฌผ๋ก ์์ ์ฝ๋๊ฐ์ ๊ฒฝ์ฐ, class ์์ฒด๋ฅผ ๋๊ฒจ์ฃผ๊ณ ์์ง๋ง ๋ณดํต์ ๊ตฌํํ ๊ฐ์ฒด๋ฅผ ๋๊ฒจ์ ๋ฉ์๋๋ฅผ ํ์ฉํ๋ฏ๋ก mock data ์์
์ ์์ด์๋ ์ ๋ฆฌํด์ง๋ค.)
๐ ๊ธ์ ๋ง์น๋ฉฐโฆ
์ด์ฉ๋ค๋ณด๋ ๊ฐ์ฒด์งํฅ์์ ์์๊ณผ ํฉ์ฑ
์ ๋ํ ๋ด์ฉ์ ๋ค๋ฃจ๊ฒ ๋์๋ค. ๊ธฐ์กด์ ๊ฐ์ฒด์งํฅ 2๋ฒ์งธ ๊ธ์ ๋ญ๊ฐ ๊ฑฐ๋ํ ๊ฐ๋ฏธ ์ํ๊ณ๋ฅผ ๊ตฌํํจ์ผ๋ก์จ ๊ฐ์ฒด๊ฐ์ ํ๋์ ์ฝ๊ฒ ํํํด๋ณด๊ณ ์ถ์๋ค.
๊ทธ๋ฐ๋ฐ ํฐ ์ํ๊ณ๋ฅผ ๊ตฌํํ๋ ค๊ณ ๋ณด๋ ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ผ ์๋ก ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ ํ๋ ฅํ๋ ์ํ๊ณ๋ฅผ ๊ตฌํํ ์ ์๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ํด์ ์ด๋ฒ์ ๊ฐ์ฒด๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ ์ค ์์๊ณผ ํฉ์ฑ์
๋ค๋ค๋ณด๊ฒ ๋์๋ค. ์ฌ์ค ๊ทธ๋์ ๋๋ ์์๊ณผ ์ฃผ์
์ ๋ํด์ ๋์ถฉ ์ฃผ์
์ด ์ข๋ ์์กด์ฑ์ด ๋ฎ๊ณ ์งํฅํด์ผํ๋ค.
๋ง ์์์ง ์ด๋ ๊ฒ ์กฐ๊ธ๋ ๊น๊ฒ(?) ๊ตฌํ๋ ํด๋ณด๋ฉด์ ์์๋ณธ ๊ฑด ์ฒ์์ด๋ค.
๊ฐ์ฒด์งํฅ์ ์ฒ์ ๊ณต๋ถํ์ ๋๋ ๊ทธ๋ ์ง๋ง, ์ ๋ง ์ ๋ง ๋งค๋ ฅ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ธ ๊ฒ ๊ฐ๋ค. ๋ค์์ ์ด๋ค ์ฃผ์ ๋ก ๊ธ์ ์ฐ๊ฒ ๋ ์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง, ๊ฐ์ฒด์งํฅ 3ํธ์ธ ํ๋์ผ๋ก ํ ์ง ํน์ ์ต๊ทผ ๊ด์ฌ์ด ์๊ธด
์น ๋ ๋๋ง์ ํ ์ง ์์ง ๊ณ ๋ฏผ์ค์ด๋ค!
์์ง ๋ง์ด ๋ถ์กฑํ ๊ฐ๋ฐ์์ ๋๋ค. ๋ด์ฉ์ ๋ํ ์ค๋ฅ๊ฐ ์๋ค๋ฉด, ์ธ์ ๋ ํธํ๊ฒ ๋ง์ํด์ฃผ์ธ์! ๊ฐ์ฌํฉ๋๋ค!