๋ฆฌํŒฉํ† ๋ง์— ์žˆ์–ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์™œ ์ค‘์š”ํ• ๊นŒ?

์ž๊ฐ€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ๊ฐ€์น˜

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

๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ์™„์ „ํžˆ ์ž๋™ํ™”ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๊นŒ์ง€ ์Šค์Šค๋กœ ๊ฒ€์‚ฌํ•˜๊ฒŒ ๋งŒ๋“ค์ž.

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

ํ…Œ์ŠคํŠธํ•  ์ƒ˜ํ”Œ ์ฝ”๋“œ

  • ํŠน์ • ์ง€์—ญ์— ๋Œ€ํ•œ ์ƒ์‚ฐ ๊ณ„ํš์ด๋‹ค.
  • ์ˆ˜์š”๋Š” 30, ๊ฐ€๊ฒฉ์€ 20์ด๋‹ค.
  • ์ด ์ƒํ™ฉ์—์„œ ์ƒ์‚ฐ์ž ์ˆ˜๋Š” 3๋ช…์ด๋ฉฐ, ๊ฐ ์ƒ์‚ฐ์ž๊ฐ€ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ŠคํŽ™์ด ์ ํ˜€์žˆ๋‹ค.
  • ์ตœ์ข…์ ์œผ๋กœ ๋ถ€์กฑ๋ถ„๊ณผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ด ์ˆ˜์ต์„ ๊ณ„์‚ฐํ•˜๋Š” ์•ฑ์ด๋‹ค.
  • ์—ฌ๊ธฐ์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ถ€๋ถ„๋งŒ ์ง‘์ค‘ํ•ด์„œ ์ฒ˜๋ฆฌํ•ด๋ณด์ž.
 
function sampleProvinceData() {
    return {
        name: "Asia",
        producers: [
            {name: "Byzantium", cost: 10, production: 9},
            {name: "Attalia", cost: 12, production: 10},
            {name: "Sinope", cost: 10, production: 6},
        ],
        demand: 30,
        price: 20
    };
}
 
class Province {
    constructor(doc) { // json์„ ์ธ์ž๋กœ ๋ฐ›์Œ
        this._name = doc.name;
        this._producers = [];
        this._totalProduction = 0;
        this._demand = doc.demand;
        this._price = doc.price;
        doc.producers.forEach(d => this.addProducer(new Producer(this, d)));
    }
 
    addProducer(arg) {
        this._producers.push(arg);
        this._totalProduction += arg.production;
    }
 
    get name() {
        return this._name;
    }
 
    get producers() {
        return this._producers.slice();
    }
 
    get totalProduction() {
        return this._totalProduction;
    }
 
    set totalProduction(arg) {
        this._totalProduction = arg;
    }
 
    get demand() {
        return this._demand;
    }
 
    set demand(arg) {
        this._demand = parseInt(arg);
    }
     // ์ˆซ์ž๋กœ ๋ณ€ํ™˜
    get price() {
        return this._price;
    }
 
    set price(arg) {
        this._price = parseInt(arg);
    }
     // ์ˆซ์ž๋กœ ๋ณ€ํ™˜
    get shortfall() {
        return this._demand - this.totalProduction;
    }
 
    get profit() {
        return this.demandValue - this.demandCost;
    }
 
    get demandValue() {
        return this.satisfiedDemand * this.price;
    }
 
    get satisfiedDemand() {
        return Math.min(this._demand, this.totalProduction);
    }
 
    get demandCost() {
        let remainingDemand = this.demand;
        let result = 0;
        this.producers
            .sort((a, b) => a.cost - b.cost)
            .forEach(p => {
                const contribution = Math.min(remainingDemand, p.production);
                remainingDemand -= contribution;
                result += contribution * p.cost;
            });
        return result;
    }
 
}
 
class Producer {
    
    constructor(aProvince, data) {
        this._province = aProvince;
        this._cost = data.cost;
        this._name = data.name;
        this._production = data.production || 0;
    }
 
    get name() {
        return this._name;
    }
 
    get cost() {
        return this._cost;
    }
 
    set cost(arg) {
        this._cost = parseInt(arg);
    }
 
    get production() {
        return this._production;
    }
 
    set production(amountStr) {
        const amount = parseInt(amountStr);
        const newProduction = Number.isNaN(amount) ? 0 : amount;
        this._province.totalProduction += newProduction - this._production;
        this._production = newProduction;
    }
}
 

์ฒซ ๋ฒˆ์งธ ํ…Œ์ŠคํŠธ

  • ์ด ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งˆ๋ ฟใ„ดํ•ด์•ผ ํ•œ๋‹ค.
  • ์ด ๊ธ€์„ ์ฝ๋Š” ์‹œ์ ์—๋Š” ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์œผ๋‚˜, ์‚ฌ์šฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค.
  • ์ƒ์‚ฐ ๋ถ€์กฑ๋ถ„์„ ์ œ๋Œ€๋กœ ๊ณ„์‚ฐํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ…Œ์ŠคํŠธ์ด๋‹ค.
describe('province', function () {
    it('shortfall', function () {
        const asia = new Province(sampleProvinceData()); // ํ”ฝ์Šค์ณ ์„ค์ •
        expect(asia.shortfall).equal(5); // ๊ฒ€์ฆ
    });
});
  • ํ”ฝ์Šค์ณ ์„ค์ •์€, ํ…Œ์ŠคํŠธ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์™€ ๊ฐ์ฒด๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
  • ๋‘๋ฒˆ์งธ์—์„œ ์ด๋ฅผ ๊ฒ€์ฆํ•œ๋‹ค.
  • ์ด ๋•Œ, ์„ฑ๊ณต๊ณผ ์‹คํŒจ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ํ•œ๋ฒˆ ํ™•์ธํ•ด๋ณด์ž. ๊ทธ๋ž˜์•ผ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ

ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ํ•˜๊ธฐ

  • ํ…Œ์ŠคํŠธ๋Š” ์œ„ํ—˜ ์š”์ธ์„ ์ค‘์‹ฌ์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.
  • ๋”ฐ๋ผ์„œ ๋‹จ์ˆœํžˆ ํ•„๋“œ๋ฅผ ์ฝ๊ณ  ์“ฐ๊ธฐ๋งŒํ•˜๋Š” ์ ‘๊ทผ์ž๋Š” ํ…Œ์ŠคํŠธํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
  • ์˜คํžˆ๋ ค ํ•„์š”ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ๋†“์น˜์ง€ ๋ง์ž.

์™„๋ฒฝํ•˜๊ฒŒ ๋งŒ๋“œ๋Š๋ผ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๋Š๋‹ˆ, ๋ถˆ์™„์ „ํ•œ ํ…Œ์ŠคํŠธ๋ผ๋„ ์ž‘์„ฑํ•ด ์‹คํ–‰ํ•˜๋Š”๊ฒŒ ๋‚ซ๋‹ค.

  • ์ด๋ฒˆ์—๋Š” ์ด ์ˆ˜์ต์„ ๊ณ„์‚ฐํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด์ž.
describe('province', function () {
    it('shortfall', function () {
        const asia = new Province(sampleProvinceData());
        expect(asia.shortfall).equal(5); 
    });
 
    it('profit', function () {
        const asia = new Province(sampleProvinceData());
        expect(asia.profit).equal(230); 
    });
});
  • ๊ทธ๋Ÿฐ๋ฐ ๋ˆ„๊ตฌ๋Š” ์ด๋ ‡๊ฒŒ ๋œ ์ƒํ™ฉ์„ ๋ณด๊ณ  ์ค‘๋ณต!์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • const asia = new Province(sampleProvinceData()); ์ด ๋ถ€๋ถ„์ด ์ค‘๋ณต๋˜๋‹ˆ๊นŒ ๋ง์ด๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ ๊ทธ๋ ‡๋‹คํ•ด์„œ ์ด๊ฑธ ๊ณต์œ ํ•˜๋„๋ก ํ•ด์„œ๋Š” ์•ˆ๋˜;ใ„ด๋‹ค.
  • ํ…Œ์ŠคํŠธ๋ผ๋ฆฌ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๊ทธ๋Ÿผ์—๋„ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ข€๋” ์Œˆ๋นกํ•˜๊ฒŒ ํ•  ์ˆ˜๋Š” ์—†์„๊นŒ?
describe('province', function () {
    let asia;
    beforeEach(function () {
        asia = new Province(sampleProvinceData());
    });
 
    it('shortfall', function () {
        expect(asia.shortfall).equal(5); 
    });
 
    it('profit', function () {
        expect(asia.profit).equal(230); 
    });
});
  • beforeEach๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
  • ์ด ๊ตฌ๋ฌธ์€ ๊ฐ๊ฐ์˜ ํ…Œ์ŠคํŠธ ๋ฐ”๋กœ ์ „์— ์‹คํ–‰๋˜์–ด asia๋ฅผ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.
  • swift์—์„œ๋Š” setUpWithError()๊ฐ€ ๊ทธ์—ญํ• ์„ ํ•œ๋‹ค.

ํ”ฝ์Šค์ฒ˜ ์ˆ˜์ •ํ•˜๊ธฐ

describe('province', function () {
    let asia;
    beforeEach(function () {
        asia = new Province(sampleProvinceData());
    });
 
    it('shortfall', function () {
        expect(asia.shortfall).equal(5); 
    });
 
    it('profit', function () {
        expect(asia.profit).equal(230); 
    });
 
    it('change production', function () {
        asia.producers[0].production = 20;
        expect(asia.shortfall).equal(-6);
        expect(asia.profit).equal(292);
    });
});
  • change production์—์„œ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
  • ๋‹น์—ฐํžˆ beforeEach์—์„œ ์ˆ˜ํ–‰ํ•˜๋ฉด ์•ˆ๋˜๊ณ , ์Šค์ฝ”ํ”„๋ฅผ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•ด์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๊ตณ์ด ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ์—์„œ ๋‘๊ฐ€์ง€ ์†์„ฑ์„ ๊ฒ€์ฆํ•ด๋„ ๋œ๋‹ค.

๊ฒฝ๊ณ„ ์กฐ๊ฑด ๊ฒ€์‚ฌํ•˜๊ธฐ

  • ์ง€๊ธˆ๊นŒ์ง€๋Š” ๊ฝƒ๊ธธ ํ…Œ์ŠคํŠธ๋งŒ ์ง„ํ–‰ํ–ˆ๋‹ค.
  • ์šฐ๋ฆฌ ์˜๋„๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ์ƒํ™ฉ๋งŒ ๊ฒ€์ฆํ–ˆ๋‹ค๋Š” ๋ง์ด๋‹ค.
  • ์ถ”๊ฐ€์ ์œผ๋กœ ๊ฒฝ๊ณ„ ์ง€์ ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋„ ๊ฒ€์ฆํ•ด์•ผ ํ•œ๋‹ค.
describe('province', function () {
    let asia;
    beforeEach(function () {
        asia = new Province(sampleProvinceData());
    });
 
    it('shortfall', function () {
        expect(asia.shortfall).equal(5); 
    });
 
    it('profit', function () {
        expect(asia.profit).equal(230); 
    });
 
    it('change production', function () {
        asia.producers[0].production = 20;
        expect(asia.shortfall).equal(-6);
        expect(asia.profit).equal(292);
    });
 
    it('zero demand', function () { // ๋น„์—ˆ์„ ๋•Œ๋ฅผ ํ™•์ธํ•œ๋‹ค.
        asia.demand = 0;
        expect(asia.shortfall).equal(-25);
        expect(asia.profit).equal(0);
    });
 
    it('negative demand', function () { // ์ˆ˜์š”๊ฐ€ ์Œ์ˆ˜๋ผ๋ฉด?
        asia.demand = -1;
        expect(asia.shortfall).equal(-26);
        expect(asia.profit).equal(-10);
    });
});
  • ์ˆ˜์š”๊ฐ€ ๋งˆ์ด๋„ˆ์Šค์ธ ๊ฒฝ์šฐ ๋ญ”๊ฐ€ ์ด์ƒํ•˜๋‹ค.
  • ์ˆ˜์ต์ด ์Œ์ˆ˜๋กœ ๋‚˜์˜ค๋Š” ๊ฒƒ์ด ๋ง์ด๋˜๋‚˜?
  • ์ด๋Ÿฐ ๊ฒฝ์šฐ 0์œผ๋กœ ๊ณ ์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒฝ๊ณ„ ์กฐ๊ฑด์„ ์ƒ๊ฐํ•ด๋ณด๊ณ  ๊ทธ ๋ถ€๋ถ„์„ ์ง‘์ค‘์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜์ž.

describe('province', function () {
    let asia;
    beforeEach(function () {
        asia = new Province(sampleProvinceData());
    });
 
    it('shortfall', function () {
        expect(asia.shortfall).equal(5); 
    });
 
    it('profit', function () {
        expect(asia.profit).equal(230); 
    });
 
    it('change production', function () {
        asia.producers[0].production = 20;
        expect(asia.shortfall).equal(-6);
        expect(asia.profit).equal(292);
    });
 
    it('zero demand', function () { // ๋น„์—ˆ์„ ๋•Œ๋ฅผ ํ™•์ธํ•œ๋‹ค.
        asia.demand = 0;
        expect(asia.shortfall).equal(-25);
        expect(asia.profit).equal(0);
    });
 
    it('negative demand', function () { // ์ˆ˜์š”๊ฐ€ ์Œ์ˆ˜๋ผ๋ฉด?
        asia.demand = -1;
        expect(asia.shortfall).equal(-26);
        expect(asia.profit).equal(-10);
    });
 
    it('empty string demand', function () { // ์ˆ˜์š”๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด?
        asia.demand = "";
        expect(asia.shortfall).NaN;
        expect(asia.profit).NaN;
    });
});
 
describe('string for producers', function () { // ์ƒ์‚ฐ์ž ์ˆ˜ ํ•„๋“œ์— ๋ฌธ์ž์—ด์„ ๋Œ€์ž…
    it('', function () {
        const data = {
            name: "String producers",
            producers: "",
            demand: 30,
            price: 20
        };
        const prov = new Province(data);
        expect(prov.shortfall).equal(0);
    });
});
  • ์ƒ์‚ฐ์ž ์ˆ˜ ํ•„๋“œ์— ๋ฌธ์ž์—ด์„ ๋Œ€์ž…ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
  • ์›๋ž˜๋Š” ์ƒ์‚ฐ์ž์— ๋Œ€ํ•œ ์ •๋ณด๋“ค์ด ๋“ค์–ด๊ฐ”์„ ๊ฒƒ์ด๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  forEach๋ฅผ ํ†ตํ•ด ๊ฒฐ๊ณผ๊ฐ’์„ ๋งŒ๋“ค์—ˆ์—ˆ๋‹ค.
  • ๋‹น์—ฐํžˆ ๋นˆ ์ŠคํŠธ๋ง์ด๋‹ˆ forEach๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š์•„ ์—๋Ÿฌ๋ฅผ ๋„์šด๋‹ค.
9 passing (12ms)
1 failing

1) string for producers :
    TypeError: doc.producers.forEach is not a function
  • ์ด๋ ‡๊ฒŒ ๊ฒฝ๊ณ„์—์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒฝ์šฐ๋ฅผ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•œ๋‹ค.

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

  • ๊ทธ๋ ‡๋‹ค๊ณ  ๋„ˆ๋ฌด๋‚˜ ์„ธ์„ธํ•œ ํ…Œ์ŠคํŠธ๊นŒ์ง€ ํ•˜๊ธฐ๋Š” ๋ฒ„๊ฒ๋‹ค.
  • ์ˆ˜ํ™• ์ฒด๊ฐ ๋ฒ•์น™์ด ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ์—์„œ ์ฒ˜๋ฆฌ ๊ณผ์ •์ด ๋ณต์žกํ•œ ๋ถ€๋ถ„๋ถ€ํ„ฐ ์ฒ˜๋ฆฌํ•˜์ž.
  • ์ฆ‰, ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ •ํ•ด์„œ ์ฒ˜๋ฆฌํ•ด๋ผ.

๋๋‚˜์ง€ ์•Š์€ ์—ฌ์ •

  • ์ง€๊ธˆํ•œ ๊ฑด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์ด๋‹ค.
  • ์ž๊ฐ€ ํ…Œ์ŠคํŠธ ์‹œ์Šคํ…œ์˜ ๋Œ€๋ถ€๋ถ„์€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ์ฐจ์ง€ํ•œ๋‹ค.
  • ํ…Œ์ŠคํŠธ๋„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค. ํ•œ๋ฒˆ์— ์™„๋ฒฝํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฐ–์ถœ ์ˆœ ์—†๋‹ค.
  • ํ…Œ์ŠคํŠธ๊ฐ€ ์ถฉ๋ถ„ํ•œ์ง€๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” ๊ธฐ์ค€์€ ์ฃผ๊ด€์ ์ด๋‹ค.

๋ฒ„๊ทธ ๋ฆฌํฌํŠธ๋ฅผ ๋ฐ›์œผ๋ฉด ๊ทธ ๋ฒ„๊ทธ๋ฅผ ๋“œ๋Ÿฌ๋‚ด๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ๋ถ€ํ„ฐ ์ž‘์„ฑํ•˜์ž.

Reference