Skip to content

kaiascezar/DKClinic

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

DKClinic : ์ „์ž ๋ฌธ์ง„ํ‘œ ๊ด€๋ฆฌ ํ”„๋กœ๊ทธ๋žจ

๊ฐœ์š”

  • ๋ณ‘์›์—์„œ ์ œ๊ณตํ•˜๋Š” ์ „์ž ๋ฌธ์ง„ํ‘œ ์ž‘์„ฑ ๋ฐ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ ์ค‘ ์ผ๋ถ€๋ฅผ C# .NET Framework ๋ฐ EntityFramework๋ฅผ ์ด์šฉํ•ด ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

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

  • 2020๋…„ 11์›” 23์ผ ~ 2020๋…„ 11์›” 29์ผ

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

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

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

1. ๊ณ ๊ฐ ์ •๋ณด

  • ๋ฌธ์ง„ํ‘œ๋ฅผ ์ž‘์„ฑํ•œ ๊ณ ๊ฐ์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ๊ณ ๊ฐ ์ •๋ณด์˜ ์ˆ˜์ • ๋ฐ ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๊ณ ๊ฐ ์ •๋ณด๋ฅผ ์‚ญ์ œํ•˜๊ฒŒ ๋˜๋ฉด ๊ณ ๊ฐ์ด ์ž‘์„ฑํ–ˆ๋˜ ๋ฌธ์ง„ํ‘œ์˜ ์ •๋ณด๋„ ๊ฐ™์ด ์‚ญ์ œ๋œ๋‹ค.

2. ์ง์› ์ •๋ณด

  • ์ง์›๋“ค์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐœ์ธ ์ •๋ณด๋ฅผ ํฌํ•จํ•œ ์ง๊ธ‰ ์ •๋ณด์™€ ์ง„๋ฃŒ๊ณผ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ง์›์˜ ์ถ”๊ฐ€ ๋ฐ ์ˆ˜์ •, ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

3. ๋ฌธ์ง„ํ‘œ ์ •๋ณด

  • ์ž‘์„ฑ๋œ ๋ฌธ์ง„ํ‘œ์˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ์ง„ํ‘œ์˜ ์ •๋ณด๋Š” ์ง„๋ฃŒ๊ณผ, ์ž‘์„ฑ ์ผ์ž ๋ฐ ์ž‘์„ฑํ•œ ๊ณ ๊ฐ์˜ ์ •๋ณด๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.
  • ๋ฌธ์ง„ํ‘œ์˜ ์—ด๋žŒ ๋ฐ ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์˜์‚ฌ์™€ ๋ณ‘์›์žฅ์˜ ๊ฒฝ์šฐ์—๋Š” ์ง„๋‹จ ๋‚ด์šฉ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

4. ๋ฌธ์ง„ํ‘œ ์งˆ๋ฌธ ์ •๋ณด

  • ๋ฌธ์ง„ํ‘œ ์งˆ๋ฌธ ์ •๋ณด๋ฅผ ์ง„๋ฃŒ๊ณผ๋ณ„๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฌธ์ง„ํ‘œ์˜ ์งˆ๋ฌธ ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ ์ƒ์„ธ

๊ณ ๊ฐ์šฉ ํ”„๋กœ๊ทธ๋žจ

1. ๊ธฐ๋ณธ ์ •๋ณด ์ž…๋ ฅ

2. ์ถ”๊ฐ€ ์ •๋ณด ์ž…๋ ฅ

  • ์ด๋ฆ„๊ณผ ์ƒ๋…„์›”์ผ ์ •๋ณด๋Š” ์ˆ˜์ •๋˜์ง€ ์•Š๋„๋ก ํ–ˆ๋‹ค.
  • ๋ฌธ์ง„ํ‘œ ์ž‘์„ฑ ์ด๋ ฅ์ด ์žˆ๋Š” ํ™˜์ž์˜ ๊ฒฝ์šฐ, ์ •๋ณด๊ฐ€ ๋ฏธ๋ฆฌ ์ถœ๋ ฅ๋œ๋‹ค.

3. ์ง„๋ฃŒ๊ณผ ์„ ํƒ

4. ๋ฌธ์ง„ํ‘œ ์ž‘์„ฑ

  • ์งˆ๋ฌธ ์ข…๋ฅ˜(์ฃผ๊ด€์‹, ๊ฐ๊ด€์‹, ๋‹ค์ค‘์„ ํƒ)์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์–‘์‹์œผ๋กœ ์ถœ๋ ฅ๋œ๋‹ค.
  • ๋ฌธ์ง„ํ‘œ๋ฅผ ๋‹ค ์ž‘์„ฑํ•œ ์ดํ›„์— ์ž…๋ ฅ์™„๋ฃŒ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ž‘์„ฑํ•œ ๋ฌธ์ง„ํ‘œ์™€ ํ™˜์ž ์ •๋ณด๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜๊ณ , 1. ๊ธฐ๋ณธ ์ •๋ณด ์ž…๋ ฅ ํ™”๋ฉด์œผ๋กœ ๋Œ์•„๊ฐ€๊ฒŒ ๋œ๋‹ค.

์ง์›์šฉ ํ”„๋กœ๊ทธ๋žจ

1. ์ง์› ๋กœ๊ทธ์ธ

2. ์ž‘์—… ์„ ํƒ

  • ์ง๊ธ‰ ๋ณ„๋กœ ์„ ํƒํ•  ์ˆ˜ ์—†๋Š” ์ž‘์—…์˜ ๋ฒ„ํŠผ์€ ๋น„ํ™œ์„ฑํ™” ๋œ๋‹ค.(์ง™์€ํšŒ์ƒ‰)

3. ๋ฌธ์ง„ํ‘œ ๊ด€๋ฆฌ

  • ์„ ํƒ๋œ ๋ฌธ์ง„ํ‘œ์˜ ์—ด๋žŒ ๋ฐ ์ง„๋‹จ์„œ ์ž‘์„ฑ, ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค

4. ๋ฌธ์ง„ํ‘œ ์งˆ๋ฌธ ๊ด€๋ฆฌ

  • ๋ฌธ์ง„ํ‘œ ์งˆ๋ฌธ์˜ ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค
  • ์งˆ๋ฌธ์˜ ์œ ํ˜•์€ ์ฃผ๊ด€์‹, ๊ฐ๊ด€์‹, ๋‹ค์ค‘์„ ํƒ์ด๋‹ค
  • ์ˆ˜์ • ํ›„ ์ผ๊ด„์ €์žฅ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์•ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ๋‹ค

5. ํ™˜์ž ์ •๋ณด ๊ด€๋ฆฌ

  • ์„ ํƒ๋œ ํ™˜์ž์˜ ์ •๋ณด ์ˆ˜์ • ๋ฐ ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค

6. ์ง์› ์ •๋ณด ๊ด€๋ฆฌ

  • ์ง์›์˜ ์ถ”๊ฐ€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ง์› ์ถ”๊ฐ€ ์‹œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์ดˆ๊ธฐ๊ฐ’(password)์œผ๋กœ ์ž๋™ ์ €์žฅ๋œ๋‹ค
  • ์„ ํƒ๋œ ์ง์›์˜ ์ˆ˜์ • ๋ฐ ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค

์‚ฌ์šฉ ๊ธฐ์ˆ 

์–ธ์–ด

  • C# 8.0

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

  • .Net FrameWork 4.8
  • EntityFrameWork 6.2
  • Winform

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

  • MSSQL Server 2019

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

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

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

์Šคํ‚ค๋งˆ

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

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

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

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

1. ๊ณ ๊ฐ์šฉ ํ”„๋กœ๊ทธ๋žจ

๊ณ ๊ฐ์šฉ ๋‹ค์ด์–ด๊ทธ๋žจ

2. ์ง์›์šฉ ํ”„๋กœ๊ทธ๋žจ

์ง์›์šฉ ๋‹ค์ด์–ด๊ทธ๋žจ

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

1. DAO(Data Access Object)

dao

2. ๊ณ ๊ฐ์šฉ ํ”„๋กœ๊ทธ๋žจ

๊ณ ๊ฐ

3. ์ง์›์šฉ ํ”„๋กœ๊ทธ๋žจ

์ง์›

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

์ง์› ๊ด€๋ฆฌ ์‹œํ€ธ์Šค

์‹œํ€€์Šค

Point of Interest

DB ํ…Œ์ด๋ธ”์˜ ์†์„ฑ ๋ณ€๊ฒฝ ๋“ฑ ์—…๋ฐ์ดํŠธ ๋‚ด์—ญ์ด EntityFramework์— ๋ฐ˜์˜๋˜์ง€ ์•Š์€ ๋ฌธ์ œ #24

์ฆ์ƒ

  • ๋ฌธ์ง„ํ‘œ ์ €์žฅ์„ ๋ˆ„๋ฅผ ์‹œ ์—๋Ÿฌ ๋ฐœ์ƒ

์›์ธ

  • EntityFramework๋กœ ๋ถˆ๋Ÿฌ์˜จ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฌธ์ง„ํ‘œ ํ…Œ์ด๋ธ” PK์ปฌ๋Ÿผ์˜ IDENTITY_INSERT ์†์„ฑ์ด OFF๋กœ ๋˜์–ด์žˆ์—ˆ๋‹ค

๊ฒฐ๊ณผ

  • ์ฒ˜์Œ์—๋Š” DB์— ์žˆ๋Š” ๋ฌธ์ง„ํ‘œ ํ…Œ์ด๋ธ” PK์ปฌ๋Ÿผ์˜ IDENTITY_INSERT ์†์„ฑ์„ ON์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
  • ํ™•์ธ ๊ฒฐ๊ณผ, ์ฒ˜์Œ์— DB ์Šคํ‚ค๋งˆ ์„ค๊ณ„ ์‹œ ํ…Œ์ด๋ธ” PK์— IDENTITY_INSERT ์†์„ฑ์„ ON์œผ๋กœ ๋ฐ”๊พธ์ง€ ์•Š์•˜๊ณ , ๊ทธ ์ƒํƒœ๋กœ EntityFramework๋กœ ๋ถˆ๋Ÿฌ์™€, EntityFramework์ƒ์—๋Š” IDENTITY_INSERT ์†์„ฑ์ด OFF๋กœ ์ €์žฅ๋˜์–ด ์žˆ์—ˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ, EntityFramework ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ ์šฐํด๋ฆญ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” '๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ชจ๋ธ ์—…๋ฐ์ดํŠธ'๋ฉ”๋‰ด๋ฅผ ์‹คํ–‰, ์—…๋ฐ์ดํŠธ ๋งˆ๋ฒ•์‚ฌ๋ฅผ ์ด์šฉํ•ด DB์˜ ์ •๋ณด๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ update

์™ธ๋ž˜ํ‚ค๋กœ ์—ฐ๊ฒฐ๋œ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์˜ ๊ฐ’์„ ๋™์‹œ์— ์‚ฝ์ž…ํ•˜๋Š” ํŠธ๋žœ์žญ์…˜ ์ง„ํ–‰์ค‘์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ #24

์ฆ์ƒ

  • ์ƒˆ๋กœ์šด Customer(ํ™˜์ž)๊ฐ€ ๋ฌธ์ง„ํ‘œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ

์›์ธ

  • ์‹ ๊ทœ ํ™˜์ž๊ฐ€ ๋ฌธ์ง„ํ‘œ ์ž…๋ ฅ์ด ์™„๋ฃŒ๋˜๋ฉด Customer(๊ณ ๊ฐ), Questionnare(๋ฌธ์ง„ํ‘œ), Response(๋ฌธ์ง„ํ‘œ์‘๋‹ต) ์ด 3๊ฐœ์˜ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฝ์ž…๋˜๋Š”๋ฐ, ์ด ๋•Œ ์‹ ๊ทœ ํ™˜์ž๋Š” ๋“ฑ๋ก ์ „์—๋Š” CustomerID๊ฐ€ ์—†์–ด, Customerํ…Œ์ด๋ธ”์—์„œ ํ‚ค๊ฐ’์˜ ์ตœ๋Œ€๊ฐ’์„ ๊ฐ€์ ธ์™€ ๋“ฑ๋กํ–ˆ๋Š”๋ฐ ์ด ๊ฐ’์ด ์‹ค์ œ IDENTITY ์ปฌ๋Ÿผ์„ ํ†ตํ•ด ์ €์žฅ๋˜๋Š” ๋‚ด์šฉ๊ณผ ๋งž์ง€ ์•Š์•„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค
  • ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋™์‹œ์— ์ €์žฅ๋˜๋Š” ํŠธ๋žœ์žญ์…˜์„ ๋Š์ง€ ์•Š๊ณ  IDENTITY ์ปฌ๋Ÿผ์˜ ๊ฐ’์„ ๋ฏธ๋ฆฌ ๊ตฌํ•ด์„œ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ–ˆ๋‹ค.

๊ฒฐ๊ณผ

  • ์ฒ˜์Œ์—๋Š” C#์—์„œ IDENTITY ์ปฌ๋Ÿผ์˜ ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฒ•์„ ์ฐพ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ๊ฒ€์ƒ‰ ํ•˜๋˜ ๋„์ค‘ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค
  • EF๊ฐ€ ID๊ฐ’์„ ์ฐพ์•„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ…Œ์ด๋ธ” ๊ฐœ์ฒด ์ž์ฒด๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋ฉฐ, EF๋กœ ์ƒ์„ฑ๋œ Entity ๋ชจ๋ธ์— ์ƒ์„ฑ๋˜์–ด ์žˆ๋Š” ์™ธ๋ž˜ํ‚ค๋กœ ์—ฐ๊ฒฐ๋œ ํ•˜์œ„ ๋ชจ๋ธ์„ ์ด์šฉํ•ด ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ Entity ๋ชจ๋ธ์˜ ๊ฐœ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ƒ์œ„ ํ…Œ์ด๋ธ” ๊ฐœ์ฒด๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋ฉด, ํ•œ๋ฒˆ์— SaveChange๋ฅผ ์ง„ํ–‰ํ•ด๋„ Insert๋œ ๊ฐœ์ฒด์— ๋Œ€ํ•ด ์ž๋™์œผ๋กœ IDํ‚ค๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ํŠธ๋žœ์ ์…˜๋„ ๊นจ์ง€์ง€ ์•Š๊ฒŒ ๋œ๋‹ค.
  • ๊ทธ๋ž˜์„œ ๊ฐœ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ์ƒ์œ„ ํ…Œ์ด๋ธ” ๊ฐœ์ฒด๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ–ˆ๋‹ค.
public Questionnare CreateQuestionnare { get; set; }

// before
CreateQuestionnare = new Questionnare();
// after
CreatedQuestionnare = new Questionnare { Customer = ConnectedCustomer };

ํฌ์ปค์Šค ๋ณ€ํ™”์— ๋”ฐ๋ผ ๊ฐ•์ œ๋กœ ์Šคํฌ๋กค์ด ์กฐ์ ˆ๋˜๋Š” ๋ฌธ์ œ #26

์ฆ์ƒ

  • "์ž…๋ ฅ์™„๋ฃŒ"๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํŒจ๋„ ์ปจํŠธ๋กค์˜ ์Šคํฌ๋กค์ด ๋งจ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๋Š” ํ˜„์ƒ

์›์ธ

  • ํ™•์ธ ๊ฒฐ๊ณผ, ํœ  ์Šคํฌ๋กค์ด๋‚˜ ๋‹ค๋ฅธ ํ–‰๋™์„ ํ•œ ์ดํ›„ ํŒจ๋„ ์ปจํŠธ๋กค ๋‚ด์— ์žˆ๋Š” ๋‹ค๋ฅธ ์ปจํŠธ๋กค์„ ํด๋ฆญํ•˜์—ฌ Focus๊ฐ€ ๋˜๋ฉด, ํŒจ๋„ ์ปจํŠธ๋กค์ด ActiveControl๋กœ ๊ฐ„์ฃผ๊ฐ€ ๋˜์–ด ์–ด๋–ค ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ดScrollableControl.ScrollToControl ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์Šคํฌ๋กค ์œ„์น˜๊ฐ€ ๊ฐ•์ œ๋กœ ์˜ฎ๊ฒจ์ง€๋Š” ๊ฒƒ์œผ๋กœ ํŒ๋‹จ๋œ๋‹ค.

๊ฒฐ๊ณผ

  • ScrollToControl์ด ๊ฐ€์ƒ ๋ฉ”์„œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์—, ํŒจ๋„ ์ปจํŠธ๋กค์„ ์ƒ์†๋ฐ›๋Š” CustomPanelํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ScrollToControl ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜์—ฌ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋™์ž‘์„ ํ•˜๋„๋ก ์ˆ˜์ •ํ•˜์—ฌ ํ•ด๊ฒฐ
  • ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธด ํ–ˆ์ง€๋งŒ, ์ •ํ™•ํ•˜๊ฒŒ ScrollToControl์ด ์–ด๋–ค ์›๋ฆฌ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€์™€ ํŒจ๋„๊ณผ ์Šคํฌ๋กค์˜ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ์ •ํ™•ํ•˜๊ธฐ ์ดํ•ดํ•˜์ง€๋Š” ๋ชปํ•จ
public class CustomPanel : System.Windows.Forms.Panel
{
    protected override System.Drawing.Point ScrollToControl(System.Windows.Forms.Control activeControl)
    {
        // Returning the current location prevents the panel from
        // scrolling to the active control when the panel loses and regains focus
        return this.DisplayRectangle.Location;
    }
}

ํด๋ž˜์Šค ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ์ค‘ ์–•์€ ๋ณต์‚ฌ๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ์˜ ์†์‹ค์ด ์ผ์–ด๋‚œ ๋ฌธ์ œ #61

์ฆ์ƒ

  • ๋ฌธ์ง„ํ‘œ ๋ฌธ์ œ ๊ด€๋ฆฌ์—์„œ ๋ฌธ์ œ๋ฅผ ์ค‘๊ฐ„์— ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ๋ฌธ์ œ์˜ ์œ„์น˜๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋“ฑ์˜ ์œ„์น˜ ๋ณ€๊ฒฝ ์ž‘์—…์ด ์ง„ํ–‰๋  ๋•Œ, ๋ณ€๊ฒฝ๋œ ๋ฌธ์ œ๋กœ ์ธํ•ด ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋˜๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ๋“ค์˜ ์ธ๋ฑ์Šค๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ๋ณ€ํ•˜๋Š” ๋ฌธ์ œ

์›์ธ

  • ๋ฌธ์ง„ํ‘œ ๋ฌธ์ œ ๊ด€๋ฆฌ๋ฅผ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ง์ ‘ ์—ฐ๊ฒฐํ•ด ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํ”„๋กœ๊ทธ๋žจ ๋‚ด ๊ฐ์ฒด๋กœ ๊ด€๋ฆฌ๋ฅผ ํ•˜๋‹ค๋ณด๋‹ˆ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํด๋ž˜์Šค(Entity)๋‹จ์œ„๋กœ ๊ด€๋ฆฌ๋ฅผ ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ํด๋ž˜์Šค๊ฐ€ ์ฐธ์กฐ ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์ถ”๊ฐ€ํ•˜๋Š” ๊ณผ์ •์—์„œ '์–•์€ ๋ณต์‚ฌ'๊ฐ€ ๋ฐœ์ƒํ•ด ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ๋กœ์ง์ด ๊ผฌ์˜€๋‹ค.

๊ฒฐ๊ณผ

  • ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•ด ์ˆ˜์ •ํ•˜๋Š” ๋ถ€๋ถ„ ์ค‘ ๊ฐœ์ฒด๊ฐ€ '๋ณต์‚ฌ'๋˜๋Š” ๋ถ€๋ถ„์—์„œ '๊นŠ์€ ๋ณต์‚ฌ'๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์—ฌ ์ ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ๋‹ค
  • ๊นŠ์€ ๋ณต์‚ฌ ๊ธฐ๋Šฅ์€ EF๋กœ ์ƒ์„ฑ๋œ Entity ํด๋ž˜์Šค๋ฅผ Patialํด๋ž˜์Šค๋กœ ๋‹ค๋ฅธ๊ณณ์—์„œ ์ž‘์—…ํ•˜์—ฌ ๊นŠ์€ ๋ณต์‚ฌ ๊ธฐ๋Šฅ(๋ฉ”์„œ๋“œ)์„ ๋งŒ๋“ค์–ด ํ•ด๊ฒฐํ–ˆ๋‹ค.
  • ๊นŠ์€ ๋ณต์‚ฌ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” Clone๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค๋•Œ๋Š” C#์—์„œ ์ œ๊ณตํ•˜๋Š” ICloneable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†ํ•˜์—ฌ ์ž‘์—…ํ–ˆ๋‹ค.
public partial class Question : ICloneable
{
    public object Clone()
    {
        Question question = new Question();
        // ...
        return question;
    }
}
// before
Question question = AfterQuestions.FindAll(x => x.Index == i)
    .OrderByDescending(x => x.Version)
    .FirstOrDefault();
question.Index++;

// after
var data = AfterQuestions.FindAll(x => x.Index == i)
    .OrderByDescending(x => x.Version)
    .FirstOrDefault();
Question question = (Question)data.Clone();
question.Index++;

๊ฐ„ํ—์ ์œผ๋กœ ์ ‘์†์ค‘์ธ ์ง์›์˜ ์ •๋ณด๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ #74

์ฆ์ƒ

  • ์ ‘์†ํ•˜์—ฌ ์ž‘์—… ํ›„ ๋‹ค๋ฅธ id๋กœ ๋กœ๊ทธ์ธ ์‹œ ๊ฐ„ํ—์ ์œผ๋กœ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

์›์ธ

  • ์ง„๋‹จ ๋‚ด์šฉ ์ž‘์„ฑ ํผ์— ์ „๋‹ฌ๋œ ์ ‘์†์ค‘์ธ ์ง์›์˜ ID๊ฐ’์ด null๋กœ ๋จ
  • ์›์ธ์„ ์ฐพ๋˜ ์ค‘, ๋ฌธ์ง„ํ‘œ ๊ด€๋ฆฌ ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ ์ด๋ฒคํŠธ ํ™œ์„ฑ ์‹œ ์ ‘์†์ค‘์ธ ์ง์›์˜ ์ •๋ณด๊ฐ€ ์ „๋‹ฌ์ด ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌ

๊ฒฐ๊ณผ

  • ๋ฌธ์ง„ํ‘œ ๊ด€๋ฆฌ ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ ์ด๋ฒคํŠธ ํ™œ์„ฑ ์‹œ, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ†ตํ•ด ์ ‘์†์ค‘์ธ ์ง์›์˜ ์ •๋ณด๊ฐ€ ์ „๋‹ฌ๋˜๋„๋ก ๋ณ€๊ฒฝํ•จ. ๋˜ํ•œ, ๋ฌธ์ง„ํ‘œ ์งˆ๋ฌธ ๊ด€๋ฆฌ, ์ง์› ๊ด€๋ฆฌ, ๊ณ ๊ฐ ๊ด€๋ฆฌ์˜ ๊ฐ ๋ฒ„ํŠผ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๊ตฌ๋ฌธ์— ์ ‘์†์ค‘์ธ ์ง์›์˜ ์ •๋ณด๊ฐ€ ์ „๋‹ฌ๋˜๋„๋ก ์ˆ˜์ •
  • ๋ฌธ์ œ์˜ ๋ฐœ์ƒ ๋นˆ๋„์™€ ์กฐ๊ฑด์ด ์ •ํ™•ํ•˜๊ฒŒ ๊ทœ๋ช…๋˜์ง€ ์•Š์€ ๋ฌธ์ œ์ด๋ฏ€๋กœ, ์ ์šฉ๋œ ์†”๋ฃจ์…˜์„ ํ†ตํ•ด ํ•ด๋‹น ๋ฌธ์ œ๊ฐ€ ์™„์ „ํžˆ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค๊ณ  ๋‹จ์–ธํ•  ์ˆ˜ ์—†์Œ. ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์˜ค๋ฅ˜ ๋ฐœ๊ฒฌ์‹œ ์กฐ์น˜ ํ•„์š”
// before
private void btnGoBack_Click(object sender, EventArgs e)
{
    EmployeeSelectFunctionControl employeeSelectFunctionControl = 
        new EmployeeSelectFunctionControl();
    OnbtnCancelClicked(employeeSelectFunctionControl);
}

// after
private void btnGoBack_Click(object sender, EventArgs e)
{
    EmployeeSelectFunctionControl employeeSelectFunctionControl = 
        new EmployeeSelectFunctionControl(currentEmployeeInHere);
    OnbtnCancelClicked(employeeSelectFunctionControl);
}

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C# 100.0%