C# listviewitem add ์†๋„ ๊ด€๋ จ!!

์•ˆ๋…•ํ•˜์„ธ์š”. ๊ทธ๊ฐ„ ๋ช‡๊ฐ€์ง€์˜ ์งˆ๋ฌธ์„ ์˜ฌ๋ฆฌ๊ณ ์‹ถ์—ˆ์ง€๋งŒ, ํ•˜๋ฃจ๋งŒ ๋” ํ•˜๋ฃจ๋งŒ ๋” ์ฐพ์•„๋ณด๊ณ  ๋ฐ˜๋ณตํ•ด์„œ ํ•ด๊ฒฐ์„ ํ•ด์™”์Šต๋‹ˆ๋‹ค. ์งˆ๋ฌธ์„ ์˜ฌ๋ฆฌ๊ธฐ๊ฐ€ ๋ญ”๊ฐ€ ์กฐ์‹ฌ์Šค๋Ÿฝ๋„ค์š”โ€ฆ!

์˜ค๋Š˜ ์—ฌ์ญค๋ณด๊ณ ์ž ๊ฐ์žก๊ณ  ๊ธ€์„ ์“ฐ๋Š” ์งˆ๋ฌธ์€ ์ œ ์‹ค๋ ฅ์œผ๋กœ๋Š” ๋„์ €ํžˆ ๊ฐ€๋Šฅํ•œ์ง€, ๋ถˆ๊ฐ€๋Šฅํ•œ์ง€ ํŒ๋‹จ์กฐ์ฐจ ์„œ์ง€ ์•Š์•„ ์šฐ์„ ์€ ๊ฐ€๋ณ๊ฒŒโ€ฆ ๊ฐ€๋Šฅ์—ฌ๋ถ€๋ฅผ ์ข€ ์—ฌ์ญˆ์–ด๋ณด๊ณ  ์‹ถ์–ด์„œ์ž…๋‹ˆ๋‹ค.

์ผ๋‹จ์€ ํ”„๋กœ๊ทธ๋žจ์ด ์กฐ๊ธˆ ๋‚œ์žกํ•œ ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์›Œ๋‚™ ์ดˆ๋ณด์ธ๋ฐ๋‹คโ€ฆ ์งœ์ง‘๊ธฐ๋กœ ๋งŒ๋“ค๋‹ค๋ณด๋‹ˆโ€ฆ

์ฃผ ๊ธฐ๋Šฅ์€, ์‹ค์‹œ๊ฐ„์œผ๋กœ ์˜ฌ๋ผ์˜ค๋Š” ํ…์ŠคํŠธํŒŒ์ผ์„ โ€œํ•œ ์ค„์”ฉโ€ ์ฝ๊ณ  ๊ณ„์‚ฐํ•ด์„œ ๋ฐ˜์˜ํ•ด์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.
์ˆ˜๋ฐฑkb๋‹จ์œ„์˜ ์šฉ๋Ÿ‰์€ ๋”์ด์ƒ ๋น ๋ฅผ ํ•„์š”๊ฐ€ ์—†์„ ์ •๋„๋กœ ์ž˜ ๊ณ„์‚ฐํ•ด์ฃผ๊ณ  ์žˆ๋Š”๋ฐ,
1-2๋ถ„๋งŒ์— 100๋ฉ”๊ฐ€์— ๊ทผ์ ‘ํ•˜๋Š” ์ •๋„์˜ ํŒŒ์ผ ์ฒ˜๋ฆฌ๋Š” ๋„ˆ๋ฌด ๋А๋ฆฌ๋”๋ผ๊ตฌ์š”.
๋ผ์ธ์ˆ˜๋กœ๋Š” 1-2๋ถ„๋งŒ์— ์•ฝ 100๋งŒ์ค„๊ฐ€๋Ÿ‰ ์ƒ์„ฑ์ด ๋ฉ๋‹ˆ๋‹ค.

๋Œ€๋ฏธ์ง€๋ฅผ์คฌ์Šต๋‹ˆ๋‹คRegex = new Regex(timeStampRegex + "(์น˜๋ช…ํƒ€! )?((?<name>.+)[์ด๊ฐ€] )?(((?<skill>.+)[์„๋ฅผ] ์‚ฌ์šฉํ•ด )|๊ณต๊ฒฉ์„ ๋ฐ˜์‚ฌํ•˜์—ฌ )?(?<target>.+)(์—๊ฒŒ|[์ด๊ฐ€]) (?<damage>[^a-zA-Z]+)์˜ (|์น˜๋ช…์ ์ธ )๋Œ€๋ฏธ์ง€๋ฅผ (์คฌ์Šต๋‹ˆ๋‹ค|์ฃผ๊ณ  ๋ฌธ์–‘ ๊ฐ์ธ ํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒ|(๋ฐ›๊ณ |์ž…๊ณ ) ์ผ๋ถ€ ๊ฐ•ํ™” ๋งˆ๋ฒ•์ด ์ œ๊ฑฐ๋์Šต๋‹ˆ๋‹ค)", RegexOptions.Compiled);

๋Œ€๋ฏธ์ง€๋ฅผ๋ฐ›์•˜์Šต๋‹ˆ๋‹คRegex = new Regex(timeStampRegex + "(์น˜๋ช…ํƒ€! )?((?<name>.+)[์ด๊ฐ€] )?((?<from>.+)์—๊ฒŒ์„œ |(?<skill>.+)์˜ ํšจ๊ณผ๋กœ )(?<damage>[^a-zA-Z]+)์˜ (์น˜๋ช…์ ์ธ )?((์ค‘๋…|์ถœํ˜ˆ) )?๋Œ€๋ฏธ์ง€๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค", RegexOptions.Compiled);
                

์œ„๊ฐ™์€ ์ •๊ทœ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ญ๋ชฉ์ด 20์—ฌ๊ฐœ์ •๋„๋˜๊ณ 

public void AddHeal(RecoverEventArgs e)
{
    this.HealAmount += e.Amount;
    if (Class == ClassType.NONE)
    {
        Class = SkillDictionary.GetClass(e.Skill);
    }
    this.HealLogList.Add(e.log);
    HealSkillEntity entity = null;
    foreach (HealSkillEntity hse in HealList)
    {
        if (hse.Target == e.Name)
        {
            entity = hse;
            break;
        }
    }
    if (entity == null)
    {
        entity = new HealSkillEntity();
        entity.Target = e.Name;
        this.HealList.Add(entity);
    }
    entity.TotalRecover += e.Amount;
    entity.Count++;
}

์œ„ ๊ฐ™์€ ํ•ญ๋ชฉ๋“ค์ด ๋ชจ์—ฌ์„œ

public void UpdataListView2()
{
    dd1 = ((double)NewTotalDealCount / (double)TotalDealTime); //22-05-04 ๋‘์ค„ ์ƒˆ๊ณต๋น„ ์ถ”๊ฐ€
    rd3 = Math.Round(dd1, 2);

    if (ListItem.SubItems[1].Text == "")
    {
        ListItem.SubItems[1].Text = SkillDictionary.GetClassString(Class);
    }
    ListItem.SubItems[3].Text = DPS + ""; //DPS
    ListItem.SubItems[4].Text = String.Format("{0:#,0}", TotalDamage) + ""; //๋ˆ„์ ๋”œ 23.07.20. ์ฝค๋งˆ ํ‘œ์‹œ
    ListItem.SubItems[5].Text = TotalDealTime + "์ดˆ"; //๋”œ์‹œ๊ฐ„
    ListItem.SubItems[6].Text = PercentNormalCancel + "%"; //ํ‰์บ”
    ListItem.SubItems[7].Text = rd3 + ""; //์ƒˆ๊ณต๋น„
    ListItem.SubItems[8].Text = percentCritical + "%"; //์Šคํ‚ฌ์น˜๋ช…
    ListItem.SubItems[9].Text = HealAmount + ""; //ํž๋Ÿ‰
    ListItem.SubItems[10].Text = percentSkill + "%"; //์Šคํ‚ฌํผ์„ผํŠธ
    ListItem.SubItems[11].Text = percentNormal + "%"; //ํ‰ํƒ€ํผ์„ผํŠธ
    ListItem.SubItems[12].Text = MaxDamage + ""; //ํ•œ๋ฐฉ
    ListItem.SubItems[13].Text = NewTotalNormalDealCount + "ํšŒ"; //ํ‰ํƒ€๊ณต๊ฒฉ
    ListItem.SubItems[14].Text = NewTotalSkillDealCount + "ํšŒ"; //์Šคํ‚ฌ๊ณต๊ฒฉ
    ListItem.SubItems[15].Text = NewTotalDealCount + "ํšŒ"; //์ƒˆ๊ณต๊ฒฉ
    ListItem.SubItems[16].Text = TotalNormalCancelCount + "ํšŒ"; //์ดํ‰์บ”์ˆ˜
    ListItem.SubItems[17].Text = MaxNormalCancelCount + "ํšŒ"; //์ตœ๋Œ€ํ‰์บ”์ˆ˜
    ListItem.SubItems[18].Text = TotalDealCount + "ํšŒ"; //๊ณต๊ฒฉ์ˆ˜
    ListItem.SubItems[19].Text = (NewTotalNormalDealCount == 0) ? "0" : (NewTotalNormalDamage / NewTotalNormalDealCount) + ""; //ํ‰ํƒ€ํ‰๊ท 
    ListItem.SubItems[20].Text = (NewTotalSkillDealCount == 0) ? "0" : (NewTotalSkillDamage / NewTotalSkillDealCount) + ""; //์Šคํ‚ฌํ‰๊ท 
    ListItem.SubItems[21].Text = (NewTotalDealCount == 0) ? "0" : (TotalDamage / NewTotalDealCount) + ""; //ํ‰๊ท ๋”œ
    ListItem.SubItems[22].Text = HPRecover + ""; //HPํšŒ๋ณต
    ListItem.SubItems[23].Text = MPRecover + ""; //MPํšŒ๋ณต

}

์œ„์ฒ˜๋Ÿผ ๋งŒ๋“ค์–ด์„œ

else
{
    user.AddRecover(e);
    this.BeginInvoke(new EventHandler(delegate (object s, EventArgs ee)
    {
        user.UpdataListView();
    }));
}

์ด๋Ÿฐ์‹์œผ๋กœ ๋ณด์—ฌ์ง€๊ฒŒ ๋˜๋Š”๊ฑฐ๊ฐ™์Šต๋‹ˆ๋‹ค.
(์ฒ˜์Œ๋ถ€ํ„ฐ ์ œ๊ฐ€ ๋งŒ๋“ ๊ฒŒ ์•„๋‹ˆ๋ผ์„œโ€ฆ)

๋ช‡๋ช…์˜ ์ •๋ณด๋Š” ์•„์ฃผ ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†๋Š”๋ฐ
์ธ์›์ด ๋งŽ์•„์ง€๊ณ  ์ •๋ณด๋Ÿ‰์ด ๋งŽ์•„์ง€๋ฉด ์‹ค์ œ๋กœ 1์ดˆ์˜ ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ 10์ดˆ 20์ดˆ์ด์ƒ์ด ๊ฑธ๋ฆฌ๋”๋ผ๊ตฌ์š”.

์ด๊ฒŒ ์ฒ˜๋ฆฌ์†๋„์˜ ๋ฌธ์ œ์ธ์ง€, ํผ์—์„œ ๋ณด์—ฌ์ง€๋Š” ๋ถ€๋ถ„๋“ค์ด ์ƒˆ๋กœ๊ณ ์นจ๋˜๋Š” ์†๋„์˜ ๋ฌธ์ œ(?)์ธ์ง€
๊ถ๊ธˆํ•˜๊ณ , ๊ฐœ์„ ์˜ ์—ฌ์ง€๊ฐ€ ์žˆ๋Š”์ง€๋„ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹คโ€ฆ!!

์ •๋ ฌ์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ,(์˜ต์…˜์œผ๋กœ ์˜จ์˜คํ”„๊ฐ€๋Šฅ)
ํผ์—์„œ ๋ณด์—ฌ์ง€๋Š” ๋ผ์ธ์€ ์‹ค์ œ๋กœ 2-300๋ผ์ธ์ธ๋ฐ,
ํ•œ ๋ผ์ธ ํ•œ๋ผ์ธ์˜ ์ •๋ณด๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ”๋€Œ๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

์ดˆ๋ณด์ธ๊ฒŒ ์ž๋ž‘์€ ์•„๋‹ˆ์ง€๋งŒโ€ฆ ์งˆ๋ฌธ๋„ ์•„๋Š” ๋งŒํผ ํ•˜๊ฒŒ๋˜๋Š”๊ฒƒ๊ฐ™๊ณ โ€ฆใ… _ใ… 
์•„๋ฌด์ชผ๋กโ€ฆ ์–ด๋–ป๊ฒŒ ๊ฐœ๋–ก๊ฐ™์ด ๋งํ•ด๋„ ์ฐฐ๋–ก๊ฐ™์ด ์•Œ์•„๋“ค์–ด์ฃผ์…”์„œ ์–ด๋–ค ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๋‹ฅ์„ ์žก์„์ง€โ€ฆ
ํ˜น์€ ์•„ ์ด๊ฑด ์ด๋ž˜์ €๋ž˜์„œ ์ตœ์„ ์ธ๊ฑฐ๊ฐ™๋‹ค๋ผ๋˜์ง€โ€ฆ
๋„์›€์„ ์ฃผ์‹ค ์ˆ˜ ์žˆ๋Š” ๋ถ„์ด ๊ณ„์‹œ๋‹ค๋ฉด ๊ฐ์‚ฌํžˆ ๊ฒธํ—ˆํžˆ ๋ฐ›์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!!

2๊ฐœ์˜ ์ข‹์•„์š”

๋ญโ€ฆ์ €๋„ ์–ด๋””๊ฐ€ ๋ฌธ์ œ์ธ์ง€ ์ž˜ ์•ˆ๋ณด์ด๊ธดํ•˜๋Š”๋ฐ ํ•˜๋‚˜ ๋ณด์ด๋Š” ๊ฑด,

๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

๋ณด์—ฌ์ฃผ์‹  ๊ฒƒ์ฒ˜๋Ÿผ ์ด๋ ‡๊ฒŒ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ฒŒ๋˜๋ฉด ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์ด ์ƒ์„ฑ๋˜๊ณ , ๊ทธ๊ฒŒ ๋”ฐ๋ผ ๊ฐ€๋น„์ง€๊ฐ€ ๋งŽ์ด ํ•„์š”ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ € Unit(๋‹จ์œ„) ๋ถ€๋ถ„์„ ๋‹ค๋ฅธ ์ปจํŠธ๋กค๋กœ ๋นผ์„œ ์ง€์ •์„ ํ•˜์‹œ๊ณ  ListItem์—๋Š” ๋ณดํ†ต ๋‹จ์œ„๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์€ ์‹ค์ œ ๊ฐ’ Entity๋“ค์ด ๋“ค์–ด๊ฐ€๋‹ˆ๊นŒ, ๊ทธ๋ ‡๊ฒŒ ๋ฐ”๊ฟ”๋ณด์‹œ๋ฉด ์–ด๋–จ๊นŒ์š”?

1๊ฐœ์˜ ์ข‹์•„์š”

๋Œ“๊ธ€ ๊ฐ์‚ฌ๋“œ๋ ค์š”! ๋‹ค์ดํ•ด๋Š” ๋ชปํ–ˆ์ง€๋งŒ

ListItem.SubItems[5].Text = TotalDealTime + โ€œ์ดˆโ€;

์ด๋ถ€๋ถ„์„

ListItem.SubItems[5].Text = TotalDealTime;

์ด๋ ‡๊ฒŒ ํ•ด๋ณด๋ผ๋Š” ์˜๋ฏธ (์˜๋ฏธ๋งŒ!!) ์ด์‹ ๊ฒƒ ๊ฐ™์€๋ฐ ๋งž์„๊ฐ€์š”โ€ฆ?

์ผ๋‹จ ๋ฐ”๋กœ ํ•ด๋ณด๋‹ˆ, ์ธํŠธํ˜•์‹์„ ์ŠคํŠธ๋ง์œผ๋กœ ๋ณ€ํ™˜ํ• ์ˆ˜์—†๋‹ค๊ณ  ํ•˜๋Š”๊ฑธ๋ณด๋‹ˆ
ListItem.SubItems[5].Text ์—ฌ๊ธฐ์—๋Š” ์ŠคํŠธ๋ง๊ฐ’๋งŒ ๋“ค์–ด๊ฐ€๋‚˜๋ด…๋‹ˆ๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉดโ€ฆ ๋ญ”๊ฐ€โ€ฆ ํฐ๋ณ€ํ™”๊ฐ€ ํ•„์š”ํ• ์ˆ˜ ์žˆ๊ฒ ๊ตฐ์š”
์•ž์—๋’ค์— ๋ญ˜ ์จ๋„ฃ๋Š” ์ •๋„๋กœ๋Š” ํ โ€ฆ

์ผ๋‹จ ๋ง์”€ํ•ด์ฃผ์‹  ๊ณ ๊ฒฌ์€ ๊ณ ์ด๋ชจ์…”๋‘๊ณ  ๊ณฑ์”น์–ด ์ƒ๊ฐํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!
(๋‹ค์Œ์งˆ๋ฌธ์„ ์œ„ํ•ดโ€ฆ)

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!!

2๊ฐœ์˜ ์ข‹์•„์š”

๋„ค ํƒ€์ž… ์ž์ฒด๋Š” ๋ฌธ์ž์—ด ๋ง๊ณ  ์ˆซ์ž๋Š” ๊ทธ๋ƒฅ ์ˆซ์žํƒ€์ž… ์“ฐ์‹œ๋Š” ๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค ๊ทธ๋ ‡๊ฒŒ ํ•ด์•ผ ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋„ ํŽธํ•˜๊ณ โ€ฆ

๊ทธ๋ž˜์„œ ๋ฐ”์ธ๋”ฉ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒŒ ๊ฐ„ํŽธํ•œ ๊ฒƒ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด ๊ด€๋ จํ•ด์„œ๋Š”

์ด๊ฒƒ์„ ์ฐธ๊ณ ํ•ด๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์—์„œ๋Š” ๋ณ„๋กœ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•„๋„ ๋˜์ง€๋งŒ 1๋ถ„์— 100๋งŒ๊ฑด ์ด์ƒ์˜ ๋ฌธ์ž์—ด ๋ณ€๊ฒฝ์ด๋ผ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋˜์‹ค ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. (๋ฏธ์„ธํ•œ ์„ฑ๋Šฅ ๋”œ๋ ˆ์ด์˜ ๋ˆ„์ ํšจ๊ณผ)

3๊ฐœ์˜ ์ข‹์•„์š”
  1. ์ƒ์ˆ˜๋ฅผ ์—ฐ์‚ฐ์— ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    ListItem.SubItems[5].Text = TotalDealTime + "์ดˆ"; //๋”œ์‹œ๊ฐ„

โ€œ์ดˆโ€ ์™€ ๊ฐ™์€ ๋ถˆ๋ณ€ ๊ฐ’์ด ํ•ญ์ƒ ์—ฐ์‚ฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ๋„ ์„ฑ๋Šฅ์ด ๊ฐ€์žฅ ๋А๋ฆฐ string + string ์—ฐ์‚ฐ์ด๋„ค์š”.

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

๊ทธ๋ฆฌ๊ณ , ์›ํ•˜์‹œ๋Š” ์„ฑ๋Šฅ์„ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” "ํŒŒ์ผ ํ…์ŠคํŠธ ํ•„ํ„ฐ๊ธฐ"๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•  ๋“ฏ ๋ณด์ž…๋‹ˆ๋‹ค.
์œ ์‚ฌํ•œ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋Š” ์ง€ ๊ฒ€์ƒ‰ํ•ด๋ณด๊ณ  ๋ฒค์น˜๋งˆํฌ ์ ์ˆ˜๊ฐ€ ์ œ์ผ ์ข‹์€ ๊ฒƒ์„ ์ ์šฉํ•ด๋ณด์‹œ๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”?

2๊ฐœ์˜ ์ข‹์•„์š”

ํ™”๋ฉด์„ ์‹ค์ œ๋กœ ๊ฐฑ์‹ ํ•˜๋Š” ๋ถ€๋ถ„์„ ์ตœ๋Œ€ํ•œ ๋œ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด ๋ณด์…”์š”. ๊ทธ ๋ถ€๋ถ„์ด ๊ฐ€์žฅ ๋ณ‘๋ชฉ์ผ ๊ฒ๋‹ˆ๋‹ค.

2๊ฐœ์˜ ์ข‹์•„์š”

ํ˜ธ์˜ฅ์‹œโ€ฆ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ๋งŒ๋“ค๊ตฌโ€ฆ ์ฒดํฌํ–ˆ์„ ๊ฒฝ์šฐ ํ™”๋ฉด๊ฐฑ์‹ ์„ ๋ฉˆ์ถ”๋Š” ๋ฐฉ๋ฒ•? ๊ฐ™์€๊ฒŒ ์žˆ์„๊ฐ€์š” ์™ ์ง€ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์„๊นŒ ์‹ถ์€๋ฐโ€ฆ ^^;;;;

1๊ฐœ์˜ ์ข‹์•„์š”

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ์ฐธ๊ณ ํ• ๊ฒŒ์š”!! ๊ณ ๋ง™์Šต๋‹ˆ๋‹ค!!

2๊ฐœ์˜ ์ข‹์•„์š”

์˜คโ€ฆ ํŒŒ์ผํ…์ŠคํŠธํ•„ํ„ฐ๊ธฐโ€ฆ!! ํ•œ๋ฒˆ ๊ฒ€์ƒ‰ํ•ด๋ณผ๊ฒŒ์š” ๋‹ต๋ณ€ ๊ณ ๋ง™์Šต๋‹ˆ๋‹ค!!

1๊ฐœ์˜ ์ข‹์•„์š”

UI ๊ฐ€์ƒํ™” ํ‚ค์›Œ๋“œ๋กœ
์—ฌ๊ธฐ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๊ฒ€์ƒ‰ํ•ด ๋ณด์„ธ์š”

์‹ค์ œ ๋ทฐ ํฌํŠธ(ํ™”๋ฉด์— ๋ณด์—ฌ์ง€๋Š” ๋ถ€๋ถ„) ๋งŒ ๋žœ๋”๋ง ํ•˜๊ณ 
๋ณด์ด์ง€ ์•Š๋Š” ๋ถ€๋ถ„์€ ๋žœ๋”๋งํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

3๊ฐœ์˜ ์ข‹์•„์š”

10์–ต ํ–‰ ์ฑŒ๋ฆฐ์ง€(The One Billion Row Challenge) - :outbox_tray: ์ •๋ณด ๊ณต์œ  - ๋‹ท๋„ท๋ฐ๋ธŒ (dotnetdev.kr)

์ฐธ๊ณ ํ•ด๋ณด์„ธ์š”.

3๊ฐœ์˜ ์ข‹์•„์š”

๊ฐ€์ƒํ™”๋ฅผ ์ฐพ๋‹ค๊ฐ€ C#์—์„œ๋Š” ์•„์ง ๋ชป์ฐพ๊ณ  ์žˆ๋Š”๋ฐ
๋”๋ธ”๋ฒ„ํผ๋ฅผ ๋‚ด์šฉ ์ดํ•ด๋ฅผ ์ž˜๋ชปํ•ด์„œ ์ ์šฉํ–ˆ๋Š”๋ฐ
๊นœ๋นก์ž„์€ ์ค„์–ด์„œ ์™ธ๊ด€์ƒ ๋ณด๊ธฐ๋Š” ๋” ์ข‹์•„์ง„โ€ฆ
ํ˜น์‹œ WPF์—์„œ ์–˜๊ธฐํ•˜๋Š” ๊ฐ€์ƒํ™”๋ฅผ C#์—์„œ๋Š” ์–ด๋–ค ํ‚ค์›Œ๋“œ๋กœ ๊ฒ€์ƒ‰์„ ํ•ด์•ผํ• ๊ฐ€์š”!!

======================================
๊ธ€์“ฐ๊ณ  ๋ฐ”๋กœ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๊ฐ€์ƒ๋ชจ๋“œ!!
ํ•œ๋ฒˆ ์ ์šฉํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

======================================
์ €์—๊ฒ ๊ต‰์žฅํžˆ ํž˜๋“  ์ฝ”๋“œ์ด๊ธด ํ•œ๋ฐ ์ด ๋ฐฉ๋ฒ•์ด ๋งž๋Š”๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!!

1๊ฐœ์˜ ์ข‹์•„์š”

๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋ผ ์ฝ”๋“œ๋ฅผ ๊ณต๊ฐœํ•  ์ˆ˜ ์žˆ์–ด์„œ ๊นƒํ—ˆ๋ธŒ์— ์˜ฌ๋ ค ์ฃผ์‹ค ์ˆ˜ ์žˆ์œผ๋ฉด ์•„๋งˆ๋„ ์—ฌ๊ธฐ ๊ณ„์‹  ๋ถ„๋“ค์ด ์ตœ์ ํ™”์— ๋„์›€์„ ์ ๊ทน์ ์œผ๋กœ ์ฃผ์‹œ์ง€ ์•Š์„๊นŒ ํ•ฉ๋‹ˆ๋‹ค.


ํ•œ๊ฐ€์ง€ ํŒ์„ ๋“œ๋ฆฌ์ž๋ฉด ๋ณ‘๋ชฉ ํ˜„์ƒ์„ ๊ตฌ๋ถ„ํ•ด์„œ ์ธก์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋ น,

  • ๋ฌธ์ž์—ด์„ ํŒŒ์‹ฑํ•˜๋Š” ๋ถ€๋ถ„
    ๋ฌธ์ž์—ด์„ ํŒŒ์‹ฑํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ช‡๊ฐ€์ง€ ๊ฐ€์งœ ๋ฐ์ดํ„ฐ๋กœ 1~2๋ถ„ ์‚ฌ์ด 100Mb ์ •๋„์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋˜๋„๋ก ํ•œ ํ›„ ํ™•์ธ
    โ†’ ์ œ ์ƒ๊ฐ์—๋Š” ์ถฉ๋ถ„ํžˆ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ ๊ฐ™์€๋ฐ ๋‹ค๋งŒ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์•„๋‹Œ ๋ณ„๋„ ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๋Š” ๋ถ€๋ถ„
    ๊ฐ€์งœ ๋ฐ์ดํ„ฐ๋กœ ์ดˆ๋‹น ๋ช‡ํšŒ๊นŒ์ง€ ๊ฐ€๋Šฅํ•œ์ง€๋ฅผ ํ™•์ธํ•˜๊ณ  โ€“ (์œˆํผ์˜ ๊ฒฝ์šฐ ์ดˆ๋‹น 20~40ํšŒ์ธ๊ฐ€ ๊ทธ ์ฆˆ์Œ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ™•์ธํ•ด๋ณด์„ธ์š”!) ๊ทธ ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ๊ณ ๋ฏผ
4๊ฐœ์˜ ์ข‹์•„์š”

๋ง์”€๋งŒ์ด๋ผ๋„ ๋„ˆ๋ฌด ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋””๋ชจ์ด๋‹˜ ๊ธ€์„ ๋ณด๋ฉด์„œ ์ฐธ ์ธ์„ฑ์ด ๊ณ ์šด๋ถ„์ธ๊ฒŒ ๋А๊ปด์ง‘๋‹ˆ๋‹คโ€ฆ!!ใ…Žใ…Žโ€ฆ

๋ง์”€ํ•ด์ฃผ์‹  ๊ตฌ๋ถ„ํ•˜๋Š” ํŒ์กฐ์ฐจ ์ €๊ฑธ ์–ด๋–ป๊ฒŒ ํ•˜์ง€? ๋ผ๋Š” ์ˆ˜์ค€์ด๊ธฐ๋•Œ๋ฌธ์—โ€ฆ ์ผ๋‹จ์€ ๋˜ ๋˜์ ธ์ฃผ์‹ ๊ฑฐ ์ฐพ์•„๋ณด๋Ÿฌ ๊ตฌ๊ธ€์„ ๊ฐ€๋ณด๊ฒŸ์Šต๋‹ˆ๋‹ค!ใ…‹

2๊ฐœ์˜ ์ข‹์•„์š”

ํ•ด๊ฒฐ ๋‚ด์šฉ ๊ณต์œ 

๊ธฐ์กด ์ฝ”๋“œ

private void StartWorker()
        {
            int SleepTime = (IsFile) ? 5 : 1;
            worker = new Thread
            (
                delegate ()
                {
                    lock (lockObject)
                    {
                        while (bRunning)
                        {
                            string line = streamReader.ReadLine();

                            if (!String.IsNullOrEmpty(line))
                            {
                                ParseLine(line.Trim());
                            }

                            // Oops yah, it was eating up cpu without this.
                            Thread.Sleep(SleepTime);
                        }
                    }
                }
            );
            worker.IsBackground = true;
            worker.Start();
        }

์ˆ˜์ •์ฝ”๋“œ

private void StartWorker()
{
    int SleepTime = (IsFile) ? 1 : 1;      
    worker = new Thread
    (
        delegate ()
        {
            lock (lockObject)
            {
                while (bRunning)
                {
                    string line = streamReader.ReadLine();

                    if (!String.IsNullOrEmpty(line))
                    {
                        ParseLine(line.Trim());
                        // ##
                        MainForm.totalCount++;
                        if(MainForm.totalCount > 10000000)
                        { MainForm.totalCount = 0; }
                        //Console.WriteLine("Current Line = " + MainForm.totalCount + ", " + fileStream.Position + ", " + fileStream.Length);
                    }

                    if (fileStream.Position < fileStream.Length)
                    {
                        // Oops yah, it was eating up cpu without this.
                        if (MainForm.totalCount % 20 == 0)
                            Thread.Sleep(SleepTime);

                        //MainForm.instance.SetLabel("Fast Mode");
                        //Console.WriteLine("Fast Mode");
                    }
                    else
                    {
                        Thread.Sleep(SleepTime);
                        //Console.WriteLine("Slow Mode");
                        //MainForm.instance.SetLabel("Normal Mode");
                    }
                }
            }
        }
    );
    worker.IsBackground = true;
    worker.Start();
}

์ œ๊ฐ€ ์ง์ ‘ ํ•œ๊ฒŒ ์•„๋‹ˆ๊ธฐ๋•Œ๋ฌธ์—โ€ฆ ์„ค๋ช…์€ ๋ชป๋“œ๋ฆฌ๊ฒ ์ง€๋งŒโ€ฆ
๋ญ”๊ฐ€ ๊ธฐ์กด์—๋Š” ์ œํ•œ(?)๊ฐ™์€๊ฒŒ ๊ฑธ๋ ค์žˆ์—ˆ๋‚˜๋ด…๋‹ˆ๋‹คโ€ฆ

๋” ํ•ด๊ฒฐ ํ•ด์•ผํ•  ๋ถ€๋ถ„๋“ค์ด ๋งŽ์ง€๋งŒโ€ฆ ์ผ๋‹จ ๊ณต์œ ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

4๊ฐœ์˜ ์ข‹์•„์š”

์ง„ํ–‰์ƒํ™ฉ์„ ๊ณต์œ ํ•ด์ฃผ์‹œ๋Š” ๊ฒƒ์€ ์ž‘์„ฑ์ž ๋ณธ์ธ์—๊ฒŒ๋„, ์ปค๋ฎค๋‹ˆํ‹ฐ์—๊ฒŒ๋„ ์ข‹์€ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ์˜๋ฏธ์—์„œ ๊ณต์œ ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐโ€ฆthread ํ†ต์œผ๋กœ critical section ์œผ๋กœ ์ง€์ •ํ•˜์‹œ๋Š” ๊ฒƒ์€ ์ •๋ง ๊ทธ๋ ‡๊ฒŒ ํ•˜์…”์•ผ๋งŒ ํ•˜๋Š”์ง€ ๊ฒ€ํ† ๊ฐ€ ํ•„์š”ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ์— ๊ทธ lock๊นŒ์ง€ ๊ฑธ๋ ค์žˆ๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ invoke๋ฅผ ํ†ตํ•ด ui ๋™๊ธฐํ™”๊นŒ์ง€ ์–ฝํ˜€์žˆ๋‹ค๋ฉดโ€ฆ๋ณ‘๋ ฌ ์ปดํ“จํŒ…์˜ ์„ฑ๋Šฅ์„ ์ „ํ˜€ ๋ง›๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋ณด์—ฌ์ง€๋Š” ์†Œ์Šค์ฝ”๋“œ ์ƒํ™ฉ์ƒ ๋‹ค ์ถ”์ธก์€ ์–ด๋ ต๊ฒ ์ง€๋งŒ ํ•œ๋ฒˆ ๊ฒ€ํ† ํ•ด๋ณด์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

5๊ฐœ์˜ ์ข‹์•„์š”

๋”์ด์ƒ ์ œ๊ฐ€ ์ดˆ๋ณด๋ผ๊ณ  ๋ง์”€๋“œ๋ฆฌ๊ธฐ๋„ ์ฃ„์†กํ• ๋งŒํผ
์ดˆ๋ณด๋ผ๋Š”๊ฑธ ๋งˆ์น˜ ๋ฐฉํŒจ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋Š” ๋А๋‚Œ์„ ์ €๋„ ๋А๋‚€๋‹ค๋ฉด
๋ณด์‹œ๋Š” ๋ถ„๋“ค์€ ๋” ํ• ์ˆ˜๋„์žˆ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“œ๋„ค์š”.
์•„ ์Ÿค๋Š” ์™œ ์ž๊พธ ์ดˆ๋ณด์ดˆ๋ณด๊ฑฐ๋ฆฌ๋ฉด์„œ ํ•ด๋ณผ ์ƒ๊ฐ์„ ์•ˆํ•˜๋Š”๊ฑฐ์•ผ
๋ผ๊ณ โ€ฆ?
๊ทผ๋ฐ ์ง„์งœ!! ํ›„โ€ฆ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹คโ€ฆ ํž˜๋“œ๋„ค์š” ใ… _ใ… 
์ผ๋‹จ ์ฝ”๋“œ๋ฅผ ์ €๋ ‡๊ฒŒ ๋ฐ”๊พธ์–ด์ฃผ์‹ ๋ถ„๊ป˜ ํ•œ๋ฒˆ ์—ฌ์ญค๋Š” ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
๋” ๋‚˜์€ ๋ฐฉํ–ฅ์„ ์ œ์‹œํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!!

1๊ฐœ์˜ ์ข‹์•„์š”

์•„๋‹ˆ์š”. ์ดˆ๋ณด๋ฅผ ๋ฐฉํŒจ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜์‹ ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์ €๋„ ์‚ฌ์‹ค ์ง€๊ธˆ๋„ ์ดˆ๋ณด์ด๊ณ , ๊ฒฝํ—˜์ž๋“ค์ด ์ฝ”๋“œ๋ฅผ ์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟ”๋ด๋ผ ์ €๋ ‡๊ฒŒ ๋ฐ”๊ฟ”๋ด๋ผ ํ•  ๋•Œ ์ €๋„ ๋ง์„ค์ž…๋‹ˆ๋‹ค.

๊ด€๋ จ์ด ์—†๊ฒ ์ง€๋งŒ ์˜ˆ์‹œ๋กœ ์ง€๊ธˆ ์˜คํ”ˆ์†Œ์Šค๋“ค์„ fork๋ฐ›์•„์„œ ์ œ ๋งˆ์Œ๋Œ€๋กœ ๋ฐ”๊ฟ”๋ณด๊ณ  ์žˆ๋Š”๋ฐ, ์ €๋„ ์ด๋ ‡๊ฒŒ ํ•ด๋ณผ๊นŒ ์ €๋ ‡๊ฒŒ ํ•ด๋ณผ๊นŒ๋งŒ ํ•ด๋ณด๊ณ  ์‹ค์ œ๋กœ ํ•˜๊ธฐ์ „์— ๋ง์„ค์ด๋Š” ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์Šค์Šค๋กœ ๊ฐ€๋งŒํžˆ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ด๊ฒƒ์€

๋‚ด๊ฐ€ ๋งŒ๋“  ๊ฒƒ์ด ์•„๋‹Œ๋ฐ, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋งŒ๋“  ๊ตฌ์กฐ๋ฅผ ํ—ค์ณ์„œ ๋™์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉด ์–ด์ฉŒ์ง€?

๋ผ๋Š” ๊ณตํฌ์—์„œ ์˜ค๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์งˆ๋ฌธ์ž๋‹˜๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ด์‹ค ๊ฒƒ ๊ฐ™์•„์š”.

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๋ฐฑ์—…ํ•ด๋‘์‹œ๊ณ , ๋˜๋Š” ์ €์žฅ์†Œ Clone ํ•˜์‹ ๊ฑฐ๋ผ๋ฉด Branch ์ƒˆ๋กœ ๋”ฐ์…”์„œ ์‹œ๋„ํ•ด๋ณด์‹œ๊ณ 

์ž๋ฃŒ ์„œ์นญ์„ ํ•˜์‹ ๊ฒŒ ์žˆ์œผ๋ฉด ์ด๊ฒƒ์ €๊ฒƒ ๋งŒ์ ธ์„œ ๋™์ž‘์ด๋ผ๋„ ๋˜๋Š”์ง€ ๋•Œ๋ ค ๋งž์ถฐ๋ณด์‹œ๋ฉด ์กฐ๊ธˆ ๊ดœ์ฐฎ์•„ ์งˆ ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค ์ด๋Ÿฐ (๋‚ด๊ฐ€ ๋งŒ๋“ ๊ฒŒ ์•„๋‹Œ ๊ฒƒ์„ ๋‹ค๋ฃจ๋Š”) ๋ฌด์ง€์—์„œ ์˜ค๋Š” ๊ณตํฌ๋ฅผ ์ด๊ฒจ๋‚ด๋ ค๋ฉด, ๊ทธ๋ž˜์„œ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋‹จ๋‹จํ•˜๊ฒŒ ๋‹ค์ ธ๊ฐ€์•ผํ•˜๋Š”๋ฐ ์‚ฌ์‹ค ๋งค๋ฒˆ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ธฐ๊ฐ€ ๊ฒฝ๋ ฅ์ž๋„ ์‰ฝ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์‹œ๋„ํ•ด๋ณด์‹œ๊ณ  ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ž์‹ ์„ ์œ„ํ•ด์„œ๋ผ๋„ ํฌ๋Ÿผ์— ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

1๊ฐœ์˜ ์ข‹์•„์š”

๋„ต๋„ต!
๋ฐฑ์—…ํ•˜๊ณ  ๋ฐ”๊ฟ”๋ณด๋Š”๊ฑด ์ „ํ˜€ ๋‘๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค!!
๋ฌธ์ œ๋Š” ๋ฌด์Šจ ์†Œ๋ฆฌ์ธ์ง€ ๋ชจ๋ฅธ๋‹ค๋Š”๊ฑฐ์—์š”โ€ฆใ… _ใ… 

๋ง์”€ํ•ด์ฃผ์‹  ๋‚ด์šฉ์„ ํ† ๋Œ€๋กœ ๋น ๋ฅธ ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ณธ๊ฒฐ๊ณผโ€ฆ
์ œ๊ฐ€ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์€!

์ œํ”„๋กœ๊ทธ๋žจ์€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ•œ์ค„์”ฉ (๋งŽ์€๊ฒฝ์šฐ ์ดˆ๋‹น 500์ค„ ์ ์œผ๋ฉด 1~20์ค„) ๊ณ„์† ๋ผ์ธ์ด ์ถ”๊ฐ€๋˜๋Š”
๋‹จ์ผ ํŒŒ์ผ์„ ํ•ญ์ƒ ์•ก์„ธ์Šคํ•˜์—ฌ ๋ผ์ธ์ด ์ถ”๊ฐ€๋˜๋ฉด ํ•ด๋‹น ๋ผ์ธ์„ ํ•ด์„ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.
(๊ทธ๋Ÿฐ ์—ฌ๋Ÿฌ ์ด์œ ๋•Œ๋ฌธ์— ์ด๋ ‡๊ฒŒ ๋งŒ๋“ ๊ฒŒ ์•„๋‹๊นŒโ€ฆ ์ƒ๊ฐํ•ด๋ด…๋‹ˆ๋‹คโ€ฆ)

์•„์ง ์ €๋Š” ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฌด์Šจ๋ง์ธ์ง€, (์ปดํ“จํ„ฐ์—…์ข…์ด๋ผ ๋œป์€ ์•Œ์ง€๋งŒ ์–ธ์–ด์  ์ฐจ์›์—์„œ๋Š” ๋ฌด์ง€ํ•œโ€ฆ)
๋ชจ๋ฅด๋Š” ์ •๋„์—ฌ์„œ ใ… _ใ… 

์ด๋ ‡๊ฒŒ ๊ธธ๊ฒŒ ์ •์„ฑ๊ป ๋Œ“๊ธ€์„ ๋‚จ๊ฒจ์ฃผ์‹œ๊ตฌ, ๊ทธ ๋งˆ์Œ์ด ์–ด๋–ค ๋งˆ์Œ์ธ์ง€๋Š” ์ €๋„ ๊ณต๊ฐํ•ฉ๋‹ˆ๋‹ค!
์ข€๋” ๊ณต๋ถ€ํ•˜๊ณ  ๋…ธ๋ ฅํ•ด์„œ ์ œ ์ž์‹ ๊ณผ ๋‹ค๋ฅธ ๋ถ„๋“ค์—๊ฒŒ๋„ ๋„์›€์ด ๋˜๋Š”๊ฒŒ ์ œ ํฌ๋ง์ž…๋‹ˆ๋‹ค!

์จ์ฃผ์‹  ๋‚ด์šฉ๋“ค ๋น ํŠธ๋ฆผ ์—†์ด ๊ฒ€์ƒ‰ํ•ด๋ณด๊ณ  ๊ณต๋ถ€ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค
๊ฑฐ๋“ญ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ๊พธ๋ฒ…

1๊ฐœ์˜ ์ข‹์•„์š”