개발 이야기/Visual C#2011. 4. 21. 20:48

벌써 3번째입니다. ^^
오늘 주제는 작은 함수에 대한 부분인데요. 여기서 말하는 함수라는 것은 메서드단위로 생각하시면 됩니다.
사실 메서드 보다는 JIT에 대한 이해라고 생각하셔도 됩니다.

 
아시다시피 우리가 작성하는 C#, VB기타 소스코드는 컴파일되면 MSIL이라는 중간언어로 생성됩니다. 이는 닷넷런타임에서 JIT컴파일러가 이 MSIL코드를 머신(machine) 코드로 바꾸도록하는 것이지요~ 여기서 JIT 컴파일러가 IL코드를 읽어오는 부분을 보시면 왜 우리가 작고 간단한 메서드로 구현을 해야하는지 알게 됩니다.
저희는 다음과 같이 소스코드를 작성했습니다.

 
    class Program
    {
        static void Main(string[] args)
        {
            string result = BuildMsg(true);
        }

        public static string BuildMsg(bool takeFirstPath)
        {
            StringBuilder msg = new StringBuilder();
            if (takeFirstPath)
            {
                msg.Append("A problem occurred.");
                msg.Append("\nThis is a problem.");
                msg.Append("imagine much more text");
            }
            else
            {
                msg.Append("This path is not so bad.");
                msg.Append("\nIt is only a minor inconvenience.");
                msg.Append("Add more detailed diagnostics here.");
            }
            return msg.ToString();
        }

        private static string SecondPath()
        {
            throw new NotImplementedException();
        }

        private static string FirstPath()
        {
            throw new NotImplementedException();
        }

        public static string BuildMsg2(bool takeFirstPath)
        {
            if (takeFirstPath)
            {
                return FirstPath();
            }
            else
            {
                return SecondPath();
            }
        }
    }


위 소스코드의 IL을 IL 디어셈블러로 확인해보면 다음과 같이 메서드 단위로 떨어지는 것을 볼 수 있습니다.























함수 하나를 클릭해서 상세히 살펴보겠습니다.


함수 하나를 호출할 경우 해당 메서드 안에 있는 코드 모두를 로드하게 됩니다. 그렇다면 메서드 안에서 다른 메서드를 호출하는 경우는 어떨까요?
아래 처럼 call이라는 코드를 보실 수 있습니다. 분개부분에서 필요한 메서드만 다시 호출하게 되는거죠. 결국 사용하지 않는 리소스를 로드하지 않아 JIT컴파일러는 보다 효율적으로 실행 될 수 있겠죠? 바로 이 점때문에 저희는 작고 간단한 메서드 단위로 코딩을 해야하는 이유입니다.


 


Posted by 사나에

What is GeHashCode()?


  • 해시테이블이나 Dictionary 같은 해시코드를 기반으로 하는 collection에 Key로 활용할 타입을 정의하는 경우를 제외하고는 GetHashCode() 메서드를 재정의하지 않는 것이 좋다.
  • GetHashCode() 메서드를 이용하여 collection들의 해시코드를 획득할 수 있다.
  • Regerence 타입에 대해서는 비효율적이긴 하지만 동작한다.
  • Value타입에 대해서는 제대로 동작하지 않는 경우도 있다. ==> 단, immutable타입에 대해서만 정상적으로 동작한다. 물론 비효율적으로 동작.
  • 해시 기반의 컨테이너들은 검색의 최적화를 위해서 해시 코드를 이용하며 모든 객체는 해시 코드라고 불리는 integer 값을 생성한다.
  • 닷넷에서는 모든 객체들이 해시 코드를 가지고 있으며 이값은 System.Object.GetHashCode()에 의해서 반환된다.
  • GetHashCode()를 재정희하기 위한 3가지 규칙
    1. 만일 두 개의 객체가 동일하다면 두 객체는 동일한 해시 코드를 생성해야 한다. 하지만 해시 코드를 이용하여 특정 컨테이너 내에서 다수의 객체들을 찾아내는 데 사용할 수 없다.
    2. 특정 객체 a에 대해서 a.GetHashCode()의 반환값은 객체의 인스턴스가 생성된 이후에는 변하지 않아야 한다. 어떠한 시점에 a 객체의 GetHashCode()를 호출하더라도 반환되는 값은 항상 동일해야 한다. 해시 기반 컨테이너 내에서는 객체를 찾을 때 해시 코드를 이용하여 저장 공간을 검색하기 때문에 이 값이 변경되면 객체가 저장된 올바른 저장 공간을 찾지 못할 수 있다.
    3. 해시 함수는 모든 입력 값에 대해서 integer의 표현범위 내에서 골고루 잘 분산되어야 한다. 이러한 특성이 해시기반 컨테이너의 수행 성능에 영향을 미친다.
  • 실제로 Object.GetHashCode()는 System.Object 클래스에 존재하는 내부값을 반환하는 역할만 한다.
  • 이 값은 System.Object의 객체 생성자에 의해서 만들어지고 1부터 시작하여 매 객체 생성 요청때마다 1씩 증가되는 값을 생성하도록 구성하여 이 값을 반환할 뿐이다.



http://msdn.microsoft.com/ko-kr/library/system.object.gethashcode.aspx
http://msdn.microsoft.com/ko-kr/library/system.object.aspx

Posted by 사나에
개발 이야기/Visual C#2010. 4. 29. 19:29


using (TransactionScope scop = new TransactionScope(TransactionScopeOption.Required))
{
.....
.....
scop.Complete();
}

Transaction이 제대로 수행되지않을때가 있다. 허걱~..
분산 트랜잭션은 MSDTC를 이용한다. 하여 어플리케이션에서 트랜잭션스콥을 잡고 작업을 제대로 수행하기 위해서는 DTC 보안 구성을 설정해줘야한다.


1. 실행 > dcomcnfg.exe :  구성요소서비스 실행한다.
- 로컬 DTC에서 마우스 오른쪽 클릭하여 속성을 선택한다.
- 보안탭에서 보안 설정을 화면과 같이 설정해준다.


2. 실행 > gpedit.msc : 로컬 그룹 정책 편집기를 실행한다.
- 보안 설정 > 로컬정책 > 사용자 권한 할당를 선택한다.
- 네트워크에서 이 컴퓨터 액세스 정책을 클릭한다.
- NETWORK SERVICE 에 액세스 권한을 할당한다.



끝!!

Step by Step: 트랜잭션 오류에 대한 MSDTC 설정 확인하는 일반적인 방법
http://support.microsoft.com/kb/976963/ko

분산 트랜잭션 관리
http://technet.microsoft.com/ko-kr/library/cc771891.aspx

Posted by 사나에
개발 이야기/Visual C#2010. 4. 20. 20:56

오호~ 굿!!
Visual Studio 2010 - UML 들어오다.

Visual Studio 2010 정식 버전을 설치하고 보니 Modeling Projects 템플릿이 제공된다.


베타에서 Sequence Diagram이 자동으로 생성되서 은근히 기대하고 있었던 터라.. 제일먼저 살펴본 부분인데,,
Modeling Projects에서 Class Diagram, Sequence Diagram, Use Case Diagram, Activity Diagram, Component Diagram, Layer Diagram, Directed Graph Document item 항목이 존재한다.
VS 2010에 UML이 들어감에 있어 Visual Studio는 더욱 더 막감해질 것으로 보인다. 흐흐흐~
item 항목에 대해서는 차차 알아보자. 크크


 - 모두에게 정보가 유익하길 바라는 마음 -  
- From. JS -    
Posted by 사나에
개발 이야기/Visual C#2010. 3. 28. 23:28

Visual Studio 2010 Beta버전을 살펴보면 Sequence Diagram이 자동으로 생성되는 기능이 신규로 생겼다.
프로젝트를 하다보면 Sequence Diagram 산출물은 거의 필수적으로 작성하게된다. 귀찮은 작업이다. Why??
Sequence Diagram은 말그대로 순서도인것인데 사용자 액션에 의해 발생되는 내부적인 흐름도를 상세하게 그려야하기에 소스코드 하나하나 다 체크하면서 그려야한다.
해당문서만 봐서 이 이벤트에서는 이렇게 내부적으로 돌아가구나 할 정도로 상세히 그려야하기때문이다.
여튼, Visual Studio 2010에는 이 작업이 자동으로 제공된다.

예제를 보자.
다음소스는 버튼클릭 이벤트에서 UIAgent를 통해 Biz단에서 데이터를 조회해서 화면에 출력하는 로직이다.

private void button1_Click(object sender, EventArgs e)
{ 
     UIAgent agent = new UIAgent(); 
     DataTable selectDt = agent.GetDemoSelect();
     DataTable selectDt2 = agent.GetDemoSelect2();
     label1.Text = string.Format("조회하신 데이터는 {0}개입니다.",
          selectDt.Rows.Count + selectDt2.Rows.Count);
     selectDt.Merge(selectDt2);
     dataGridView1.DataSource = selectDt;
}


해당 버튼 클릭이벤트에서 마우스 오른쪽을 클릭하면 다음 화면처럼 나온다.
여기에서 Generate Sequence Diagram 항목을 클릭하면 Sequence Diagram을 자동으로 그려준다.


자동으로 생성된 Sequence Diagram 화면이다.^^



아직 아쉬운점은 해당 UML이 .uml 확장자로 파일이 저장된다면 다른 UML툴에서도 호환이 가능할텐데 아직은 이점이 지원되지않는다.
정식버전에서는 될까??!! 여튼, 기대는 해본다. 자동으로 생성해주는 것만으로도 올레~!


 - 모두에게 정보가 유익하길 바라는 마음 -  
- From. JS -  
Posted by 사나에
개발 이야기/Visual C#2010. 3. 22. 09:48

[PT 공유] HoonsSeminars_Socket_20100318
2010년 3월 18일 Hoons.kr 세미나에서 진행한 TCP/IP Socket Programming PT입니다.
소스파일은 첨부파일로 해드릴게요.

 
Posted by 사나에

개발 중에 핵심은 DAC가 아닐까 생각해본다.
뭐 기본적으로 닷넷 프로젝트를 하다보면 DataBase를 MS-SQL를 사용하려고 하지만 대용량데이터베이스 부분에서는 오라클이 확실히 많이 사용된다.
오라클 연결하는 방법을 간단히 적어볼까한다.
오라클 연결을 위해서는 Oracle.DataAccess 참조 추가를 해줘야한다.
연결은 Oracle.DataAccess.Client에서 제공되는 OracleProvider를 이용해서 사용하면 됩니다. 소스 코드는 다음과 같이 사용하면 된다.
 string oradb = "Data Source=ORCL;User Id=hr;Password=hr;";
OracleConnection conn = new OracleConnection(oradb);  // C#
conn.Open();
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "select department_name from departments where department_id = 10";
cmd.CommandType = CommandType.Text;
OracleDataReader dr = cmd.ExecuteReader();
dr.Read();
label1.Text = dr.GetString(0);
conn.Dispose();

자세한 내용은 오라클 사이트에서 제공해준다.
오라클 참조 사이트 : http://www.oracle.com/technology/obe/hol08/dotnet/getstarted-c/getstarted_c_otn.htm
오라클처럼 SAP이나 다른 DataBase 활용에 있어서도 Connector나 Client Provider가를 제공된다.
Posted by 사나에


[강좌]C# 소켓프로그래밍 - 1. 소켓프로그래밍의 개념

소켓프로그래밍이라고 말을 하면 많은 사람들이 어렵게 받아들인다. 왜 그런 반응이 나오는지에 대해 곰곰이 생각해보면 소켓프로그래밍이라고 하면 뭔가 네트워크 관련해서 하는 것 같은데… 네트워크라고 하면 하드웨어도 알아야 하고 와와와 뭣부터 공부를 해야하는거지??? 라는 고민에 빠져들기 때문이다. 네트워크 소켓프로그램을 만들기 위해서는 소프트웨어 외 하드웨어도 공부해야 한다는 부담감도 밀려들어온다. 하지만, 소켓프로그램이라는 것이 무엇인가? 소프트웨어이다. 우리는 소프트웨어 개발자 관점에서 소켓만 바라보면 된다. 물론, 다다익선이라고 하드웨어 지식도 있다면 좋겠지만 시작하는 단계에서는 다 알아야 한다는 부담감은 잠시 버려두자. 소켓 프로그램을 하기 위해서는 선수 지식이 몇 가지 필요하다. 강좌를 통해 차근차근 선수 지식을 쌓은 후 실제로 예제를 만들어보는 것으로 강좌를 마무리하려 한다.

우선, 우리가 필히 알아야 하는 소켓의 개념을 잡아보자.
그림1은 오늘날 우리의 네트워크 환경을 그린 것이다.

[그림 1- 네트워크 환경]

인터넷이라는 거대한 네트워크로 각 호스트가 연결되어 있다. A, B, C는 호스트(네트워크 상에서 특정한 호스트번호를 가진 컴퓨터)를 의미한다. 쉽게 영희네, 철수네, 영철이네 이렇게 생각해도 좋다. A와 B는 서로 통신을 어떻게 할까요? 메신저? 메일? 인터넷 폰? 컴퓨터를 이용해서 서로 통신을 하는 방법에는 여러 가지가 있다. 이게 가능한 이유가 바로 네트워크 프로그래밍이 가능하기 때문이다. 즉, 멀리 떨어져있는 호스트 간에 데이터를 주고 받을 수 있는 네트워크 소프트웨어를 만들어서 제공하기 때문에 호스트 간의 데이터 전송이 가능하게 된 것이다. 이를 소켓이라고 부른다. 많은 강의에서 소켓프로그래밍을 설명할 때 빠지지 않고 나오는 예가 전화기이다. 영희네에서 철수네 전화를 하기 위해서는 각 집에 전화기가 있어야 하고 전화번호를 할당해야 한다. 그리고 누군가는 먼저 전화를 걸어서 신호를 보내야 한다. 신호가 왔을 때 응답을 할 것인지를 판단 후 전화를 받게 되면 서로 연결이 되는 것이다. 소켓은 IP주소와 Port를 할당하여 호스트 간 연결을 해주게 된다. 개념이 어느 정도 왔다만 다시 한번 정리해보자. 소켓이랑 각 호스트간에 데이터 주고 받기를 가능하게 하는 네트워크 소프트웨어이다. .NET은 소켓프로그래밍을 쉽게 구현할 수 있게 기본 라이브러리를 지원해준다. 예제를 통해 상세한 소스를 확인 할 수 있을 것이다. 그 전에 어떤 기본 클래스들이 제공되고 있는지 확인만 하자.

Namespace

설명

System.Net

 

System.Net 네임스페이스는 현재 네트워크에서 사용되는 여러 프로토콜에 대한 단순한 프로그래밍 인터페이스를 제공합니다. WebRequest WebResponse 클래스는 플러그형 프로토콜의 기반이 되며, 각 프로토콜의 특정 사양에 관계 없이 인터넷 리소스를 사용하는 응용 프로그램을 개발할 수 있도록 하는 네트워크 서비스를 구현합니다.

System.Net.Sockets

System.Net.Sockets 네임스페이스는 네트워크에 대한 액세스를 엄격하게 제어해야 하는 개발자에게 Windows Socket(Winsock) 인터페이스의 관리되는 구현을 제공합니다.

TcpClient, TcpListener UdpClient 클래스는 TCP UDP 방식으로 인터넷에 연결하기 위한 자세한 정보를 캡슐화합니다.

.

다음 강좌에서는 프로토콜과 소켓의 타입인 TCP, UDP의 개념을 확인해보겠습니다.
수고하셨습니다^^
 
나의 작은 지식이 다른이에게 도움이 되길바라는 마음에.. JS..




 


Posted by 사나에
개발 이야기/Visual C#2010. 2. 26. 09:34

Visual Studio 2010 ALM & Visual Studio TFS 2010 - 김병진




김병진MVP
ALM을 지원하는 Visual Studio Team Foundation Server 2010을 이용하여 개발하는 방법을 소개합니다.^^
Posted by 사나에

ASP.NET 4.0, 그 새로운 변화에 대한 첫 만남 - 김수영



2010년 1분기 내에 Visual Studio 2010과 .NET Framework 4.0 정식 출시 일정 소식이 들려오고 있습니다. .NET Framework 3.5에 {LINQ}가 있었다면 이번 버전에는 {dynamic}을 키워드로 많은 혁신적인 변화를 가져오고 있습니다. 이번 시간에는 ASP.NET 4.0에서 새롭게 변화된 내용을 중심으로 주요 특징 및 ASP.NET 팁에 대해 살펴보도록 하겠습니다.




출처 : http://www.techdays.co.kr/visualstudio2010/
Posted by 사나에