728x90
마이크로소프트가 제공하는 닷넷 프레임워크는 그 양이 정말 방대하다. 그러다 보니 이미 오래전부터 존재하고 있음에도 불구하고 사용자들에게 널리 사용되지 않는 요소들도 꽤 많다. 오래된 기술이라서 Deprecated 되는 요소를 제외하더라도 그 유용성에 비해 사용자들의 인지가 떨어지는 것들이 여럿 있다. 그 중 대표적인 것이 바로 "?? 연산자" 이다. 

일반적으로 사용자들은 단행 조건문 처리를 할 때나 Nullable 자료형을 선언할 때 쓰는 "?" 는 많이 사용하는 편이다. 하지만 물음표를 두개 붙이 "??" 연산자를 사용하는 경우는 쉽게 찾아보기 어렵다. 그렇다면 도대체 물음표를 두개 붙여 놓은 "?? 연산자"는 무얼하는 친구일까?

 
우선 "??" 연산자는 영어로 null-coalescing 연산자라고 부른다. 우리말로 어떻게 해석해야 할지 조금 애매하니 그냥 "??" 또는 "?? 연산자" 라고 부르기로 하겠다. 이 연산자의 용도는 Null 값을 가질 수 있는 변수들을 사용할 때 초기값의 원활한 지정이다. 보통 Null 값의 처리를 위해 아래와 같은 코드를 많이 사용한다.

int? numOne = null;
int? numTwo = 23;

if (numOne != null)
    return numOne;
if (numTwo != null)
    return numTwo;

return 10;


이 코드는 Null 값을 가질 수 있는 두개의 정수형 변수 numOne 과 numTwo를 비교하여 Null이 아닌 값을 출력하기 위한 간단한 코드이다. 만약 둘다 null 값이면 숫자 10을 출력하게 된다. 우선 이 코드를 물음표 한개를 이용하여 단행 조건문으로 처리해 보면 아래처럼 표현될 수 있다.

return (numOne != null ? numOne : (numTwo != null ? numTwo : 10));

한줄로 처리가 되긴 했지만 가독성이 그리 높은 코드는 아니다. 코드 자체의 길이도 길지만 콜론과 괄호, 물음표, 부등호 등이 섞여 있어서 한눈에 내용을 파악하기에는 쉽지 않은 상태이다. 이것은 "??" 연산자를 이용해서 표현하면 아래와 같다.

return ((numOne ?? numTwo) ?? 10);

처음에 상당히 길었던 코드가 상당히 짧게 표현되었다. numOne ?? numTwo 의 의미는 두가지 변수 중 Null 값이 아닌 것이 어떤 것인가? 를 의미한다. Null 이 아닌 값이 있으면 해당 변수 값이 Return 된다. 하지만 둘다 Null 이면 numOne ?? numTwo 의 결과는 Null 이다. 이후 바깥쪽 괄호의 처리가 진행되는데 Null ?? 10 을 연산하게 되면 Null 이 아닌 10 이 Return 되게 된다.  

소프트웨어 개발을 하면서 Null 값의 처리는 꼭 해줘야 하는 필수적인 예외처리 로직이다. 이왕 해야 하는 처리 로직이라면 조금 더 간결하고 가독성 있는 코드를 만들어 쓰는 것이 더 좋지 않을까?

- NoPD - 
728x90
728x90
WCF 를 이용한 통신채널을 구성할때, 일반적인 방법으로 인터페이스를 선언하고 웹 참조 혹은 DLL 참조, Svcutil 로 생성된 레퍼런스 정보를 사용할 때는 별 문제가 없다. 하지만 WCF 3.5 부터 제공되기 시작한 REST 형태의 호출 지원을 사용하는 경우에는 파라메터의 데이터 형태에 따라 BodyStyle 속성을 지정해야 하는 경우가 빈번하다.

예> IService.cs

[ServiceContract]

public interface IService

{

    [OperationContract]

    [WebInvoke(UriTemplate = "Counter", Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped)]

    int Counter(CounterList counterValues, int tryCount); 

 
그런데 문제는 서비스의 인터페이스 선언에 이렇게 WebInvoke Attirbute 와 BodyStyle 을 지정했음에도 클라이언트에서 서비스를 호출할 때 BodyStyle 이 Wrapped 로 지정되지 않았다는 에러가 발생할 때가 간혹 있다는 점이다. 특히 svcutil 을 이용해서 매뉴얼하게 레퍼런스 클래스를 만드는 경우에 이런 일이 많이 발생한다. (웹참조로 추가하는 경우에도 발생한다는 보고가 있다)

예> 클라이어트에서 서비스 호출시 에러 메세지

'IService' 계약의 'Counter' 작업에서 래퍼 요소 없이 직렬화할 여러 개의 요청 본문 매개 변수를 지정합니다. 최대 하나의 본문 매개 변수가 래퍼 요소 없이 직렬화될 수 있습니다. 추가 본문 매개 변수를 제거하거나 WebGetAttribute/WebInvokeAttribute의 BodyStyle 속성을 Wrapped로 설정하십시오.


이런 경우 서비스쪽을 자꾸 살피게 되는데 원인은 서비스가 아니라 레퍼런스 클래스의 생성에 있기 때문에 트러블슈팅이 쉽지 않다. svcutil 명령을 이용해서 만든 레퍼런스 클래스를 확인해 보면 WebInvoke 로 지정한 내용이 전혀 들어가있지 않은 걸 쉽게 발견할 수 있다. 해당 부분에 동일한 선언을 추가해주면 에러를 가볍게 제거할 수 있다.

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]

[System.ServiceModel.ServiceContractAttribute(ConfigurationName="IService")]

public interface IService

{

[System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService/Counter", ReplyAction="http://tempuri.org/IService/CounterResponse")]

    [WebInvoke(UriTemplate = "Counter", Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped)]

    int Counter(Counters counterValues, int tryCount);


비동기 형태로 호출하기 위해 만든 레퍼런스 클래스의 경우에도 Beginxxx 와 같은 비동기 메소드를 선언하는 부분에는 지정해줄 필요가 없다. 원래 함수의 속성으로만 지정하면 문제는 해결된다. 혹시 비슷한 어려움을 겪는 사람들을 위해서 공유해둔다.

- NoPD -



 

 
728x90
728x90
애자일 프로그래밍을 하던 그렇지 않던 지속적인 통합 (CI, Continuous Integration) 은 개발자들의 노고를 덜어주기 위한 큰 화두임에 틀림없다. 관련하여 여러가지 자료를 찾아 보던중 월간 마이크로소프트웨어지에 필진으로 활동중이신 최재훈 님께서 2008년도에 1년동안 연재했던 자료가 있어서 링크를 모아 보았다. 

혹시나 CI 에 관하여 고민하고 있거나 공부를 하고 싶은 사람이라면 (저처럼 ^^) 한번 쭈욱 읽어보면서 감을 잡아보는 것도 나쁘지 않을 것 같다. 다만 내용은 닷넷과 VC++ 을 모두 커버한다고 전제를 깔긴 했지만 대부분의 내용은 VC++ 중심으로 돌아가고 있다. 그렇다 하더라도 큰 줄기는 틀리지 않으니 참고하기엔 가장 좋은 글이라 생각된다.


최재훈 님의 글은 리눅스 서버에 Subversion 을 설치하고 여기에 이슈관리 도구인 trac 을 설치해서 사용하는 환경으로 되어 있다. 시절이 좀 지나서 그런지 (쓰신건 2008년) 지금은 윈도우에서도 얼마든지 이 도구들을 설치해서 활용하는 것이 가능하다. 윈도우용 Subversion 도구인 Visual SVN Server 를 설치해서 레파지토리를 만들고 윈도우용 Visual SVN Server Trac 을 설치하는 방식으로도 가능하다. 

참고링크 : 즐거운 삐약토끼님의 " 윈도우에 Visual SVN Server + Trac 설치하기 [바로가기] "

결과적으로 지속적인 통합은  1) 소스버전관리, 2) 이슈관리, 3) 빌드자동화, 4) 테스트 자동화 등이 어우러져 아름다운 조화를 이룰때 실현 가능하다는 것을 알 수 있다. 처음이 어렵지 익숙해지면 없이는 살 수 없을 것 같은 생각이 든다.

- NoPD -
728x90
728x90

닷넷 개발자 커뮤니티인 dotnetslackers.com 에 예전에 올라온 좋은 자료입니다.
윈도폰7에서 페이스북 연계 앱을 개발하는 강의인데요
하나씩 따라하면서 만들어보기 좋게 구성되어 있습니다.

[ 강의#1 ] - http://dotnetslackers.com/articles/net/wFace-windows-phone-7-facebook-integration-part-1.aspx
[ 강의#2] - http://dotnetslackers.com/articles/NET/wFace-windows-phone-7-facebook-integration-part-2.aspx

Facebook  개발 관련 유용한 링크 모듬
  • Walkthrough of Smiley.NET the FBML sample packaged with the Facebook Developer Toolkit read more
  • Facebook Developer Toolkit 1.6 Released on CodePlex read more
  • Why DataBinding With ComboBoxes is NonTrivial read more
  • Apple Safari for Windows and Microsoft Silverlight read more
  • Host WPF Controls in Windows Forms read more
  • Programmatically determine if UAC is enabled read more
  • Phoning Home, revisited (Matt Gertz) read more
  • Streamline Model-View-Presenter with new StructureMap feature - level 300 read more
  • iPhone bluetooth feature broken for music on firmware 1.1.3. read more
  • The WindowsClient.NET Community Site Launches read more
728x90

+ Recent posts