'분류 전체보기'에 해당되는 글 76건
- 2008.11.23 :: MS의 2010
- 2008.11.23 :: 수소관련 주식을 사야겠다.
- 2008.11.22 :: C#의 Setting Class
- 2008.11.21 :: 시리얼 장비 통신에 대한 짧은 이야기
- 2008.11.19 :: C#을 이용한 DB코딩 21
- 2008.11.17 :: 잠을 피하는건 뭔가?
- 2008.11.14 :: 대단한 강좌중 하나 1
- 2008.11.14 :: 폼안의 컨트롤을 foreach로 돌리는법 2
- 2008.11.14 :: C#을 이용한 DB코딩 20
- 2008.11.14 :: C#을 이용한 DB코딩 19
- 2008.11.14 :: C#을 이용한 DB코딩 18
- 2008.11.14 :: C#을 이용한 DB코딩 17
- 2008.11.14 :: C#을 이용한 DB코딩 16(실습파일포함)
- 2008.11.14 :: C#을 이용한 DB코딩 15
- 2008.11.14 :: C#을 이용한 DB코딩 14
MS의 windows 7은.. 나에게 의미가 있다.
현재의 컴퓨터 시스템은 4기가의 장벽에 막혀 있다. 모두들 64bit의 체계로 옮겨타야 하는 하나의 세기말의 공포와 동일한 현상에 놓여있다는 이야기다. 하지만 아무도 그것을 인식하지 않는다.
4기가의 장벽이란 사실을 아는이는 알지만 대부분은 그것을 모르기때문이다.
메모리 4기가의 장벽을 넘는것은 현시스템의 OS가 반드시 달려져야될 문제이다.
그것은 바로 일반적인 피시의 OS가 모두 XP에서 다른 무엇으로 바뀌어야 되는 당면과제에 우리가 서있다는것과 마찬가지이다.
결국 C#의 여러가지 단점중 가장 난감함을 표하던 닷넷 프레임웍의 설치 문제는 이제 거의 2년이 지나면 50%이상이 해소될것이란 이야기다. 그 장벽을 넘는다는것은 또한 많은 서버군들의 교체와 많은 어풀리케이션의 제작이 따라줘야지만 한다.
어쩔수 없는 운영인력과 개발인력이 다시금 투입되어야 되는 시대가 곧 올것이다.
VS 2010이 나오고 C#이 4.0을 발표했다는것은 이미 그 시대를 예고 하고 있다는 의미이다.
10년주기의 새로움이 각 업종마다 시작된다면.. 윈도우의 새로운 시작은 .Net시스템으로 새롭게 태어날것이란 이야기다.
'사는생각들' 카테고리의 다른 글
기업주의 (0) | 2008.12.11 |
---|---|
어느날 문득 (0) | 2008.12.11 |
진짜와 가짜 (0) | 2008.12.10 |
한밤의 커피한잔. (0) | 2008.12.02 |
50%는 까라.. (0) | 2008.12.01 |
수소관련 주식을 사야겠다. (0) | 2008.11.23 |
잠을 피하는건 뭔가? (0) | 2008.11.17 |
대단한 강좌중 하나 (1) | 2008.11.14 |
어쩌면 난 심각한 편견을 가지고 있는것 같다 (0) | 2008.11.14 |
이외수의 글은 많은 생각을 하게 만든다. (0) | 2008.11.14 |
지식경제부 신재생에너지 전문기업 가운데 수소와 연료전지 분야에 등록하는 업체가 꾸준히 늘어나고 있는 추세다. 최근 신재생에너지 전문기업 현황을 분석해보면 수소 47개사, 연료전지 62개사의 업체가 접수한 것으로 나타났다.
이 가운데 연료전지 분야 전문기업은 2005년 7개사를 시작으로 2006년 17개사, 지난해 15개사, 올해 4월까지 13개사로 매년 꾸준한 증가세를 유지하고 있는 것으로 집계됐다.
연료전지 분야에 등록된 신재생에너지 전문기업 가운데 건설사의 참여도가 두드러졌다. 우진건설, 코오롱건설, 태영건설, 쌍용건설, 혁진건설, 동부건설, 르네코, 범우건설엔지니어링, 나스텍엔지니어링 등 건설관련 기업이 들어온 상황이다.
가스관련 기업으로 롯데기공, 대구도시가스, 예스코, 대경에너텍, 케너텍 등이 있으며 프로파워, GS퓨얼셀, 퓨얼셀파워, 지멘스, 포철산기, 삼성에버랜드 등 직접적으로 연료전지 산업과 관련된 기업도 들어있다.
이밖에도 태성전력, 진보전력 등 전력관련 기업이 참여하고 있다
http://blog.naver.com/ycin6306?Redirect=Log&logNo=90030871354
'사는생각들' 카테고리의 다른 글
어느날 문득 (0) | 2008.12.11 |
---|---|
진짜와 가짜 (0) | 2008.12.10 |
한밤의 커피한잔. (0) | 2008.12.02 |
50%는 까라.. (0) | 2008.12.01 |
MS의 2010 (0) | 2008.11.23 |
잠을 피하는건 뭔가? (0) | 2008.11.17 |
대단한 강좌중 하나 (1) | 2008.11.14 |
어쩌면 난 심각한 편견을 가지고 있는것 같다 (0) | 2008.11.14 |
이외수의 글은 많은 생각을 하게 만든다. (0) | 2008.11.14 |
영어에 대한 어느 수준이 되어야 겠다. (0) | 2008.11.14 |
이글을 적는 이유는..
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=17&MAEULNO=8&no=100533&ref=100533&page=2
전적으로 이글때문이다.
이글을 적으신분의 성함이 내가 아는분과 같기때문이다.
왠지.. 답을줘야 될것같은.. 막연한.. 의무감 같은거 말이다.
일단 커피한잔 때리고 와서 더 적자..
시작하면서..
우리의 아련한 기억속에..
WritePrivateProfileString / GetPrivateProfileString
이녀석들의 API가 남아 있는지 모르겠다. 뭐 나야 한번도 사용을 안해본거라서 저게 당최 뭔지 모른다만 아시는분들이 보시면.. 흐~ 하고 미소를 지을듯 싶다.
GetPrivateProfileString("거시기", "어라시구", "뭐니", "xxx.ini") 같은 이상한것들을 적어두고.. 제일뒤에 xxx.ini만 있으면..
그 프로그램마다 ini를 만들고 저장하던게 아니였나 싶다. 상세한건 당근 생략이다.
지금에 와서 저걸 사용하는 사람들도 거의 없기도 하거니와 요즘은. XML이란 요물단지덕분에 세상이 많이 변했기 때문이다.
캬~~ 또 예제를 만들어야 하다니.. 안습이다.
심심풀이로 콘솔을 만들어보도록 하자..
어디에도 셋팅이 보이지 않는다.
조금 보일까 말까한다.
흐흐..
그렇다.. 이건 뭐 너무 쉬운이야기들이라서.. 모르는사람이 거의 없을 수준이라고 본다만..
그래도 일일이 그림으로 적어본다.
저걸 눌러서 MSDN을 보길 바란다.
거기에 상세히 읽어보면 된다.
자.. 내가 글을 적으면 뭐하겠냐.. 얼른.. 빠르게 넘어가자.
횡설수설만 늘어날뿐..
개념도 쉬우니 금방 이해될것이다.
기본활용중 하나..
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=18&MAEULNO=8&no=1576&page=1
이렇듯 다들 잘 사용하는것에 대해서 굳이 내가 적을글이 뭐가 있을까.?
그렇다. 그러니 링크들로 이야기를 대신하자.
http://csharp-projects.blogspot.com/2008/01/windows-forms-user-settings-in-c.html
이글을 읽게되면.. 즉 INI의 대용적인 프로그램의 시작위치와 폼의 크기를 다시 셋팅하는것을 이야기 한다.
아.. 혹시나. 질문을 할까봐 미리 대답의 링크를 적어두자면
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=17&MAEULNO=8&no=99697&ref=99672
셋팅된 xml파일은 여기에 저장이 된다.
Msdn의 글
http://msdn.microsoft.com/en-us/library/aa730869(VS.80).aspx
//-------------------------------------------------------------------------------------------------------
자 이제부터 내이야기를 적어보자..
뭐 이미 저정도 풀었으니 알만큼 알았을테고… 하지만..안습이게도 영어거부증과
몇몇 아티클을 대충읽는 이들이 많으니 어쩔수 없이 그들을 낚기 위해서는 뭔가 있어보이는걸 뿌려야 한다는것이다.
참.. 안습이다.
그러나 이미 콘솔로 시작했으니 뭐.. 낚을게 별로 없다.
하여간.. 기본적으로 어풀리케이션의 값을 저장해서 다시 시작할때 다시 그값을 자동적으로 셋팅해서 사용할수 있다는것이 핵심이다.
그것을 위해서 가볍게 음… 어떤 예제가 좋을까 음………………
콘솔이다 보니 쉽게 이런것을 예제로 하자 당신이 프로그램을 종료할때의 시간을 기록해서
다시 시작할때 보여주는것이다.
(예제로는 정말. 별로이긴 하다 ㅠ.ㅠ)
자 코딩을 해보자.
자.. 이렇게 될것이다.
이제 우리는 저장루틴을.. 또 첨부하자.
저장은.. 뭐 어려운게 없다.
자 시간을 비교해 봐라..
몇십초 차이가 나지 않는가?
static void Main(string[] args)
{
Console.WriteLine("현재시간은 : " + DateTime.Now.ToString());
Console.WriteLine("당신의 마지막 로긴시간은 : " + Settings.Default.LonginTime.ToString());
Settings.Default.LonginTime = DateTime.Now;
Settings.Default.Save();
}
//-----------------------------------------------
이렇게 간단하게 값을 저장하는것이 가능하다.
Save란 호출 하나로 말이다.
당연히 자동으로 불러와서 셋팅까지 되니 예전의 INI에 비하면.. 천국이 아닐수 없다.
여기서.. 바로 다음과정으로 가도 되겠지만 게으른 당신을위해서 저것이 저장되는 모습을 살짝이 살펴보자.
실제적인 저장은.. 이렇게 된다.
XML인 것이다.
그렇다. 당연히 이런것은 당신에게 무지 익숙할것이고 이정도라면.. 당연히 DataSet같은건 말밥으로 들어갈꺼란 이야기다. 그러나 질문자의 의도는 무엇이였나?
그렇다. 그넘의 해쉬~ 테이블이였다.
위의 글을 상세히 보면.. Serialize가. AS.. 즉. String이란거다. 만약 데이터 테이블같은걸 넣었다면.. XML 이라고 될것이다.
그럼.. 해쉬는 안될까?
일단은.. 이 클래스를 살펴봐야겠다.
우리가 셋팅이란 클래스를 만들게 되면.. 위에 그림으로 설명한.
이걸 누르게 되면..
위의 솔류션에 Setting이란.. CS파일이 생긴다. 저 파일을 보면.
대충.. 이런게 생성이 된다.
요걸 잘 조물딱 거리면.. 우리는 이 난국을 해쳐 나갈수도 있을것이다.
그러기 위한 테스트를 하나 더 만들어야 겠다.
요렇게 만들면..
요렇게 만들어 질것이다.
일단은.. 시도를 해보자.
이런.. 안된다. 역쉬다.
코드야.. 뻔한 이야기고..
안된다는 것이다.
------------------------
[SerializableAttribute]
[ComVisibleAttribute(true)]
public class Hashtable : IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback, ICloneable
처음에 해쉬테이블의 ISerializable, IDeserializationCallback, 라고 적힌걸 못 보았다.
덕분에 이걸 만들어야 하나.. 졸라 짜증이 밀려왔더랬다.
두번째 보니 이게 보이더라는..
------------------------
그러나.. 포기를 하면되겠는가.. 안되는거 알지만 한번더 해보자.
스트링도 안된다.
막판이다.. 그렇다. 바이너리 함 찍어보자.
졸 삽질이다.
그렇다. 된다.
//-----------------------------------------------------
[SerializableAttribute]
[ComVisibleAttribute(true)]
public class Hashtable : IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback, ICloneable
IXmlSerializable 는 XML로.. 구현을 뽑고
Iserialiable는 Binary로 뽑아서 사용하자.
상세한 설명은.
'C# > 일반적인코딩' 카테고리의 다른 글
ListView에서 Drag & Drop (0) | 2008.12.29 |
---|---|
시리얼 장비 통신에 대한 짧은 이야기 (0) | 2008.11.21 |
폼안의 컨트롤을 foreach로 돌리는법 (2) | 2008.11.14 |
Serial에 대한 볼거없는 MSDN
http://msdn.microsoft.com/ko-kr/library/system.io.ports.serialport.aspx
Serial에 대한 반드시 읽어봐야 하는 문서
크로스쓰레드에 대한 MSDN
http://msdn.microsoft.com/ko-kr/library/ms171728(VS.80).aspx
세상에는 나처럼 든거없이 떠드는 빈깡통이 있는반면
항상진중하게 자기 할것만 하고 다른이가 정리한것만 보는 착실한 친구들이 있다.
누가 옳고 그른것들은 없다. 세상의 구성원이란게 원래 그런거니까. 그렇게 그렇게 무엇인가가 조화롭게 이루어져 나가는것이 좋은것이라 생각한다.
두개체가 적정비율이 되는것이 가장 중요한것 같다. 비율이 한쪽으로 쏠린다면 결국 서로 좋은게 없지 않을까 한다.
상상은 스스로 하기로 하고
지금부터 떠들 깡통의 소리는..
시리얼에 대한것이다. 정말 쉽다.
별게 없다.
이글은 단지 심풀하게 시리얼에서 데이터를 받는것을 보여주고자 한다.
왜냐면 내가 해야되는일중에 하나가 전화가 오면 그 전화번호를 화면에서 보여주는데 검색을 통해서 누가 전화를 한지 알려주기 위한것이기 때문이다.
아주 간단하게.. 코딩이 완료되었다.
하지만.. 여기서..
에러를 발견하게 될것인데.
이런에러가 발생될것이다.
이건.. 너무나도 일반적인 이야기 임에도 아직도 질문을 하는 인간들이 많으니.. 상세~~~ 하게 이야기 해보자.
아마도 2.0부터 이렇게 되고.. 그 하위버전에서 처리한다면.. 델리게이트를 외부에서 선언해주고 함수또한 외부에 넣어주고.
구문내에서는.. 호출함수를 적어주면 될것이다.(물론 하위버전에서는 저런 오류가 나오지 않는다.)
굳이 이렇게 귀찮게 코딩을 하는것은 폼클래스에서 돌고있는 쓰레드와
우리가 생성한 시리얼포트에서 처리되는 쓰레드가 말그대로 교차되기 때문이다.
그럴때 교차의 순서를 정해주는 입장이라고 생각하면 되는데…. 즉.. 시리얼에서 데이터를 받아서 그것을 택스트박스에 뿌려주는것을
폼쓰레드의 this.Invoke는 폼의 함수호출을 의미한다.
거기내에서 실제 실행되어야 하는것을 넣어주는것이다.
물론… 폼쓰레드에 넣는게 황당하다고 생각된다면..
이런식으로 textBox의 쓰레드에 넣어도 된다..
여전히 뭔말인지 모르겠다면..
이렇게 만든 아주 간단한.. 폼 파일인데…
이녀석의 쓰레드 개수는
이렇게 15개나 된다. 그냥.. 폼만 만들면.. 대략 9개던가?의 쓰레드가 돌아가는데..
하여간.. 심풀한 폼에도.. 이렇게 쓰레드가 많이 돈다는 이야기다.
그러니 그 녀석들간의 충돌이 문제가 없게 하기위해서는 서로간의 일종의 동기화가 맞아야 하는것이고
동기화를 맞춰 주기위해서 저렇게 처리해주는것이다. 물론.. 무식하게.. 동기화고 뭐고
내맘이다 할때는 그럴때를 위해서.. MS이런것도 만들어 두었다.
using System.IO.Ports;
namespace WindowsApplication9
{
public partial class Form1 : Form
{
SerialPort port = new SerialPort("COM3", 19200, Parity.None, 8, StopBits.One);
public Form1()
{
InitializeComponent();
port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
port.Open();
CheckForIllegalCrossThreadCalls = false;
}
void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
textBox1.Text += port.ReadExisting();
}
}
}
참고로.. 포트 COM3라고 적은것처럼.. 저것과 속도 19200<--- 등등은 장비에 따라 다르니 저게 틀린다면..
들어오는 정보는.. 잡음이라고 생각해야 할것이다.
위의 크로스 쓰레드에 대한이야기는 네트웍의 채팅프로그램같은것을 만들때도 반드시 알아야 하니..
꼭 숙지(?)고 뭐고 이미 다 알고 있을거라 믿는다.
귀차니즘을 무릎쓰고…
내부에서 함수로 처리되지 않고 실제적인 델리게이트의 모습으로 이쁘게 처리된다면… 요렇게 해야겠지.
'C# > 일반적인코딩' 카테고리의 다른 글
ListView에서 Drag & Drop (0) | 2008.12.29 |
---|---|
C#의 Setting Class (0) | 2008.11.22 |
폼안의 컨트롤을 foreach로 돌리는법 (2) | 2008.11.14 |
자. 새로운 포스팅을 해보자.
사실상 앞서 이야기를 적으면서 올바르지 않는 MVC 의 패턴이야기를 적었다.
그럼에도 아무도 그것을 지적해 주거나 말해주지 않는건
그렇게 세상이 이미 많이 차가워 졌거나 서로간의 간섭할 필요성이 사라지기 때문일것이다.
기본적으로 MS의 VS는 이미 이런식으로 Designer.cs에서는 View의 역할을 그리고
Form1.cs에서는 컨트롤의 역할을 하도록 만들었다.
고전적인 MVC 의 패턴은 단지 우리가 표현하고자 하는것의 실제적인 MODEL만 따로 만들기만 하면 크게 문제 없이 구성이 완료된것이다.
하지만 말이다. 기것 자동컨트롤로가 만들어 주는것이 전부로 코딩을 한다면? 그것이 옳을것인가?
그런 생각을 해보지는 않았는가?
조금 더 내가 이미 설명한 형태처럼 조금은 다르게 저 폼과 디자이너를 하나의 뷰단에 넣는입장의 분리형은 어떻게 생각하는가 말이다.
컨트롤이 꼭 하나일 가능성을 가지고 있는가 그렇다면 새로운 컨트롤
지금의 이야기에서 계속 진행하듯이 전체를 대변하는 하나의 컨트롤이 있고 이런 각자의 컨트롤들은.. 단지 지칭하지는 않지만 말그대로 로컬의 컨트롤들이라고
개념을 가져보자.
이말은 이미 고전적인 형태의 패턴은 그 시절을 반향하기 때문일것이다. 게다가 그시절 언어의 구현에도 영향을 미칠것이고 지금의 입장에서는 조금 변형적인건 어떤가 하는 이야기다.
물론 정확하게 내가 만든코드는 정상적이라고 볼수 없다.
왜냐면 클래의 각 성향 은닉성같은것은 지켜주지 않기 때문일것이다.
여하튼… 계속 되는 이야기를 해보도록 하자.
(참고로 이런식과 유사하게 이야기 하는것을 Front Controller라고 이야기 하기도 한다. (유사하다고 이야기했다.) )
--------------------------------------------------------------------------------------------
바인딩의 방법은 여러가지가 있지만 기본적으로 DB에 바로 하는것들만 다들 익숙하다. 아니 실제적으로는 DataTable같은것에 바인딩이 될것이다. 이것 조차도 대부분 자동화 툴에 익숙하다 보니 그렇게 들 한다.
바인딩은 나중에 이야기 하고
이제 폼에서 데이터를 가져왔다면 DB실제적으로 데이터를 넣어야 될것이다.
이제 MDB의 모듈을 더 추가해서.. MDB에다가 데이터를 넣어보도록 하자.
자.. 입력을 해야하는데.
입력을 위해서는 테이블이란것이 필요하다.
테이블의 이름을 Form이란곳의 태그에 적도록 하자.
그럼..
insert into (Form의 테그이름) (column1, clumn2...) values(value1,value2...)
의 형태가 될것이다.
앞서 우리가 만든것은 무엇인가?
폼을 하나의 데이타셋으로 만드는것이다. (이말은 약간의 어폐가 있긴하다)
그럼 그것을 인자값으로 받아 입력한다면? 된다는이야기가 된다.
여기서 넘겨주는것은 폼의 주소값을 넘겨주도록 하자.
(개인적으로 인자값의 개수가 많은것을 싫어한다.)
물론 여기서 하나의 폼이 꼭 하나의 테이블과 대응된다는것 자체가 말이안되는 사건이긴하다만 여타 이런코딩을 처음보는 사람들이 대부분이 아닐것인가?
그렇다. 그러니 지금은 복잡하게 나간다면 더욱 더 어렵게만 느껴질테니 조금은 단순하게 하나의 폼에 하나의 테이블이란 (?)생각으로 가자.
게다가 이미 어느정도 이해를 했다면 사실상 이런건 문제가 아닌 그냥 SP단에서 처리를 할것이니 더욱 더 문제가 아니다.
ps1)
내가 추구하는 코딩이란것은 최적화, 빠른것을 추구하지 않는다.
아니 지독스럽게 그런것을 추구할때도 있다.
하지만 만약 둘중 어느것을 선택해야되는 입장에 선다면 코딩의 편의를 더 추구한다.
'C# DB 코딩 강좌' 카테고리의 다른 글
C#을 이용한 DB코딩 20 (0) | 2008.11.14 |
---|---|
C#을 이용한 DB코딩 19 (0) | 2008.11.14 |
C#을 이용한 DB코딩 18 (0) | 2008.11.14 |
C#을 이용한 DB코딩 17 (0) | 2008.11.14 |
C#을 이용한 DB코딩 16(실습파일포함) (0) | 2008.11.14 |
C#을 이용한 DB코딩 15 (0) | 2008.11.14 |
C#을 이용한 DB코딩 14 (0) | 2008.11.14 |
C#을 이용한 DB코딩 13 (0) | 2008.11.14 |
C#을 이용한 DB코딩 12 (0) | 2008.11.14 |
C#을 이용한 DB코딩 11 (0) | 2008.11.14 |
잠이온다.
그런데 자기가 싫다. 왜 일까?
곧 죽을것만 같다.
죽기전에 죽기전에 뭘 해야한다는건가?
아님 죽지않기위해서 뭘 해야한다는건가?
춥다. 곧 추위가 날 죽일것만 같다. 곧 나는 굶어죽을것만 같고. 세상이란 곳에서 살아남기 위해서 어떻게 내 자리에 서있어야 될지 모르겠다. 모두가 날 죽일것만 같이 두렵고 그럼에도 자신있게 서있어야 할뿐이다.
한없이 약해질때 도저히 이런 나 스스로를 어떻게 조처할 수 없을 수준으로 나약해 진다.
어떻게 날 벗어나야 하는가?
어떻게 한없이 긍정적이고 한없이 미래지향적으로 살아가야 할지 모르겠다.
갑자기 바뀌어지는 패턴들로 인해서 지금은 한없이 우울해 지려고 한다.
아니 우울한것은 아니다.
단지 단지말이다.
내가 앞으로 살아갈것이 적막속에 갇혀 있는것뿐이다.
곧 불을 밝히고 다시금 힘차게 나아가겠지만 지금은 이 적막속에서 내가 가야할길을 찾기위해서 눈빛을 밝히고 있을뿐이다.
'사는생각들' 카테고리의 다른 글
진짜와 가짜 (0) | 2008.12.10 |
---|---|
한밤의 커피한잔. (0) | 2008.12.02 |
50%는 까라.. (0) | 2008.12.01 |
MS의 2010 (0) | 2008.11.23 |
수소관련 주식을 사야겠다. (0) | 2008.11.23 |
대단한 강좌중 하나 (1) | 2008.11.14 |
어쩌면 난 심각한 편견을 가지고 있는것 같다 (0) | 2008.11.14 |
이외수의 글은 많은 생각을 하게 만든다. (0) | 2008.11.14 |
영어에 대한 어느 수준이 되어야 겠다. (0) | 2008.11.14 |
세상은 아직도 재미난게 많다. (0) | 2008.11.12 |
시골의사는 예전에 주식강좌때문에 알게된 인물이다.
이 강좌를 들으면서 새로운 느낌이란것이 나에게 다가온다. 난 20대에 무엇을 준비했단 말인가.
아 정말 아쉽다. 나의 20대는 이미 흘러가 버리고 이제 성취해야 되는 30대에 난 무엇을 하는가?
그렇다 잠이 안오는군… 어떻게 잠이 오겠는가…
2강의 끝부분이 짤려서 매우 아쉽다.
'사는생각들' 카테고리의 다른 글
한밤의 커피한잔. (0) | 2008.12.02 |
---|---|
50%는 까라.. (0) | 2008.12.01 |
MS의 2010 (0) | 2008.11.23 |
수소관련 주식을 사야겠다. (0) | 2008.11.23 |
잠을 피하는건 뭔가? (0) | 2008.11.17 |
어쩌면 난 심각한 편견을 가지고 있는것 같다 (0) | 2008.11.14 |
이외수의 글은 많은 생각을 하게 만든다. (0) | 2008.11.14 |
영어에 대한 어느 수준이 되어야 겠다. (0) | 2008.11.14 |
세상은 아직도 재미난게 많다. (0) | 2008.11.12 |
첫번째 이야기를 적으면서 (0) | 2008.11.10 |
이 글을 적은지도 꽤 지났는데 어느날..
http://mkexdev.net/Article/Content.aspx?parentCategoryID=1&categoryID=25&ID=322
이글을 봤다.
흐흐.. 저기 적혀 있는게 더 나은 루틴이다.
모양이 똑같다 그런데 흐흐 잠시 흠칫 놀랐더랬다.
뭐 그리 똑같지는 않다만..
실제 업무에서 쓸때는 DB쪽 강좌에 적은 Reflection을 이용한것을 사용해 보길 권한다.
개인적으로 루틴돌리기에는 그것도 나쁘지 않은듯 보여진다.
우째도 내가 저 링크보다 좀 더 아는척 해보고 싶다. ㅋㅋㅋ
사실 아는건 쥐뿔도 없다는 다들 알꺼고..
개인적으로 저 사이트 참 괜찮다. 공부할게 많으니 들러서 모든 글을 싸그리 다 읽어버리길 권한다.
내가 적은 여기 블러그는 저 사이트에 비하면.. 조족지혈이다.
휠씬 더 나은방법을 사용하고 있으니 잘.. 참고하길 바란다.
------------------------------------------------
참 부족한 프로그래머로서 남의코드에 이러쿵 저러쿵 할말은 없으나
그래도 항상 하는짓이 꼭 남의코드 수정이나 해야되는 입장에서
되도록 그분들의 코드가 잘~ 작성되었으면 하는 바램이 있다.
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=17&MAEULNO=8&no=97314&ref=97314&page=1
이글을 읽다가 문득 마음이 아파왔다.
일전에 약 70여개의 컨트롤들의 탭이나 입력값을 제어하는 코드를 수정해 줘야했는데
그 코드가 마치 하나하나 대입하거나 IF문을 사용했던것이
수정을 위해서도 어찌그리나 피곤하던지 말이다.
믿어지지않겠지만 35번째를 수정하면 그 이하 코드를 다 수정해야 되도록 코딩을 해 두셨다.
게다가 폼만.. 30개쯤 되었으니.. 어림잡아.. 300여개정도.. 코딩으로 1000줄은 수정해 줘야했던듯 했다.
참 마음아프게도 이 코드를 수정을 해줘야 겠는데 다 지우고 그냥 몇줄 적으면 되는것을
지워야 하나 아님 새로 만들어야 하나를 두고 고민했었다.
지우자니 굴러온돌(?) 박힌돌의 코드를 맘대로 수정했다고 욕먹을듯 눈치는 보이고
그렇다고 양해를 구해보니 절대 수정하지 말라는 황당한 요청은 들어오고
그렇다고 이걸 수정하자니 너무 많은 수정이 있었다.
일단 기초적 방법은 두가지가 있다.
하나는 Collection에서 foreach를 이용하는것이고
두번째로는
그 응용으로 컬랙션의 값을 다시금 컬랙션으로 만드는것이다.
전자의 방법은 collection내부에 다시금 collection이 포함된경우 그 내부의 컬랙션안에 들어간것을 처리할수가 없다.
이말 조차 이해를 못하는 사람들이 있을까봐 다시금 풀어서 이야기하자면
폼은 하나의 컬랙션개체이고 그룹박스, 패널, 탭컨트롤 등등도 컬랙션 개체이다.
즉 잘 풀어서 이야기 하면 폼에 라벨을 두고 그룹박스 않에 라벨을 두면
두개의 개체에 있는 라벨을 foreach로 모두 처리하기에는 피곤하다는 이야기다.
그래서 즉.. 두번째 방법을 사용하게 된다.
미래에 내가 또 어느곳에 가서 코드를 수정해 주고 있을지 모르나
그분들의 코드가 조금은 수정하기 쉽게 만들어지길 바라는 조그만 소망으로 이글을 적어본다.
그림은 일반적으로 쉽게 볼수 있는 형태이다.
여기서 좌측에 있는 label1,2,3에대가 1,2,3을 대입해 보도록 하자.
그러기 위해서 저 라벨을 포함한 컬랙션에서 끄집에 내면 될것이다.
foreach (Control x in this.Controls )
처럼 적게되면.. 폼에 포함된 모든 컨트롤을 가져오게 된다.
예를 들어서
이런 코드를 작성했다고 하자.
그럼..
이런 화면이 나타날것이다.
여기서 그룹박스에 숫자 "2"가 나오는것을 유심히 보고
또한 그룹박스 이내에 있는것들은 아무런 변화가 없는것을
확실히 인지하기 바란다.
자.. 일단은 뭔가 될것 같기는 하다. 그럼 여기서 우리가 원하는 라벨에만 숫자를 생성시켜야 한다는것이 두번째 과제일것이다.
그것은 어떻게 해야할까? 그것도 그리 어렵지 않다. 그 컨트롤이 단지 라벨인가만 확인해주면 되는것이다.
여기까지 해줬음에도 불구하고 또 질문이 들어온다.
난 위에서 부터 1,2,3을 처리하고 싶은데 어떻게 해야하냐고
i--처럼 역순으로 해야하나고 말이다.
이글의 앞에 컬랙션이라고 이야기 했듯이
이 컬랙션들은 ADD형태로 내부에 사용되는 녀석들을 대입해줘야 한다.
그 대입의 순서에 따라서 위와 같은 형태가 나타나게 되는것이다.
디자이너에 가서.. 컬랙션 대입하는곳을 찾아보자.
자 보이듯이 라벨1이 가장 늦게 들어가니 순서가 늦게 되는것이다.
이 순서를 원하는데로 변경해 두자.
사용하는 ADD 이런매서드로 말이다.
자 이제.. Foreach의 설명을 마칠까 한다.
Foreach로 그룹박스안에것도 돌리기 위해서 다시금 foreach안에 또 foreach구분을 넣어서 그룹박스일때 돌려야 할것이다.
뭐.. 그렇게 한들 어떻다고 생각한다면.. 어쩔수 없다.
나야.. 그렇게 작성된 소스 수정한다고 또 고생길이 열리는수 밖에..
윈폼프로그램에 빠질수 없는것이 있다면 위와같은 폼에서 입력후
모든 입력값을 지워야 하는것이다.
초기화란 어디가나 꼭 있어야 하는것이니 모두들 동감하리라 믿는다.
위의 예제에서 보듯이 그룹박스내에 포함된 택스트 박스는 foreach만으로는 초기화가 되지 않을것이다.
그럼 어떻게 해야 하는가? 바로 그 두번째 방법을 사용해야될것같다.
뭐 대단한 방법이라고 기것해봐야 재귀호출일뿐인데 말이다.
코드는 두어줄이라서 설명할것이 없다만
그래도 모르겠다면 질답란에 적어두면 누군가 상세히 설명을 해줄것이다.
함수는 이것이고
private void getControls(Control.ControlCollection Ocontrol, ref ArrayList Space)
{
for (int i = 0; i < Ocontrol.Count; i++)
{
Space.Add(Ocontrol[i]);
if (Ocontrol[i].Controls.Count > 0) getControls(Ocontrol[i].Controls, ref Space);
}
}
호출은 이렇게 하자.
ArrayList AL = new ArrayList();
getControls(this.Controls , ref AL);
for (int i = 0; i < AL.Count; i++)
{
if (AL[i] is TextBox)
((Control)AL[i]).Text = "초기화";
}
자 이렇게 하면 결과는..?
그룹박스 안에 있는것까지 깔끔하게 처리가 된다.
이럼에도 시비(?)를 거는 친구들이 가끔 있을듯 해서
조금 더 복잡하게 만들어서 테스트를 해보자.
아주 가볍게 처리가 되지 않는가?
폼에.. 탭에.. 패널에 그룹박스에 다시 그룹박스에 탭에 등등
을 해도 잘 처리가 된다.
참고로.. 귀찮아서 적지는 않았지만..
this.Controls["textBox1"].Text = "ddd";
이런식으로 사용하거나 또는 find를 가지고 바로 컬랙션안의 포함된 컬랙션내부 개체를 억세스 하거나
하는 방법이 있다.
this.Controls[0].Text = "ddd";
문제는 이건 적을만한 수준이 아니란 거다..
이렇게 쉽게(?) 적었는데도 모르겠다면. C#책에서. Collection 에 대해서 공부해 보길 권한다.
ps) 노파심에 끄적이자면.. 실무에서는 이것보다는 좀 더 세련된 형태로 함수를 만들어서 사용한다.
잘.. 다듬어서 사용하길 권한다.
ps2) 예외 사항에 대처하는법에 대해서 몇가지 더 끄적여 보자. (댓글 덕분에 더 적어본다.)
예외사항은.. 여러가지가 있겠는데 결론적으로 말해서 특정한 녀석만 위의 루틴이 돌아갈때 처리가 되지 않아야 된다는 이야기다.
만약 그런것이 아주 많다면.. IF를 이용해야 겠지만.
하나 둘의 경우 Find를 사용해 주는게 좋다.
강좌를 적고 이미 이 프로젝트를 날린 입장이라.. 예제를 더 못 보여주는것은 아쉬우나.
--> this.Controls.Find("textBox1", true);
이런형태를 통해서 대부분 예외를 처리하는걸로 알고 있다.
여기서 핵심은 뒤에 true 를 주는것이고 내부적으로(c#)에서 재귀호출함수를 이용해서 컬랙션개체 안에 있는것들까지
찾아서 그 인스턴스값을 돌려준다. 단지 문제는 귀찮게도 control[] 배열로 돌려준다는것이긴 하지만..
그래서 개인적인 입장에서는 앞에서 만든 ArrayList 에서 특정값을 제거한다. remove 를 통해서 돌아야 하는것중
예외사항을 제거하고 돌린다.
위의 재귀호출함수는 이해를 위해서 3줄로 작성되어 있지만.. 실제적으로 사용하고 있는것은.. 함수가 아닌 클래스로
대략.. 30댓줄의 몇몇개의 기능이 추가되어 있다. 귀찮게 arraylist를 선언하지도 않고.. 이런 예외를 편하게 제거하도록 말이다. 개인적 취향에 맞도록 잘 만들면 되지 않을까 한다.
ps3) 댓글의 관심에 감사함을 전한다.
'C# > 일반적인코딩' 카테고리의 다른 글
ListView에서 Drag & Drop (0) | 2008.12.29 |
---|---|
C#의 Setting Class (0) | 2008.11.22 |
시리얼 장비 통신에 대한 짧은 이야기 (0) | 2008.11.21 |
휴~~~~~~~~
여기까지가 데브에 적은 마지막 강좌이다.
21편부터는 블러그에 먼저적게 될듯 후후..~~ 힘들다 자료 옮기기..
//----------------
자 이번에는 아주 단순한 그리고 정말 단순한것을 해보자.
우리는 코딩을 하면서 어디서나 빠지지 않는 초기화와 입력값을 다 입력한 뒤에 엔터를 치면 다음 컨트롤로 가는 코딩을 처리하게 된다.
이것은 일반적으로 너무 단순한것이라 문제이다.
왜냐면 이게 단순하므로 대부분의 사람들은 이것을 코딩으로 처리하지 않고 일일이 마우스로 눌러서 이벤트 코드가 자동으로 만들어진 상태에서 적기 때문이고 겨우나마 조금 개념이 있는 프로그램머의 경우 델리게이트로 하나의 매서드로 모을수 있다는것을 알고 여러 컨트롤을 선택한 다음 키 다운 이벤트에다가 넣어주곤 한다.
하여간 이렇게 단순한것을 코딩하는데 시간을 소비하게 되는데 아주 코딩이란것을 처음 접하는 사람이 문제이다. 정말 순진무구하고 또한 열성적으로 100개의 컨트롤이 있으면 100번 적어준다는게 문제이다. 아마도 그분도 for 문을 배웠겠지만 당장 업무가 그러할진데 어떻게 하겠는가.
내가 이글을 적으면서도 위의 사실이 거짓말같은 생각이 들정도로 열성적으로 코드를 만들었더랬다.
한번은 내가 가서 이렇게 하면 된다고 슬그머니 알려준적도 있는데 자신이 아는길 이외에는 하고 싶지도 않은듯 오로지 무지막지하게 코드를 증가시키는 분이 있었다. 그분의 여러코딩까지 합쳐서 폼클래스에서만 전체코드만 이만줄이 넘었더랬다.
나중에 내가 수정하는것도 보통애먹은게 아니였는데 이미 그렇게 적은 코드를 아래와 같이 바꾸는게 쉽지 않기 때문이다.(이유는 실무에서 당해보면 안다.)
이미 아래의 방법은 널리고 널린 수준의 형태이나 아직도 사용하지 않는이가 많은듯 해서 예제를 만들어 보았다.
단순예를 들어보자.
이것은 방금만든 클래스인데.. 엔터를 치면.. 위의 생성한 이벤트가 실행될것이다.
폼의 시작시에
이렇게만 적어주면 이제 어떤 택스트박스를 가져다 놓고 엔터를 쳐도 무관하다 당연히 기존의 이벤트와도 무관할것이다.
대규모 테스트를 위한 상황을 만들어 보자.
우리는 일반적으로 각 컨트롤마다 있는 Tab Index를 이용하게 되는데 탭을 치면 자동적으로 다음값으로 이동한다.
이것은 Control클래스에 기본속성으로 상속이 되어 있다
간단하지 않은가?
엔터키를 칠때 다음으로 이동하는 코딩은 그야말로 VB6.0부터 애용되는 방식이 있다.
이렇게 적어주면 된다.
조금 c#적으로 한다면..
이런 방식도 있겠다.
엔터를 치면 띵하고 소리가 나는데 이 소리에 상당히 거슬려 하는경우가 많다. 그러므로 이것을 없게 해주면 된다. 어떻게 할까?
간단하다. 키를 전달하지 않으면 되는것이다. 예전 vb쪽에서는 Keycode = 0를 대입하거나 해서 엔터키가 아닌것으로 처리하기도 했다.
객체지향의 유리한점은 객체에 모든게 있지만… 단점은? 사용자가 그 속성을 안써보면 잘 모른다는것이다.
e.SuppressKeyPress = true;
이렇게 한줄만 적어줘도 알아서 처리가 된다. 말그대로 키값을 억압하는것이다. VB6의 코딩에 익숙하다면..사실상 C#도 상당히 유사한게 많다.
이런 기초적인것들이 대부분 알고 있음에도 잘 공개하질 않는다. 아님 잘 찾아보질 않거나
덕분에 이런질문류도 여전히 질답란을 종횡무진하고 있다.
이렇게 단순하게 택스트 박스만 소스를 적어 놓았다고 아무생각없는 사람들이 저기 있는듯 싶다.
당신의 갈길은 아직 멀다. 정말 이것은 간단하면서도 좋은 코드들이지만 택스트박스가 멀티라인이라면 어떻게 할것인가? 또는 콤보박스에도 포커스를 맞추어야 하고
여러가지 추가할것들이 분명 많다. 위의 코드에 빈곳이 보이지 않는가?
그리고 공개해 보라.~~ 나도 배우고 싶다.
두번째로 초기화가 되겠다.
초기화 별게 있는가? 위에서 잠시말했듯이 초기화와 엔터키이동들은 반드시 열외되는것을 지정하는 방법이 있어야 한다. 그것은 당신을 믿겠다.
초기화도 당신이 충분히 할 수 있을것이다. 그저 위의 클래스에 적당히 하나 추가해주자.
이제 소스를 적지 않아도 될 수준까지 충분히 foreach 의 구문에 익숙해 졌다고 생각한다.
택스트 박스 초기화 / 콤보박스 초기화 / DataView 초기화 등등말이다.
AllClear같은건 위의걸 한번에 호출해주면 될것아닌가.
당신의 댓글로 소스를 한번 달아주는것은 어떨까?
원본 위치 <http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=18&MAEULNO=8&no=1606&page=1>
'C# DB 코딩 강좌' 카테고리의 다른 글
C#을 이용한 DB코딩 21 (0) | 2008.11.19 |
---|---|
C#을 이용한 DB코딩 19 (0) | 2008.11.14 |
C#을 이용한 DB코딩 18 (0) | 2008.11.14 |
C#을 이용한 DB코딩 17 (0) | 2008.11.14 |
C#을 이용한 DB코딩 16(실습파일포함) (0) | 2008.11.14 |
C#을 이용한 DB코딩 15 (0) | 2008.11.14 |
C#을 이용한 DB코딩 14 (0) | 2008.11.14 |
C#을 이용한 DB코딩 13 (0) | 2008.11.14 |
C#을 이용한 DB코딩 12 (0) | 2008.11.14 |
C#을 이용한 DB코딩 11 (0) | 2008.11.14 |
설명들이 조금씩 짤려서 앞뒤가 잘 안맞는것은
이미 적은글을 여기 올리면서 짜르기 때문이다.
너무 사적인 이야기들은 역시 옳지 않은듯 싶기도 해서
DB시리즈는 20편까지로 마무리를 하고 뒷이야기들은 블러그에서 열심히 하는게 좋을듯 싶다는
생각을 한다.
Tstory인가 초청장 하나 신청해 보았지만 어케된지 오지도 않고 팔자려니 해서
그냥 바로 이글루스에 집을 차렸다.
//-------------------
자 앞서 설명을 했으니
이제 화면을 리플랙션을 통해서 datatable로 변경해 보자.
대략의 모습은 이렇게 넘어가게 될것이다.
뭐 하나 달라질것도 없이 앞서 셋팅한것과 별 다른 모습이 아니라고 생각된다.
앞서이야기 한것과 동일하게 foreach를 돌아서 알아서 만들어 주게 될것이다.
그럼 사용법을 대략 살펴 보도록 하자.
이런폼이 있다면.. 아니다.. 일단은.. 폼의 입력값의 증가도 보여줘야 할테니…
폼을 이렇게 만들었다고 치자. 즉 입력값을 3개라고 생각하자.
위의 콤보박스 그리고 아래의 2가지 필드
여기서.. 컴퓨터 ID는 고정값이라고 예상을 해보자. (이것은 앞 강좌에서 테이블 설계쪽을 유심히 보도록 하여라)
자 이렇게 입력을 했다고 보자.
이런식으로 고정값의 경우에 같은 형태로 입력이 되고 Code값과 Value값을 가져온다.
그럼.. 필드의 증가와 값의 증가를 동시에 테스트 해보자.
예를 위해서 이번에는 모니터의 값도 고정시키도록 하자.
실제 호출코드는 변경이 없이 전과 동일하다.
하지만.. 우리가 폼을 변경했다면..
이런식으로 입력할것들이 늘었다고 생각하자.
즉.. 고정필드는 고정필드에 따라 증가시켜줄것이고 코드와 값은 줄의 값으로 만들어 줄것이다.
다시금 말해서
뷰의 상황의 코드는 언제나 변경이 가능하다는것이다.
뷰의 경우는 필드가 더 생기거나 배치를 변경할수도 있을것이며 늘어날수도 있을것이다.
하지만 그것과 무관하게 우리는 알아서 DataTable을 통한 현재 뷰의 입력값을 받아올수 있을것이다.
자 이정도 했으며 아마도 앞서 이야기한 이것과 다른형태의 경우 필드와 바로 매칭되는 형태는 쉽게 코딩을 할 수 있을것이다.
이런식으로 입력했다면..
이렇게 구현이 될것이다.(한 6줄 되더라)
실제적으로 구현해봐야 되는 이유는 현재에는 보이지 않겠지만 실무에서 사용하려고 하면 반드시 매칭되지 않아야 되는녀석들도 있다. (물론 지금의 형태에서 쉽게 Tag값을 안 넣어주면 된다. )
또한 위의 code / value라고 적은것들을 고정값이 아닌 외부에서 받아서 처리한다던지 전체 코드를 변경하지 않고도 유연하게 만들기 위해서는 왜 이렇게 했는지 잘 살펴보길 바란다.(안보면 그만이지 뭐)
원본 위치 <http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=18&MAEULNO=8&no=1605&page=1>
'C# DB 코딩 강좌' 카테고리의 다른 글
C#을 이용한 DB코딩 21 (0) | 2008.11.19 |
---|---|
C#을 이용한 DB코딩 20 (0) | 2008.11.14 |
C#을 이용한 DB코딩 18 (0) | 2008.11.14 |
C#을 이용한 DB코딩 17 (0) | 2008.11.14 |
C#을 이용한 DB코딩 16(실습파일포함) (0) | 2008.11.14 |
C#을 이용한 DB코딩 15 (0) | 2008.11.14 |
C#을 이용한 DB코딩 14 (0) | 2008.11.14 |
C#을 이용한 DB코딩 13 (0) | 2008.11.14 |
C#을 이용한 DB코딩 12 (0) | 2008.11.14 |
C#을 이용한 DB코딩 11 (0) | 2008.11.14 |
자. 이제는 기본적인 형태는 대략의 모습을 갖춘것 같다.
물론 앞서 팩토리와 함께 Strategy 패턴과, 기본적 Sington 정도를 같이 설명해주고 가야겠지만
다들 별 관심이 없는듯 하니 마무리를 향해서 나아가는게 더 좋을듯 싶다.
기본적으로 VS … 아니면 MS에서는 아주 쉽게 DB코딩을 하도록 여건을 만들어 주었음에도 우리는 그것들을 사용하지 않는다.
물론 알면서 사용안하는경우가 대부분이지만 실제적으로 소규모 프로젝트에서는 이런 제공된것들을 사용해 주게된다면 하나의 DB프로그램을 만드는데 걸리는 시간은 생각외로 짧은 시간내에 완성을 할수도 있다.
내가 처음 DataTable에 대해서 뒤적 뒤적 MSDN을 살펴보다가 놀란것은 GetChanges 매서드였다.
MSDN의 어느페이지 인지도 모르겠다만 이녀석이 덩그러이 나오던데 오~~ 이런게 다 있나 싶은 생각이 들었던것이다. 예전에는 아무생각없이 Dataset개체에 대해서 생각을 했던것들이 바뀌게 된 시발점이 이 함수였다. 일반적인 다중컬랙션 정도로 생각했던 개념이 깨어진 시발점이다.
결국 dataset을 알면알수록 저 매서드는 빙산의 일각이고, 생각외로 덩치가 큰 온갖 만능(?)의 클래스라는 생각이 드는걸 어떻게 설명을 할 수 있을까?...물론 저것 혼자가 아니라 저녀석을 기본으로 대부분의 컨포넌트가 잘 어우러지게 만들어 놓았기 때문이겠지만..
//----------------
Insert/update 나 delete를 한다고 생각할때 기본적인것은
입력할 필드값이 있어야 한다. <---
입력할것에 대한 데이터가 테이블의 컬럼을 늘리는것으로 감당할수 없는 경우가 있다.
또는 추가의 가능성이 높거나. 여타 몇가지 이유로 인하여
그럴경우에는 위와 같은 코드형태의 맵핑을 사용하게 되는데
-------------------------------------------------------------------
컴퓨터ID 부품Code 값
-------------------------------------------------------------------
Aaaaaa VGA100 ATI 비디오
Aaaaaa Hard100 100G 시게이트 하드
Aaaaaa RAm100 삼성2G 원칩
등등으로 맵핑을 시켜가는것이다.
잠시 화면단으로 예를 들면..
이런방식인데 업무상의 추가로 계속 늘어난다면..???
이렇게 설계했던것을
이렇게 바꾸어야 된다는 이야기다..
즉.. 컬럼을 늘려야 되니 여러가지 같이 변경해줘야 되는일이 발생하며 이것은 프로그램의 신뢰도 문제로 이어지게 된다.(사실상의 핵심은 귀찮다.)(궁금하거든 테이블의 컬럼을 늘려보아라.)
그렇다고 위의 이야기 처럼 단순 코드매핑을 꼭 해란게 아니다. 업무에 따라서..
그때그때 달라요~~~
테이블의 설계는 업무에 따른것이므로 지금 여기 적는 C# 강좌에서 관여할 일이 아니다. 만약.. 다른강좌(?)를 적게 된다면.. 그곳에서 따로 이야기 해주겠지만..
여하튼 지금은 이 두가지 경우에 대해서 모두 다 잘 처리되도록 해야된다는 이야기다.
이 두가지 형태의 테이블의 방식이 둘 다 처리해야 된다는것이다.
이런것은 사실상 문제가 아닌 SP에서 처리될것이므로 문제가 없긴 하다.(만약 한다면..)
그러나 최소한 지금 적는 코딩에서는 고려해가면서 이야기를 해줘야 되지 않겠는가.
자 두개의 핵심은 무엇일까? 둘다.. 결국은 하나의 값만 화면에 뿌려준다는것이 공통점이다.
다시금 설명하자면 위의 테이블이 두가지 방식이 있더라도 우리의 화면은 동일한 형태로 보인다는것이다.
그럼 뭐가 문제인가.. 첫번째의 경우테이블의 code값을 우리의 컨포넌트에 바로 1:1 셋팅을 하면 되는데 두번째의 경우는 테이블의 컬럼값을 셋팅해야 한다는 것이다.
쉽게 말해서.. 위에 적은말은.. 몰라도 된다.
뭐… 글을 너무 쉽게 적으려다 오히려 어렵게 적은듯 싶다.
앞서 컨포넌트와 데이타셋의 값을 매칭시키는 방식처럼 반대로
재귀호출된 값의 Foreach또는 리플랙션의 루프를 돌면서 설정된 값을 가져와야 된다.
그리고 그 설정된 값이 컨트롤의 특정값(여기서는 Tag)값과 설정된 값을 가져와서 하나의 컬랙션을 만들어 주면 되는것이다.
두번째로는 그 컬랙션을 받아서 DB에 인서트 하는게 기본적인형태일것이다.
(예제는 엑셀을 DB로 사용해서 계속 진행하겠다. 여로모로 시각적으로 보여주기 편하기 때문이다.)
테이블을 하나 만들고
테이블을 만든다.
자.. 여기서 문제가 있을것이다. computID의 경우는 고정값이 될것이고
-------------------------------------------------------------------
컴퓨터ID 부품Code 값
-------------------------------------------------------------------
Aaaaaa VGA100 ATI 비디오
Aaaaaa Hard100 100G 시게이트 하드
Aaaaaa RAm100 삼성2G 원칩
부품코드와 값만 계속 변경되는 형태로 쌓이는 것이다.
문제는 이것만이 아니다.
예를 들어서 고정값을 하나 더 늘리게 된다면 InputTime은 동일하게 처리가 될것이다.
또는
형태로 고정값이 계솔 늘어나는것을 감수해야 된다는 이야기다.
하지만.. 일반적으로 code 와 value의 경우는 고정적으로 두개라고 확정되는경우이고
즉 어쩔수 없이 우리는 다중열의 값을 가지는 형태로 사용해야 되는데 여기서 가장만만한게 DataTable이 되겠다.
------------------------------------------------------------------------------------
두번째 방식을 살펴 보자.
두번째의 경우는.. 값이 들어가는것 자체가 한줄로 모든값이 들어갈것이다.
컬럼명과 값 이런식으로 2개씩만 짝지워 지니 Dictioary를 사용하면 좋을것 같다.
여기서 우리는 효능이나 여러가지 스피드(?) 보다는 코더의 편리성을 생각해서 단순하게 코딩을 해야되지 않겠는가? 그렇다. 무시하고 이것도 dataTable로 처리를 하도록 하자.
그래야 최소한 입력루틴이 하나만 가지고 위의 두가지 방식을 다 처리할 수 있을것이다.
지금은 다루어지지 않았지만. 세번째로
DataTable의 GetChanges 매서드를 사용하게 될때 즉 그리드를 주고 거기서 변경된 값만을 DB에 처리해줄때도 사용하기 위해서는 모두다 집약시키는게 좋을듯 하다.
변화가 많고 변경이 있는것에 모두 적응하기 최적화라는 입장을 가지게 된다면 좋은라이브러리이나
이것은 또한 신뢰도적인 입장 안정적 코드의 입장에서는 반비례적인 현상을 가지게 한다.
글쓴이의 경우 최적화 또는 적합성적인것 보다는 코딩하는 사람의 단일한 인터페이스적인 형태를 더 선호한다. (이런 선호성은 Winform 코딩쪽에는 좋은선택으로 보여진다.)
Ps) SqlCommandBuilder 의 함수는 단일 테이블에 대한것만 생성
원본 위치 <http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=18&MAEULNO=8&no=1604&page=1>
'C# DB 코딩 강좌' 카테고리의 다른 글
C#을 이용한 DB코딩 21 (0) | 2008.11.19 |
---|---|
C#을 이용한 DB코딩 20 (0) | 2008.11.14 |
C#을 이용한 DB코딩 19 (0) | 2008.11.14 |
C#을 이용한 DB코딩 17 (0) | 2008.11.14 |
C#을 이용한 DB코딩 16(실습파일포함) (0) | 2008.11.14 |
C#을 이용한 DB코딩 15 (0) | 2008.11.14 |
C#을 이용한 DB코딩 14 (0) | 2008.11.14 |
C#을 이용한 DB코딩 13 (0) | 2008.11.14 |
C#을 이용한 DB코딩 12 (0) | 2008.11.14 |
C#을 이용한 DB코딩 11 (0) | 2008.11.14 |
오늘의 이야기를 시작해 보자.
앞서 그린 낙서적 스타일 그림을 보도록 하자.
이런게 있다면..
여기서 우리는 M을 변경해보도록 하자…
어쩌라고?를 외칠건데… 여기서.. 저렇게 되기위해서 우리는 머리를 굴려야 하는것이다.
C에서 M을 호출하는 루틴을 보면..
이 둘중에 하나를 적을수 있을것이다.
위의 코드는 둘다 동일하다.
예를 들어서
USB PORT = new 메모리스틱();
메모리스틱 PORT = new 메모리스틱();
과 동일하다는 이야기다.
처음 OOP를 접하는 사람들은 이런걸 잘 이해하지 못하는 경향이 있다.
예를 다시금 들어보자.
에서 우리는 이걸 평소에 하도 많이 사용하니 개념을 가지지 않는데
만 존재한다고 생각해 보자.
저 문자열을 어딘가 다시 사용하기 위해서는 어떻게 해야할까?
저 문자열이 적혀 있는 어느 공간 또는 주소값을 우리가 인식할수 있는곳에 넣어야 하는것이다.
실제적으로 tem에는 주소값이 들어가게된다.
조금 다르게 설명을 해보자.
여기서
라고만 하면.. 아래의 테스트 클래스에 적어놓은 "test class"가 출력이 될것이다.
OOP를 처음 접할수록
왠지 이렇게 적지 않으면 큰일이 날것 같다고 생각하는게 첫번째 문제이다.
뒤에 test() 라고 괄호를 적는것은 당신이 호출할 생성자함수를 말하는것이다.
(매서드와 함수라는 용어를 같이 사용할것이다. 이 둘은 같은 의미이다.)
단지 우리가 이렇게 적는것은 test란 개체를 나중에 이용하기 위해서 주소값을 가지는것을 의미한다.
그럼..
이 문장에 대해서 다시금 이야기를 해보자.
인터페이스로 적은것 또한 주소값을 저장하니 크게 문제없이 동일한것이 된다는 이야기다.
USB PORT = new 메모리스틱();
메모리스틱 PORT = new 메모리스틱();
와 마찬가지로..
USB PORT = new 프린터();
도 당연하게 이해해주기 바란다.
우리가 95년도에 처음 windows가 P&P라는 (PLUG & PLAY)란 이야기가 나왔을때 그저 오~~ 라는 생각을 가졌는지 모르겠으나 실제적으로 이것이 가능하게 되는 개념이 지금의 개념이다.
이미 10년도 휠씬전에 나온개념이고 이 개념덕분에 OOP가 살아있는것이다. (허접한 은닉성같은건 잊어버려라..)
//-------------------------------------------------------------------
어찌되었든.. 모듈을 변경하기 위해서.. (그림을 봐라 ms-sql에서 오라클로 변경이 되었다.)
컨트롤에 적은 코드를...
하여간.. 한줄을 바꾸어야 한다는것이다.. (한줄.. ㅠ.ㅠ)
앞서 열심히 그림을 그려줬지만.. 이 C라고 적은녀석은 변경하기 싫다는것이다.
변경이란 다시 컴파일을 해야된다는 이야기 이고 게다가 저렇게 선언한 코드가 매 폼마다 있다고 가정한다면… 그것참 거시기 한것이다. 물론 그렇게 코딩할수도 있고 한곳에다만 적어서 코딩할수도 있을것이다.(역시 소형프로젝트에는 절대적 무용지물인 이야기들이다..)
그래서 이것을 분기분으로 작성하기도 하자.
말하자면 이정도 될것이다.
이것을 내부에 두는게 아니라… 외부의 클래스로 만들어 두고 그것을 함수로 불러다 사용하자는 것이 이 심플팩토리의 이야기다.
왜 이렇게 하냐면 앞서 만들었듯이 계속 Excel이라든지 Access라든지 선택사항이 늘어나기 때문에 이 선택사항에 대한 함수만 변경하기 위해서 변경부위를 밖으로 빼자는 이야기다.
이걸 가지고 일반적으로
함수형 팩토리 패턴
또는
Simple Factory 패턴이라고 한다.
뭐 말그대로 심풀하고.. 하나의 함수로 이루어질 수준이라서 굳이 설명할것들도 없다.
마지막으로 위의 이야기가 다 필요없는.. 기본적으로 ms에서 이것까지 지원하도록 만들어 두었다.
http://mkex.pe.kr/kims/bbs.php?table=Tbl_Lecture_CSharp&query=view&uid=68&p=1
이 링크의 강좌를 보도록 하여라..
원본 위치 <http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=18&MAEULNO=8&no=1602&page=1>
'C# DB 코딩 강좌' 카테고리의 다른 글
C#을 이용한 DB코딩 21 (0) | 2008.11.19 |
---|---|
C#을 이용한 DB코딩 20 (0) | 2008.11.14 |
C#을 이용한 DB코딩 19 (0) | 2008.11.14 |
C#을 이용한 DB코딩 18 (0) | 2008.11.14 |
C#을 이용한 DB코딩 16(실습파일포함) (0) | 2008.11.14 |
C#을 이용한 DB코딩 15 (0) | 2008.11.14 |
C#을 이용한 DB코딩 14 (0) | 2008.11.14 |
C#을 이용한 DB코딩 13 (0) | 2008.11.14 |
C#을 이용한 DB코딩 12 (0) | 2008.11.14 |
C#을 이용한 DB코딩 11 (0) | 2008.11.14 |
실습용 프로젝트를 받아서 해보자.
실습을 하도록 하자.
WPF와 asp.net까지 View를 보여주고
그런다음 Singleton 패턴과 Factory 패턴까지는 해주고 실습을 해야될것인데
아마도 이해를 못하는것인지 아님 너무 하찮은 수준이라서 그런것인지.
아무런 댓글이 없으니 가늠할수가 없다.
엑셀용 DB 코드를 이용해서 실습용 프로젝트를 올려둔다.
이런 프로젝트를 하나 만들었다.
그러니 기본적인 개념만 쉽게 이해하면.. 프로그램을 좀 더 빠르게 그리고 유동적이고 수정이 용의하게 만들수 있다.
Ps1)
글을 적을때마다.
저글을 보면.. 낙서로 도배를 하는데도 아직 이글이 삭제되지 않아서
신기하게 생각하고 있는중이다.
원본 위치 <http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=18&MAEULNO=8&no=1596&page=1>
'C# DB 코딩 강좌' 카테고리의 다른 글
C#을 이용한 DB코딩 21 (0) | 2008.11.19 |
---|---|
C#을 이용한 DB코딩 20 (0) | 2008.11.14 |
C#을 이용한 DB코딩 19 (0) | 2008.11.14 |
C#을 이용한 DB코딩 18 (0) | 2008.11.14 |
C#을 이용한 DB코딩 17 (0) | 2008.11.14 |
C#을 이용한 DB코딩 15 (0) | 2008.11.14 |
C#을 이용한 DB코딩 14 (0) | 2008.11.14 |
C#을 이용한 DB코딩 13 (0) | 2008.11.14 |
C#을 이용한 DB코딩 12 (0) | 2008.11.14 |
C#을 이용한 DB코딩 11 (0) | 2008.11.14 |
폼 셋팅의 클래스를 살펴보자.
이녀석은 앞서 이야기 했듯이 리플랙션을 이용해서 폼의 컨트롤을 가져와서 foreach로 돌리는것에 불과하다.
나머지는 아래 다른 강좌에 적은것의 활용이다.
데브의 폼의 한계로 인해서 오른쪽으로 더 큰 그림이 들어가면 글자가 깨지므로 아래에 소스를 첨부한다.
class FormSetting
{
Form _Form;
IDataBase DB;
public FormSetting(Form FormRef)
{
_Form = FormRef;
DB = new setDBExcel(@"c:\test.xls");
}
public void AutoSetting()
{
FieldInfo[] controlA = _Form.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
foreach (FieldInfo ctl in controlA)
{
if (ctl.GetValue(_Form) is TreeView) setTreeView((TreeView) ctl.GetValue(_Form));
if (ctl.GetValue(_Form) is ListView) setListView((ListView)ctl.GetValue(_Form));
if (ctl.GetValue(_Form) is ComboBox) setComboBox((ComboBox)ctl.GetValue(_Form));
if (ctl.GetValue(_Form) is DataGridView) setGridView((DataGridView)ctl.GetValue(_Form));
}
}
private void setListView(ListView ctl)
{
}
private void setGridView(DataGridView ctl)
{
string TagID = (string)ctl.Tag;
if (TagID != "")
{
ctl.DataSource = DB.callSQL("select * from [combo$] where comboid = '" + TagID + "'").Tables[0];
}
}
private void setComboBox(ComboBox ctl)
{
string TagID = (string)ctl.Tag;
if (TagID != "")
{
DataTable DT = DB.callSQL("select * from [combo$] where comboid = '" + TagID + "'").Tables[0];
ctl.DataSource = DT;
ctl.DisplayMember = DT.Columns["Expression"].ToString();
ctl.ValueMember = DT.Columns["value"].ToString();
}
}
private void setTreeView(TreeView ctl)
{
string TagID = (string)ctl.Tag;
if (TagID != "")
{
DataTable DT = DB.callSQL("select * from [treeview$] where treeviewID = '" + TagID + "'").Tables[0];
ctl.Nodes.Add(DT.Rows[0]["Expression"].ToString());
new setTreeView(ctl, DT);
}
}
}
//---------------------------------------------------------------------------
데이타는 DB를 사용하기에는 교정이 귀찮음으로 인해서 가볍게 엑셀을 사용했다.
앞서 설명한 엑셀 DB클래스를 이용해서 처리했다.
각 컨트롤에는 바인딩에 필요한.. TAG를 적어야 하는데
그것이야.. 알아서 하면 될것이다.
원본 위치 <http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=18&MAEULNO=8&no=1595&page=1>
'C# DB 코딩 강좌' 카테고리의 다른 글
C#을 이용한 DB코딩 20 (0) | 2008.11.14 |
---|---|
C#을 이용한 DB코딩 19 (0) | 2008.11.14 |
C#을 이용한 DB코딩 18 (0) | 2008.11.14 |
C#을 이용한 DB코딩 17 (0) | 2008.11.14 |
C#을 이용한 DB코딩 16(실습파일포함) (0) | 2008.11.14 |
C#을 이용한 DB코딩 14 (0) | 2008.11.14 |
C#을 이용한 DB코딩 13 (0) | 2008.11.14 |
C#을 이용한 DB코딩 12 (0) | 2008.11.14 |
C#을 이용한 DB코딩 11 (0) | 2008.11.14 |
C#을 이용한 DB코딩 10 (0) | 2008.11.14 |
자.. 이제서야.. 제 1강에서 적은? 두번째였나.
알아서해() 라는 매서드 하나를 호출하면 모든게 되는것을 만들어 볼것이다.
별거 아닌걸 위해서 우리는 참 먼길을 돌아 돌아 온듯 싶다.
폼의 셋팅에는 두가지가 있는데 하나는 앞서 이야기한 재귀호출을 이용해서 처리해야 하고
두번째도 앞서 적어둔 Refection 을 이용하는 법이 있다.
어느게 좋다고는 말해주기 힘드나 여러모로 코드를 줄이고 귀차니즘에 의거해서 리플랙션을 이용하자.
재귀호출을 이용해서 처리하거나 리플랙션을 이용하거나 둘다 폼안에 포함된 그룹박스들이 처리된다.
(이 허접한 글도 좀 있어보이는걸 사용해야 좀 품위라는게 생길까봐 그런다.)
자 폼셋팅에 따른 클래스를 작성해 보자.
가볍게 작성하면 이런 모습이 될것이다.
그리고 나서 폼을 셋팅해보자.
이렇게 세팅후에 코딩은 어떻게 해볼까?
폼 코딩은 이게 전부이다. 하지만 버튼을 누르게 되면 아래와 같이 자동적으로 콤보박스와
트리뷰 그리고 그리드가 셋팅이 될것이다.
그럼 이게 뭐냐..
단지 비하인드에서 셋팅한것에 지나지 않냐고 생각할수도 있겠다.
이미 앞에 글에서 설명했듯이 이것은 뷰라는 코딩을 하는 이야기를 하는것이다.
우리의 뷰는 어떻게 변할지 아무도 모르는 것이다.
사용자가 이 화면이 아닌 다른화면을 요구했다고 생각해 보자.
우리는 뷰에 해당하는 폼을 다시 디자인 해야 될것이다.
그럼.. 폼 1을 그대로 둔채로 다시금 폼 2를 디자인 해보자.
사용자 2는 이런 폼을 요구했다고 생각해 보자..
이 폼의 코딩은 폼 1과 동일할것이다.
전체를 다 적어두 이렇게 밖에 적을게 없다.
그럼… 폼2의 실행화면은 어떻게 나오게 될까?
결론적으로는 앞서 이야기한 뷰라는것은 보여주기 위한것에 집중해야 한다는 이야기다.
보여주는것을 어떻게 보여주는가에 코딩하는것에 집중한다면 나머지는 컨트롤에서 이것을 해결해 줘야 코딩을 쉽게 변경할수 있다는 이야기를 하는것이다.
1강에서 적은 알아서해() 라는 이야기 하나를 설명하기 위해서 얼마나 많은 글을 적어야 했는지 참 고생스럽다.
원본 위치 <http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=18&MAEULNO=8&no=1594&page=1>
'C# DB 코딩 강좌' 카테고리의 다른 글
C#을 이용한 DB코딩 19 (0) | 2008.11.14 |
---|---|
C#을 이용한 DB코딩 18 (0) | 2008.11.14 |
C#을 이용한 DB코딩 17 (0) | 2008.11.14 |
C#을 이용한 DB코딩 16(실습파일포함) (0) | 2008.11.14 |
C#을 이용한 DB코딩 15 (0) | 2008.11.14 |
C#을 이용한 DB코딩 13 (0) | 2008.11.14 |
C#을 이용한 DB코딩 12 (0) | 2008.11.14 |
C#을 이용한 DB코딩 11 (0) | 2008.11.14 |
C#을 이용한 DB코딩 10 (0) | 2008.11.14 |
C#을 이용한 DB코딩 9(인터페이스) (0) | 2008.11.14 |