GothamSubway : ์งํ์ฒ ํต๊ณ ํ๋ก๊ทธ๋จ
C# .NET Framework์ EntityFramework ๋ฐ DevExpress๋ฅผ ์ด์ฉํด ์งํ์ฒ ๊ด๋ จ ์ ๋ณด๋ฅผ ์ฐจํธ๋ก ์ถ๋ ฅํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ์๋ค.
2020๋
12์ 14์ผ ~ 2020๋
12์ 20์ผ
IoT๊ธฐ๋ฐ ์ค๋งํธํฉํ ๋ฆฌ SW๊ฐ๋ฐ ์ ๋ฌธ๊ฐ๊ณผ์
๊น๋๊ทผ, ์์ฑ์ค, ์ด๋ํฌ ์ด 3๋ช
์๋ณ ์นํ์ฐจ ์น๊ฐ ์
์ ํ๊ธฐ๊ฐ ์นํ์ฐจ ์น๊ฐ ์
์ ํ๋ ๊ธฐ๊ฐ ๊ธฐ์ค, ์ผ๋ณ, ์๊ฐ๋ณ
์งํ์ฒ ์ญ๋ณ ์ฌ๊ฐ์์
์๋ณ, ์ญ๋ณ, ํ์ฌ๋ณ(์นด๋ํ์ฌ)
๊ตฐ๊ตฌ๋ณ, ์ฑ๋ณ, ์ฐ๋ น๋ณ, ํ๋ ฅ๋ณ, ์ง์
๋ณ, ์ํ๊ท ์๋๋ณ
์งํ์ฒ ์ ์ฒด ์ ๋ ฅ ์ฌ์ฉ๋ ๋ฐ ์ ๊ธฐ์๊ธ
Excel(.xls).csv ํ์ผ DB ์ ์ฅ ๊ธฐ๋ฅ
ํด๋น ํ์์ ํ์ผ ์ ํ ํ ์๋ฒ(DB)์ ์ ์ฅ ๊ฐ๋ฅ
.Net FrameWork 4.8
EntityFrameWork 6.2
Winform
DevExpress 20.2.3 (Trial Version)
Windows 10
Microsoft Visual Studio Community 2019 v16.8
Microsoft SQL Server Management Studio v18.6
๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง
๋ชจ๋ ํญ๋ชฉ์ด ์ 3 ์ ๊ทํ๊น์ง ์๋ฃ๋๋ค
์ ์ ์ผ์ด์ค ๋ค์ด์ด๊ทธ๋จ
ํด๋์ค ๋ค์ด์ด๊ทธ๋จ
์ํธ์ค ๋ค์ด์ด๊ทธ๋จ
TablePanel ์ฌ์ฉ๋ฒ์ ๊ดํ ์ด์ #31
TablePanel์ ์ฌ์ฉํด Form์ ๊ณต๊ฐํ ๋น์ด ์ํ๋ ๋๋ก ๋์ง ์๋ ๋ฌธ์
DevExpress์ TablePanel์ ์ฌ์ฉํด Form์ ๊ณต๊ฐ ํ ๋น์ ํ๋ ค๊ณ ํ๋๋ฐ, ํด๋น ํจ๋์ ์ปจํธ๋กค์ ๋ฃ์ผ๋ฉด ๋ฌด์กฐ๊ฑด ์ผ์ชฝ ์๋ก ๊ฐ์ ์ ๋ ฌ๋๊ณ ์ด๋์ด ์๋๋ค.
Anchor๋ฅผ ํด์ ํด ๋ดค์ง๋ง ์ผ์ชฝ ์์์ ์ผ์ชฝ ๊ฐ์ด๋ฐ๋ก ๋ฐ๋์์ ๋ฟ, ์ด๋์ด ์๋๋ค.
DevExpress์ ๋ฉ๋ด์ผ์ ํตํด ๋ด๊ฐ TableLayoutPanel์ ์๋ชป ์ฌ์ฉํ๊ณ ์์์์ ์์๋ค. ๋ฉ๋ด์ผ๋งํฌ
TableLayout ์์ฒด๊ฐ ๋จ์ํ ํจ๋์ ์ฌ๋ฌ๊ฐ๋ก ๋๋๋ ๊ฒ์ด ์๋๋ผ, ์์
์ฒ๋ผ ํจ๋์ ์
๋จ์๋ก ๋๋๊ณ ์ปจํธ๋กค์ ์
์ ์ผ์ ๋ถ๋ถ(nํ n์ด)์ ๋ฃ๋ ๋ฐฉ์์ด์๋ค.
๋ฉ๋ด์ผ์ ์์ ๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ธ์ธํ๊ฒ ์
์ ๋๋๊ณ , ์ํ๋ ๋ถ๋ถ์ ์ปจํธ๋กค์ ๋ฃ์ด ์
์ ํ ๋นํด์ฃผ์๋ค
๊ฒฐ๊ณผ์ ์ผ๋ก ์ํ๋ ํํ์ ๋ ์ด์์์ ์์ฑํ๋ค
์ฐธ๊ณ ํ ์ฝ๋๋ ์คํฌ๋ฆฐ์ท
์๋ก ๋ค๋ฅธ ์ซ์ ํ์๊ฐ์ ๋๋์
์ ๊ดํ ์ด์ #37
์ฆ๊ฐ๋ฅ ์ ๊ณ์ฐํ๋ ค๊ณ ํ๋๋ฐ, ๊ณ์ฐ๋ ๋ฐ์ดํฐ์ ๊ณ์ 0์ด ์ถ๋ ฅ๋๋ ๋ฌธ์
์ฆ๊ฐ๋ฅ ๊ณ์ฐ์ ํ๋ ํจ์๋ฅผ ์ค์ ํ ๋ค์, ์ ๊ธฐ ์ฌ์ฉ๋๊ณผ ์๊ธ์ ์ฆ๊ฐ๋ฅ ์ ๊ณ์ฐํ๋ ค๊ณ ํ๋๋ฐ, ์ฆ๊ฐ๋ฅ ์ ๊ณ์ํด์ 0์ด ์
๋ ฅ๋์๋ค.
๋จ๊ณ๋ณ ๋๋ฒ๊น
์ ํตํด ํ์ธํด๋ณด๋ ค ํ์์ผ๋, ์ค๋จ์ ์ ์๋ชป ์ฐ์ด ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ฐพ์๋ณด์ง ๋ชปํ๋ค.
๋๋์
์ ํ ๋ ์ฌ์ฉ๋๋ ์ซ์๊ฐ ๋ชจ๋ intํ์ด๋ฉด ๊ฒฐ๊ณผ๊ฐ์ด intํ์ด ์ถ๋ ฅ๋์ด ์์์ ์ด ์ฆ๋ฐํ๋ค(ex. 10/3.7 = 2)
๋๋์
์ ์ฌ์ฉ๋๋ ์ซ์ ์ค ์ต์ 1๊ฐ๋ฅผ doubleํ์ผ๋ก ์บ์คํ
ํด์ผ ํ๋ค.
๋๋๋ ๋ณ์๋ฅผ doubleํ์ผ๋ก ์บ์คํ
ํ์ฌ ํด๊ฒฐํ์๋ค.
์ฐธ๊ณ ํ ์ฝ๋๋ ์คํฌ๋ฆฐ์ท
items [ i ] . UsageYoYRate = ( items [ i ] . Usage - previousItem . Usage ) / previousItem . Usage * 100.0 ;
items [ i ] . UsageYoYRate = ( items [ i ] . Bill - previousItem . Usage ) / ( double ) previousItem . Usage * 100.0 ;
์งํ์ฒ ๋
ธ์ ๋ ๋ฒํผ ์ ๋ฌ ๊ฐ ๋ณ๊ฒฝ ์ ๊ฐ ์ ๋ฌ์ด ๋์ง ์๋ ๋ฌธ์ #40
์งํ์ฒ ๋
ธ์ ๋ ๋ฒํผ ์ ๋ฌ ๊ฐ ๋ณ๊ฒฝ ์ ๊ฐ ์ ๋ฌ์ด ๋์ง ์๋ ๋ฌธ์
TransferByMonthForm๋ด์์ ์ฌ์ฉ๋๋ ์ ์ ์ปจํธ๋กค์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ํ ๋น๋์ด ์์ง ์์์.
๊ธฐ์กด์ ํ ๋น๋์ด ์์์ผ๋ ๋ด์ฉ์ด ์ ์ด๊ธฐํ ๋์ด ์๋์ง ์์ธ์ ์์๋ด์ง ๋ชปํจ.
๋์์ธ ์ฝ๋์ ๋ด์ฉ์ด ์๋์ผ๋ก ๊ณ์ ๋ณ๊ฒฝ๋๋ฉด์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ๋๋ฝ๋ ๊ฒ์ผ๋ก ์ถ์ฒญ๋จ.
ํผ ์ฝ๋์ ์ง์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์๋์ผ๋ก ๋ฑ๋กํ์ฌ ํด๊ฒฐํจ
์ฐธ๊ณ ํ ์ฝ๋๋ ์คํฌ๋ฆฐ์ท
//Codes from TransferByMonthForm.cs
protected override void OnLoad ( EventArgs e ) // ํผ ๋ก๋ ์ ์ด๋ฒคํธ
{
base . OnLoad ( e ) ;
gothamMapControl . ButtonClicked +=
new EventHandler < GothamMapControl1 . ButtonClickedEventArgs > ( gothamMapControl_ButtonClicked ) ; //๋งต์ปจํธ๋กค ์ด๋ฒคํธ ํธ๋ค๋ฌ ํ ๋น
}
๋ง์กฑ๋ ํ์ด์ง ๋์ ์ฐจํธ ๊ตฌ์ฑ์ ๊ดํ ๋ฌธ์ #44
์์
ํด์ผ ํ ๋ง์กฑ๋ ํ์ด์ง๋ ์ฌ๊ฐ์์
ํ์ด์ง์ ๋ค๋ฅด๊ฒ, ์นดํ
๊ณ ๋ฆฌ์ ๋ฐ๋ผ ์ถ๋ ฅํ ์๋ฆฌ์ฆ์ ๊ฐ์๊ฐ ๋ฐ๋๋ ๋ฌธ์
์ํ๋ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด Entity์ ๋ชจ๋ธํ ๋ฐ ๋์ ์๋ฆฌ์ฆ ์์ฑ ๋ฑ ๊ฑฐ์ณ์ผ ํ ๊ณผ์ ์ด ๋ํดํ๋ค
์ฐจํธ๊ฐ ์ต์ํ์ง ์์์ ์ฐจํธ(์๋ฆฌ์ฆ) ๊ตฌ์ฑ์๋ ์ ๋ฅผ ๋จน์๋ค
์๋์ผ๋ก ์๋ฆฌ์ฆ๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ์ ๋์ ๋ฐ์ดํฐ์ ๋ง๊ฒ ์๋์ผ๋ก ์๋ฆฌ์ฆ๋ฅผ ์์ฑํ๋ SeriesTemplate ์์ฑ์ ๋ฐ๊ฒฌํ์ฌ ์ฌ์ฉํ๋ค
SeriesTemplate ์์ฑ์ ํ์ ์์ฑ์ธ FilterCriteria(FilterString)์์ Or ์กฐ๊ฑด์ ์ถ๊ฐํ๋ฉด ์ํ๋ ์นดํ
๊ณ ๋ฆฌ์ ๋ง๊ฒ ๋์ ์ผ๋ก ์๋ฆฌ์ฆ๊ฐ ์์ฑ๋๋ ๊ฒ์ ํ์ธํ๋ค
์ด๋ฅผ ์ด์ฉํด ๋ชจ๋ธํ ์์ผ ๋ฐ์ธ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํ์ฌ ์นดํ
๊ณ ๋ฆฌ ๋ฐ ์ฐ๋์ ๋ง๋ ๊ฐ๋ณ ์๋ฆฌ์ฆ๊ฐ ์์ฑ๋์ด ์ถ๋ ฅ๋๋๋ก ํ๋ ๋ฐ ์ฑ๊ณตํ๋ค
์ฐธ๊ณ ํ ์ฝ๋๋ ์คํฌ๋ฆฐ์ท
DevExpress ๋ฒ์ ์ด ๋ง์ง ์๋ ๋ฌธ์ #49
์ถ๊ฐ ์์
์ ์ํด ๋ค๋ฅธ ํ๊ฒฝ์์ ์์
์ ํ๋ก์ ํธ๊ฐ DevExpress๋ฅผ ์ธ์ํ์ง ๋ชปํ๋ ๋ฌธ์
1์ฐจ ์์ธ์ DevExpress๊ฐ 12์4์ผ์ 20.2.4๋ก ์
๋ฐ์ดํธ ๋๋ฉด์ ๊ธฐ์กด์ ์์
ํ๋ ๋ฒ์ ๊ณผ ๋ง์ง ์์ ์๊ธด ๋ฌธ์ ์๋ค
2์ฐจ๋ก ๋ค๋ฅธ ํ์์ด ์ด๋ฏธ ๋ฌธ์ ์ธ์ ์ ๋ ๋ฐค์ DevExpress ๋ฒ์ ์ ๋ฐ๊ฟ์ ์์
์ ํ๊ณ master์ Mergeํ๋ค
๊ทธ๋ก ์ธํด ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ๋ฒ์ ์ด ๋ง์ง ์์ ํ๋ก์ ํธ์ ์ผ๊ด์ฑ์ ์นจํด๋นํ๊ณ ์์
์ด ์ด๋ ค์์ง๊ฒ ๋์๋ค
์ฒ์์๋ ๋ฒ์ ์ ๋ณด๊ฐ ์ ํ licenses.licx ํ์ผ ๋ฐ .csproj ํ์ผ์ ๋ฒ์ ์ ๋ณด๋ฅผ ์์ ํ์์ง๋ง ํด๊ฒฐ๋์ง ์์๋ค
๊ทธ๋์ ๊ธฐ์กด์ ์ฌ์ฉํ๋ ๋ฒ์ (20.2.3)์ ๋ง๋ ์ค์นํ์ผ์ ๊ตฌํด DevExpress๋ฅผ ์ฌ์ค์นํ๊ณ , DevExpress์์ ์ ๊ณตํ๋ Project Converter๋ฅผ ์ด์ฉํด ํ๋ก์ ํธ๋ฅผ ์ด์ ๋ฒ์ ์ผ๋ก ๋ค์ Convertํ์ฌ ๋์ํ๋ ๊ฒ์ ํ์ธํ๋ค
ํ์ง๋ง ๊ทธ๋๋ ์๋ํ์ง ์๋ ์ฌ๋์ด ์๊ฒจ, ํด๋น ์ธ์์ ๋ก์ปฌ์ ๋ด์ฉ์ ์ญ์ ํ๊ณ Github์์ ํ๋ก์ ํธ๋ฅผ ๋ค์ ๋ณต์ ํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค
์ฐธ๊ณ ํ ์ฝ๋๋ ์คํฌ๋ฆฐ์ท
๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค์ Excel ํ๋ก๊ทธ๋จ์ด ๋จ๋ ๋ฌธ์ #56
์์
ํ์ผ ์ฝ๊ธฐ ์์
์งํ ์ค ๋น์ ์ ์ข
๋ฃ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค์ Excel์ด ๋จ์์๋ ๋ฌธ์
ImportForm์์ ์์
ํ์ผ์ ์ฝ์ด์ฌ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฑฐ๋, ์์
์ค๊ฐ์ ์ข
๋ฃํ๋ฉด ์๋์ฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค์ Excel์ด ๋จ์์๋ ๋ฌธ์ ๊ฐ ์๊ธด๋ค
๊ทธ๋์ ์์
ํ์ผ์ ์์๋ฐ์ดํฐ๊ฐ ๋จ์์๊ฑฐ๋, ์ปดํจํฐ๋ฅผ ๊ป๋ค ์ผ๋ฉด ํ๋ก์ธ์ค์ ๋จ์์๋ ์์
์ด ์คํ๋๋ ๋ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค
์์
ํ์ผ์ ์ฝ์ด์ค๋ ์ค์๋ ์ข
๋ฃ๊ฐ ๋์ง ์๋๋ก ๋ง๊ณ , ์์
์ค์ง ๊ธฐ๋ฅ์ ์ถ๊ฐํจ.
์๋ฌ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ์์
์ด ์ค์ง๋ ๊ฒฝ์ฐ ์์
ํ์ผ์ ์ด๊ธฐ ์ํด ์ฌ์ฉํ ํธ๋ค๋ฌ๋ฅผ ํด์ ํด ์ฃผ๋๋ก ์กฐ์นํจ.
์ฐธ๊ณ ํ ์ฝ๋๋ ์คํฌ๋ฆฐ์ท
// ํ๋ก๊ทธ๋จ ์ข
๋ฃ ์
protected override void OnClosing ( CancelEventArgs e )
{
_pause . Reset ( ) ; // ManualResetEvent ์ฐ๋ ๋๋ก ์์
์ ์ผ์ ์ ์ง
if ( bgwLoader . IsBusy || bgwInsert . IsBusy ) // ์์
์ค์๋ ์ข
๋ฃ ์ทจ์
{
Utility . Mbox ( "๊ฒฝ๊ณ " , "์์
์ด ์งํ์ค์
๋๋ค.\n ์ข
๋ฃํ์๋ ค๋ฉด ์์
์ ์๋ฃํ์๊ฑฐ๋ ์ค์งํด ์ฃผ์ธ์" ) ;
e . Cancel = true ;
}
_pause . Set ( ) ;
base . OnClosing ( e ) ;
}
// BackgroundWorker์ ์์
์ด ๋๋ฌ์ ๋(์ค๋ฅ ๋ฐ์ ๋ฐ ์ทจ์)
private void bgwLoader_RunWorkerCompleted ( object sender , RunWorkerCompletedEventArgs e )
{
if ( e . Error != null || e . Cancelled == true )
{
ReleaseObject ( range ) ;
ReleaseObject ( worksheet ) ;
ReleaseObject ( workbook ) ;
application . Quit ( ) ;
ReleaseObject ( application ) ;
return ;
}
// ....
}