๋˜‘๊ฐ™์€ ์ผ์„ ๋ฉˆ์ถ”๋Š” ๋ฐฉ๋ฒ•

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

๋˜‘๊ฐ™์€ ์ผ์„ ๋ฉˆ์ถ”๋Š” ๋ฐฉ๋ฒ•

๊ฑฐ๋ถ€, ๋ถ„๋…ธ, ํ˜‘์ƒ, ์šฐ์šธ์ฆ์„ ๊ฒช๊ณ  ์ˆ˜์šฉ์— ๊ฐ€๊นŒ์›Œ์ง„ ํ›„ ์ €๋Š” ๋ธ”๋ž™์žญ์œผ๋กœ ์ž๋™ ์ฑ„์šฐ๊ธฐ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰ํ•ด ๋ณด๋Š” ๊ฒƒ์ด ์–ด๋–ป๊ฒ ์Šต๋‹ˆ๊นŒ? ์ €๋Š” Java๋กœ ์ž‘์„ฑ๋œ dbeaver ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์—ฌ๊ธฐ์—๋Š” ์˜คํ”ˆ ์†Œ์Šค ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ฒ„์ „์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ๊ณ„ํš์ด ์„ฑ์ˆ™ํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

  1. ์ž๋™ ์™„์„ฑ์„ ๋‹ด๋‹นํ•˜๋Š” ์†Œ์Šค ์ฝ”๋“œ์—์„œ ํด๋ž˜์Šค๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  2. ์™ธ๋ถ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ ์ž‘์—…ํ•˜๊ณ  ๊ฑฐ๊ธฐ์—์„œ ์กฐ์ธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ๋ฆฌ๋””๋ ‰์…˜ํ•ฉ๋‹ˆ๋‹ค.
  3. ???
  4. ์ด์ต

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

json์œผ๋กœ ์ž‘์—…ํ•˜๊ธฐ ์œ„ํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. json-๋‹จ์ˆœ Google์—์„œ. ์—ฌ๊ธฐ์„œ ๋†€๋ผ์›€์ด ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ, ์ง„์ •ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ธ dbeaver๋Š” OSGi ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Eclipse ํ”Œ๋žซํผ์—์„œ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ˆ™๋ จ๋œ ๊ฐœ๋ฐœ์ž์˜ ๊ฒฝ์šฐ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข…์†์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ํŽธ๋ฆฌํ•˜์ง€๋งŒ ๋‚˜์—๊ฒŒ๋Š” ์–ด๋‘ ์˜ ๋งˆ๋ฒ•์— ๋” ๊ฐ€๊น๊ธฐ ๋•Œ๋ฌธ์— ์•„์ง ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ‰์†Œ์™€ ๊ฐ™์ด ํ—ค๋”์˜ json-simple ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ํ•„์š”ํ•œ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ํŽธ์ง‘๋œ ํด๋ž˜์Šค๋ฅผ pom.xml์— ์ง€์ •ํ•˜๋ฉด ํ”„๋กœ์ ํŠธ๊ฐ€ ์ ˆ๋Œ€์ ์œผ๋กœ ์ •์ƒ์ ์ธ ์–ด์…ˆ๋ธ”๋ง์„ ๊ฑฐ๋ถ€ํ•˜๊ณ  ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ๋นŒ๋“œ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ pom.xml์ด ์•„๋‹Œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ.mf ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ๋“ฑ๋กํ•˜๊ณ  OSGI์—์„œ ์š”๊ตฌํ•˜๋Š” ๋Œ€๋กœ import-package๋กœ ์ง€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์•„๋ฆ„๋‹ค์šด ์†”๋ฃจ์…˜์€ ์•„๋‹ˆ์ง€๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ์ž ๋‹ค์Œ ๋†€๋ผ์›€์ด ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. Intellij Idea์—์„œ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ Eclipse ํ”Œ๋žซํผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ”„๋กœ์ ํŠธ ๋””๋ฒ„๊น…์„ ์‹œ์ž‘ํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ฒฝํ—˜์ด ์—†๋Š” ๊ฐœ๋ฐœ์ž๋Š” ์ฟผ๋ฆฌ ์™„๋ฃŒ๊ฐ€ ์—†๋Š” ๋ถ„์„๊ฐ€์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ณ ํ†ต์„ ๊ฒช์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ฒ„ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ง์ ‘ ๊ตฌ์ถœํ•˜์—ฌ ์œ„ํ‚ค์— ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ํƒฌ๋ฒ„๋ฆฐ๊ณผ ํ•จ๊ป˜ ์ถค์„ ์ถ”๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํ‘œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์งœ์ฆ๋‚˜๋Š” ์ ์€ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์Šค์ฟผํŠธ ํ›„์—๋„ ํ”„๋กœ์ ํŠธ๊ฐ€ import-package๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ๋œ json ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋””๋ฒ„๊ทธ์—์„œ ์‹œ์ž‘๋˜๊ธฐ๋ฅผ ์›ํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์•„์ง ์™„์ œํ’ˆ์— ์„ฑ๊ณต์ ์œผ๋กœ ์–ด์…ˆ๋ธ”๋˜์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ ).

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

๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์˜ˆ์‹œ

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<tableRelations>
    <tableRelation>
        <leftTable>dim_account</leftTable>
        <rightTable>dim_partner</rightTable>
        <joinColumnPair leftColumn="partner_key" rightColumn="partner_key"/>
        <joinColumnPair leftColumn="src_id" rightColumn="src_id"/>
    </tableRelation>
    <tableRelation>
        <leftTable>dim_account</leftTable>
        <rightTable>dim_branch</rightTable>
        <joinColumnPair leftColumn="src_id" rightColumn="src_id"/>
        <joinColumnPair leftColumn="branch_key" rightColumn="branch_key"/>
    </tableRelation>
</tableRelations>

๊ทธ ๊ฒฐ๊ณผ ๋‚˜๋Š” ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค SQLUtils ๋ฐ SQLCompletionAnalyzer ํด๋ž˜์Šค์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์•„์ด๋””์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ๊ธฐ๋ณธ ๋…ผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ ์ ˆํ•œ ์ž๋™ ์™„์„ฑ ์ œ์•ˆ์„ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์™ธ๋ถ€ xml ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€๋Šฅํ•œ ์กฐ์ธ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์ž์ฒด์—๋Š” ์ด๋Ÿฌํ•œ ํ…Œ์ด๋ธ”์„ ์—ฐ๊ฒฐํ•ด์•ผ ํ•˜๋Š” ํ•„๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ…Œ์ด๋ธ” ์Œ์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋ ˆ์ฝ”๋“œ eff_dttm ๋ฐ exp_dttm์˜ ๊ธฐ์ˆ ์  ์œ ํšจ ๋‚ ์งœ์— ๋Œ€ํ•œ ์ œํ•œ๊ณผ ๋…ผ๋ฆฌ์  ์‚ญ์ œ ํ”Œ๋ž˜๊ทธ delete_ind๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ์งˆ๋ฌธ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ฐ€ ํŒŒ์ผ์„ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ ์ฑ„์šธ ๊ฒƒ์ธ๊ฐ€? ์ €์žฅ์†Œ์—๋Š” ๋งŽ์€ ์—”ํ„ฐํ‹ฐ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋ชจ๋“  ์—ฐ๊ฒฐ์„ ์ง์ ‘ ๋“ฑ๋กํ•˜๋Š” ๋ฐ ๋น„์šฉ์ด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ €๋Š” ์ด ์ž‘์—…์„ ๋™๋ฃŒ ๋ถ„์„๊ฐ€๋“ค์—๊ฒŒ ๋งก๊ธฐ๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ์žˆ๋Š” ๋กœ์ปฌ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ฒดํฌ์•„์›ƒ์ด ์ด๋ฃจ์–ด์ง€๋Š” svn์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์›์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ €์žฅ์†Œ์— ์ƒˆ ์—”ํ„ฐํ‹ฐ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๊นŒ? ํ•œ ๋ถ„์„๊ฐ€๋Š” ํŒŒ์ผ์— ๊ฐ€๋Šฅํ•œ ์กฐ์ธ์„ ์ž…๋ ฅํ•˜๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ปค๋ฐ‹ํ•˜๋ฉฐ ๋‚˜๋จธ์ง€๋Š” ์Šค์Šค๋กœ ํ™•์ธํ•˜๊ณ  ์ž๋™ ์™„์„ฑ ๊ธฐ๋Šฅ(์ปค๋ฎค๋‹ˆํ‹ฐ, ์ง€์‹ ์ถ•์  ๋“ฑ)์„ ์ฆ๊น๋‹ˆ๋‹ค. ๋™๋ฃŒ๋ฅผ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์›Œํฌ์ˆ์„ ์ง„ํ–‰ํ•˜๊ณ  Confluence์— ๊ธฐ์‚ฌ๋ฅผ ์ผ์Šต๋‹ˆ๋‹ค. ์ด์ œ ํšŒ์‚ฌ์—๋Š” ํŽธ๋ฆฌํ•œ ๋„๊ตฌ๊ฐ€ ํ•˜๋‚˜ ๋” ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

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

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€