Skip to content
ย 
ย 

Latest commit

ย 

History

130 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

SSTAA : Subway Station Trading Area Analysis

๊ฐœ์š”

  • C# .NET Framework์™€ EntityFramework ๋ฐ DevExpress๋ฅผ ์ด์šฉํ•ด ์„œ์šธ์‹œ ๋‚ด ๊ฐ ๊ตฌ๋ณ„ ์ƒ๊ถŒ๋ถ„์„์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜์˜€๋‹ค.

๊ฐœ๋ฐœ ๊ธฐ๊ฐ„

  • 2020๋…„ 12์›” 28์ผ ~ 2021๋…„ 01์›” 08์ผ

์ฐธ์—ฌ ์ธ์›

  • IoT๊ธฐ๋ฐ˜ ์Šค๋งˆํŠธํŒฉํ† ๋ฆฌ SW๊ฐœ๋ฐœ ์ „๋ฌธ๊ฐ€๊ณผ์ •
  • ๊น€๋Œ€๊ทผ, ์•ˆ์„ฑ์œค, ์ด๋™ํฌ ์ด 3๋ช…

์ฃผ์š” ๊ธฐ๋Šฅ

์ถœ๋ ฅ ๊ธฐ๋Šฅ(SSTAA.WinForm)

์ถ”์ฒœ์ƒ๊ถŒ์„ ๋ณด๊ณ ์‹ถ์€ ๊ตฌ ์„ ํƒ(์„œ์šธ์‹œ)

  • ํ•ด๋‹น๊ตฌ ์„ ํƒ, ์—…์ข… ์„ ํƒ
  • ํ•ด๋‹น๊ตฌ ์„ ํƒ ๊ธฐ๋Šฅ์€ DevExpress MapControl๋กœ ๊ตฌํ˜„

ํ•ด๋‹น๊ตฌ ์—ฐ๋„๋ณ„ ํ‰๊ฐ€์ ์ˆ˜

  • ์„ ํƒ๋œ ๊ตฌ์— ํ•ด๋‹น๋˜๋Š” ์ง€ํ•˜์ฒ ์—ญ ํ‰๊ฐ€์ ์ˆ˜ ์ˆœ์„œ๋กœ ์ถ”์ฒœ

์—ฐ๋„๋ณ„ ํ‰๊ฐ€์ ์ˆ˜ ์„ธ๋ถ€๋‚ด์—ญ

  • ์ง€ํ•˜์ฒ ์—ญ ๋”๋ธ”ํด๋ฆญ์‹œ ํ•ด๋‹น์—ญ ์„ธ๋ถ€๋‚ด์—ญ ์ถœ๋ ฅ

ํ‰๊ฐ€์ ์ˆ˜ ๊ณ„์‚ฐ์‹

  • ํ•ด๋‹น๋‚ด์šฉ Issue #7 ์ฐธ๊ณ 

์ž…๋ ฅ ๊ธฐ๋Šฅ(SSTAA.Import)

  • csv ํŒŒ์ผ์„ DB์— ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • Entity์— ๋งž๋Š” ํ˜•์‹์˜ ํŒŒ์ผ ์„ ํƒ ๊ธฐ๋Šฅ, ์„œ๋ฒ„(DB)์— ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ๋‚˜๋‰œ๋‹ค
  • ์ž‘์—…์„ ์œ„ํ•ด์„œ๋งŒ ์‚ฌ์šฉ(๋ฒ”์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์›€)

์‚ฌ์šฉ ๊ธฐ์ˆ 

์–ธ์–ด

  • C# 8.0

ํ”„๋ ˆ์ž„์›Œํฌ

  • .Net FrameWork 4.8
  • EntityFrameWork 6.2
  • Winform

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

  • MSSQL Server 2019

Third Party

  • DevExpress 20.2.3 (Trial Version)

๊ธฐํƒ€ ๊ฐœ๋ฐœํ™˜๊ฒฝ

  • Windows 10
  • Microsoft Visual Studio Community 2019 v16.8
  • Microsoft SQL Server Management Studio v18.6

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์Šคํ‚ค๋งˆ

  • ๋ชจ๋“  ํ•ญ๋ชฉ์ด ์ œ 3 ์ •๊ทœํ™”๊นŒ์ง€ ์™„๋ฃŒ๋๋‹ค

์œ ์ € ์ผ€์ด์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

์œ ์ €๋‹ค์ด์–ด๊ทธ๋žจ

ํ”Œ๋กœ์šฐ์ฐจํŠธ

ํ”Œ๋กœ์šฐ์ฐจํŠธ

ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

DAO(Data Access Object)

ํด๋ž˜์Šค๋‹ค์ด์–ด๊ทธ๋žจ

์‹œํ€ธ์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

ํ‰๊ฐ€์ ์ˆ˜ ๊ณ„์‚ฐ ์‹œํ€ธ์Šค

์‹œํ€ธ์Šค๋‹ค์ด์–ด๊ทธ๋žจ

Point of Interest

๊ณ„์‚ฐ์‹์ด ์ž‘๋™๋˜๋Š” ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๋ฌธ์ œ #42

์ฆ์ƒ(๋ฌธ์ œ)

  • ๊ณ„์‚ฐ์‹์ด ์ž‘๋™๋˜๋Š” ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๋ฌธ์ œ

์›์ธ

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

๊ฒฐ๊ณผ(ํ•ด๊ฒฐ๋ฐฉ์•ˆ)

  • DB์— ์ ‘๊ทผํ•˜๋Š” ํšŸ์ˆ˜๊ฐ€ ์ ์–ด์งˆ ์ˆ˜๋ก ๋นจ๋ผ์งˆ ๊ฒƒ์ด๋ผ ํŒ๋‹จํ•˜์—ฌ, ๊ณ„์‚ฐ์‹์„ ์ž‘๋™์‹œํ‚ค๋ฉด ๋จผ์ € ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋ถ€ DB์— ์ ‘๊ทผํ•˜์—ฌ ๋ฐ›์•„์˜จ ๋‹ค์Œ ๊ณ„์‚ฐ์‹์ด ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ์—๋Š” DB์— ์ ‘๊ทผํ•˜์ง€ ์•Š๋„๋ก ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•จ
  • ๊ทธ ๊ฒฐ๊ณผ, ์ƒ๊ฐ ์ด์ƒ์œผ๋กœ ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ๋ฐ ์„ฑ๊ณตํ•จ
  • ๋™๋Œ€๋ฌธ๊ตฌ, ์ปคํ”ผ์ „๋ฌธ์  ๊ธฐ์ค€ ์•ฝ 12์ดˆ

์ฐธ๊ณ ํ•  ์ฝ”๋“œ๋‚˜ ์Šคํฌ๋ฆฐ์ƒท

public List<AnnualEvaluationScoreModel> GetAnnualEvaluationScoreModels(int upperLocationId, int fieldId)
{
    // ๋ฏธ๋ฆฌ DB์— ์ ‘๊ทผํ•˜์—ฌ ํ•„์š”ํ•œ ๋งŒํผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ถ€๋ถ„
    List<Station> stations = Dao.Station.GetByUpperLocation(upperLocationId);
    List<LandPriceIndex> landPriceIndices = Dao.LandPriceIndex.GetByLocation(upperLocationId);
    List<Competitor> competitors = Dao.Competitor.GetByField(fieldId);
    
    // ๊ณ„์‚ฐ์„ ์ง„ํ–‰ํ•˜์—ฌ ๋ชจ๋ธ์„ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋ถ„. DB์— ์ ‘๊ทผํ•  ๊ฒฝ์šฐ๋ฅผ ์ตœ์†Œํ™”ํ•˜์—ฌ ์ปฌ๋ ‰์…˜์˜ ๋ฐ์ดํ„ฐ๋กœ ๊ณ„์‚ฐ์„ ์ง„ํ–‰ํ•œ๋‹ค
    List<AnnualEvaluationScoreModel> models = new List<AnnualEvaluationScoreModel>();
    foreach(var station in stations)
    {
        List<FootTraffic> footTraffics = Dao.FootTraffic.GetByStation(station.StationId);
        // ...
    }
    
    // ...
    
    return models;
}

SHP ํŒŒ์ผ์„ ์ด์šฉํ•œ MapControl์˜ ๋‚ด๋ถ€ ์ •๋ณด๋ฅผ ์ฝ์–ด์˜ค๋Š” ๋ฌธ์ œ #41

์ฆ์ƒ(๋ฌธ์ œ)

  • MapControl์—์„œ ์ง€์ •๋œ ์˜์—ญ์„ ์„ ํƒํ•œ ํ›„, ํ•ด๋‹น ์ง€์—ญ์˜ ๋ฐ์ดํ„ฐ๋ฅผ shpํŒŒ์ผ์—์„œ ์ฝ์–ด์˜ค๋ ค๊ณ  ํ–ˆ์œผ๋‚˜ ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ•˜์˜€๋‹ค.

์›์ธ

  • shp ํ˜•์‹์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ•œ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ์—ˆ๋‹ค.
  • MapControl์—์„œ Region, MapItem, Object์„ ๊ตฌ๋ถ„ํ•˜์ง€ ๋ชปํ•˜์˜€๋‹ค.
  • ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์œผ๋ ค๊ณ  ํ–ˆ๋‹ค.

๊ฒฐ๊ณผ(ํ•ด๊ฒฐ๋ฐฉ์•ˆ)

  • shp ํ˜•์‹์ด 3๊ฐœ ํ˜•ํƒœ์˜ ํŒŒ์ผ๋“ค์ด ํ•ฉ์ณ์ง„ vector ๋ฐ์ดํ„ฐ ๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์˜€๋‹ค. ๋˜ํ•œ, ๊ฐ ์š”์†Œ๋“ค์„ ๊ตฌ๋ถ„ํ•˜์—ฌ, ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”ํ•œ ์š”์†Œ๋ฅผ ์•Œ์•„๋‚ด์—ˆ๋‹ค.
  • ํ•ด๋‹น ๊ฐ’๋“ค์€ MapItem.Data.Attributes๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์—ˆ์œผ๋ฉฐ, ๋ฒกํ„ฐํ˜•์‹(binary reading)์œผ๋กœ ์ €์žฅ๋˜์–ด ์žˆ์—ˆ๊ธฐ์— ์ธ์ฝ”๋”ฉ์ด ํ•„์š”ํ–ˆ๋‹ค.
  • shapeFileAdapter๋ฅผ ์ด์šฉํ•ด vectorItemsLayer์— ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ loadํ•  ๋•Œ ํ•„์š”ํ•œ ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉ์„ ํ•œ ํ›„, ์ดํ›„ ๋ถˆ๋Ÿฌ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ string์œผ๋กœ ์บ์ŠคํŒ…ํ•˜์—ฌ ํ•„์š”ํ•œ ๊ณณ์— ์‚ฌ์šฉํ•˜์˜€๋‹ค.

์ฐธ๊ณ ํ•  ์ฝ”๋“œ๋‚˜ ์Šคํฌ๋ฆฐ์ƒท

๋งต์ปจํŠธ๋กค

shapefileDataAdapter1.DefaultEncoding = Encoding.GetEncoding(51949);
shapefileDataAdapter1.FileUri = new Uri(_path[0], UriKind.Absolute);

mapControl1.CenterPoint = new GeoPoint(37.5656754986042d, 126.98202985079d);
mapControl1.ZoomLevel = 10.8d;

vectorItemsLayer1.ItemStyle.Fill = Color.FromArgb(90, Color.White);
vectorItemsLayer1.ItemStyle.Stroke = Color.White;
vectorItemsLayer1.SelectedItemStyle.Fill = Color.FromArgb(120, Color.Blue);

ํฌ๊ธฐ๊ฐ€ ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๊บผ๋ฒˆ์— DB์— ์ €์žฅํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ #23

์ฆ์ƒ(๋ฌธ์ œ)

  • csv file์˜ ๋‚ด์šฉ์„ DB์— ์ €์žฅํ•˜๋ ค๋Š”๋ฐ, ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ

์›์ธ

  • FootTraffic ํ…Œ์ด๋ธ”์— ๋“ค์–ด๊ฐˆ csvํŒŒ์ผ ๋ฐ์ดํ„ฐ๋ฅผ EF๋ฅผ ์ด์šฉํ•ด ์ €์žฅํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, ํ”„๋กœ๊ทธ๋žจ์ด ๋ฒ„๋ฒ…๋Œ€๊ณ  ์ง„ํ–‰๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ
  • ์›์ธ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ์ฒ˜์Œ์—๋Š” ์ง์ ‘ ์ €์žฅํ•˜๋Š” ๋Œ€์‹  Query๋ฌธ์„ ๋งŒ๋“ค์–ด SQLํŒŒ์ผ๋กœ SSMS๋ฅผ ์ด์šฉํ•ด ์ €์žฅํ•˜๋ ค๊ณ  ํ•จ
  • ํ•˜์ง€๋งŒ SSMS์—์„œ๋„ Query๋ฌธ์ด ๋„ˆ๋ฌด ๊ธธ์–ด์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ(SSMS๊ฐ€ 32bit๋กœ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ์œผ๋กœ ์ถ”์ธก๋จ)

๊ฒฐ๊ณผ(ํ•ด๊ฒฐ๋ฐฉ์•ˆ)

  • ๊ทธ๋ž˜์„œ ์„ ์ƒ๋‹˜๊ณผ ๋…ผ์˜ํ•œ ๊ฒฐ๊ณผ, ํ•ด๋‹น CSVํŒŒ์ผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋ถ€ ์ฝ์–ด์„œ ํ•œ๊บผ๋ฒˆ์— ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•œ ์ค„์”ฉ ์ฝ์–ด์„œ ์ž…๋ ฅํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ˆ˜์ •ํ•จ
  • ๋น„๋ก ๋А๋ฆฌ๊ธฐ๋Š” ํ•˜์ง€๋งŒ ์ฐจ๊ทผ์ฐจ๊ทผ DB์— ๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ณ  ์žˆ๊ณ , Visual Studio ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์˜ ์ง„๋‹จ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๊ฒƒ์„ ํ™•์ธํ•จ

์ฐธ๊ณ ํ•  ์ฝ”๋“œ๋‚˜ ์Šคํฌ๋ฆฐ์ƒท

// before
for(int i = 0;i < rows.Count;i++)
{
    // ...
}
// for๋ฌธ์œผ๋กœ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ „๋ถ€ ์ฝ์–ด๋“ค์ธ ๋‹ค์Œ DB์— ์ž…๋ ฅ
using (var context = DbContextCreator.Create())
{
    context.FootTraffics.AddRange(footTraffics);
    context.SaveChanges();
}
// -----------------------------------------------------------------
// after
for(int i = 0;i < rows.Count;i++)
{
    // ...
    // ํ•œ ์ค„์„ ์ฝ์€ ๋‹ค์Œ DB์— ์ž…๋ ฅ
    using (var context = DbContextCreator.Create())
    {
        context.FootTraffics.AddRange(footTraffics);
        context.SaveChanges();
    }
}

์‹คํ–‰๊ฒฐ๊ณผ


ํˆฌ๋ช… ๋ฐฐ๊ฒฝ์˜ ์œ ์ € ์ปจํŠธ๋กค์ด ๋‹ค๋ฅธ ์ปจํŠธ๋กค์„ ๊ฐ€๋ฆฌ๋Š” ๋ฌธ์ œ #9

์ฆ์ƒ(๋ฌธ์ œ)

  • ์œ ์ € ์ปจํŠธ๋กค์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋„ ๋‹ค๋ฅธ ์ปจํŠธ๋กค์ด ๋ณด์ด์ง€ ์•Š๋Š” ๋ฌธ์ œ

์›์ธ

  • ๋กœ๋”ฉ ์‹œ์— ์ถœ๋ ฅ๋˜๋Š” ํŒ์—… ํ˜•ํƒœ์˜ ์ปจํŠธ๋กค์„ ๋งŒ๋“ค๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ, ์ฃผ๋ณ€ ๋‹ค๋ฅธ ์ปจํŠธ๋กค์€ ์ž‘๋™๋˜์ง€ ์•Š๋„๋ก ํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค
  • ๊ทธ๋ž˜์„œ ์œ ์ € ์ปจํŠธ๋กค์„ ๋งŒ๋“ค๊ณ  ๋ฐฐ๊ฒฝ์„ Transparent๋กœ ์„ค์ •ํ•œ ๋‹ค์Œ ํŒ์—… ์—ญํ• ์„ ํ•  Panel์„ ๋งŒ๋“ค์—ˆ๋‹ค.
  • ์ดํ›„์— ํผ์— ๋ถˆ๋Ÿฌ์™”๋Š”๋ฐ, ํผ์— ์žˆ๋˜ ๋‹ค๋ฅธ ์ปจํŠธ๋กค์ด ๊ฐ€๋ ค์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค

๊ฒฐ๊ณผ(ํ•ด๊ฒฐ๋ฐฉ์•ˆ)

  • ๊ทธ๋ž˜์„œ ์ปจํŠธ๋กค์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ํ•  ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด๊ธฐ๋„ ํ•˜๊ณ , DevExpress์—์„œ ์ œ๊ณตํ•˜๋Š” XtraUserControl๋กœ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•ด๋ดค์ง€๋งŒ ๊ฐ™์€ ๊ฒฐ๊ณผ๋งŒ ๋‚˜์™”๋‹ค.
  • ๊ฒฐ๊ตญ, ํŒ์—…์€ ํผ์œผ๋กœ ๋‹ค์‹œ ๋งŒ๋“ค๊ณ , ํผ์„ ShowDialog๋กœ ์ถœ๋ ฅํ•˜์—ฌ ๋‹ค๋ฅธ ์ปจํŠธ๋กค์ด ์ œ์–ด๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ ํšŒํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.
  • ์œ ์ € ์ปจํŠธ๋กค์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ๋‹ค๋ฅธ ์ปจํŠธ๋กค์ด ๋น„์น˜์ง€๋งŒ ๋„๋‹ฌํ•˜์ง€ ๋ชปํ•˜๋Š” ํ˜•ํƒœ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์›ํ–ˆ์ง€๋งŒ, ์œ ์ € ์ปจํŠธ๋กค๋„ ์ปจํŠธ๋กค์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž์‹ ๋ณด๋‹ค ์•„๋ž˜์— ์žˆ๋Š” ์ปจํŠธ๋กค์„ ๊ฐ€๋ฆฐ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

์ฐธ๊ณ ํ•  ์ฝ”๋“œ๋‚˜ ์Šคํฌ๋ฆฐ์ƒท

๋กœ๋”ฉ๋ฌธ์ œ

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages