2012. 7. 20.

새로운 회사에서의 새로운 출발...

이 나이에 새로운 출발이라는 말을 적기가 참 쑥스럽지만..

새로운 회사에서 새롭게 시작한다는 의미에서 분명 출발이 맞을 것이다.

눈 깜짝 할 사이에 2주가 흘렀는데, 그 동안 새로운 환경에 적응하고자 하루하루 긴장의 연속이었다.

물론 지금도....

사람들과의 환경, 개발 환경, 업무 프로세스 환경 등등.. 적응해야 할 환경이 나이를 먹을 수록 더 많아지는 것 같다.

원래 사람 이름 외우는데 서투르다보니 대부분의 시간은 사람들 얼굴과 이름을 맞춰나가는 작업으로 보낸거 같다.

물론 입사하자마자 진행된 현 프로젝트에 대한 리팩토링 구조를 잡는 작업도 힘들긴 마찬가지..

매일 매일이 긴장되고 스스로 약간씩 자책하는 시간과 공부하는 시간으로 보내다 보니 퇴근해서 집에 가면 온 몸이 노곤해지기 일쑤다.

여기서 간단히 현재 진행하고 있는 프로젝트의 시스템을 적어보자면,

OS : Linux(Centos)
Language : Java
Framework : Spring framework 3.X
Database : Oracle
Build Tool : Maven
Version Control : Subversion
IDE : Eclipse (+ m2eclipse, + subclipse, + STS)

1주일을 투자해서 리팩토링 구조는 만들었는데, 아직 샘플을 준비하지 못했다.

당장 다음주부터 리팩토링을 진행해야만 하고, 거의 이전에 3개월 정도 작업한 분량을 2주일 안에 리팩토링을 해야 하는 빠듯하고 겁나는 일정이다.

겁이 나면서도 약간 설레이기도 하는... 뭔가 기존보다 3% 정도의 열정이 생겨난거 같다.

그나저나 요즘 개발자 어린 친구들은 개발하는 모습이 정말 오락하는 모습 같다. 뭔가 신기한데, 내 고참들도 날 볼때 그랬을까나...

아무튼 어린 친구들이 노하우는 부족한 듯 하지만 프로그램은 참 잘 짠다. 좀 창피하다.

2012. 4. 14.

WCF parameter와 return에 대해 알 수 없는 현상들...

이전 Post에서도 밝혔듯이 최근의 프로젝트는 WCF를 사용하고 있다.

프로젝트 Framework가 Spring.NET이다 보니 WCF의 설정 및 프로그램도 Spring.NET을 최대한 이용하고 있다.

그런 이유인지 모르겠지만, 약간 이상한 현상들이 나타나곤 한다.

최근에 발생한 문제는 Parameter로 받아서 해당 변수를 처리하여 그대로 리턴한 경우인데...

즉 간단히 함수를 보면.

IList<someobject> SetChangeList(IList<someobject> paramList)
{
    foreach(SomeObject item in paramList)
    {
        item.SomeValue = "value";
    }

    return paramList;
}

뭐 이런식의 형태라는 거다.

로컬 컴퓨터에서 해당 클래스의 해당 함수에 대한 모듈 단위테스트는 당연히 성공.

로컬 컴퓨터에서 WCF 메쏘드로 호출하는 단위 테스트도 성공.

Commit 하고 테스트 서버에 배포!!

테스트 서버에서도 모듈의 단위테스트는 성공..

그런데!! WCF 단위 테스트는 실패다.

그런데 정상적으로 무언가 판단할 수 있는 오류도 없다. WCF 로그에도 아무런 내용이 없다.

설상가상 해당 웹서비스는 재기동까지 되어있는 상황이더라는...

서버이벤트에 해당 웹서비스의 Pool이 중지되었다는 오류 메시지와 함께 웹서비스 시작 시 찍도록 한 로그들이 주루륵...

처음부터 위의 코드가 문제가 있다는 걸 안건 아니고, 이런저런 로그를 남기다 보니 저 부분에서 코드를 점프한다.

위 코드가 실행되는 블록은 분명 try, catch 되어있지만, catch 되지도 않는다.

이런저런 처리를 하다가 받은 리스트를 그대로 리턴하지 않도록 아래와 같은 수정을 해보게 됐다.

즉,

IList<SomeObject> SetChangeList(IList<SomeObject> paramList)
{
    IList<SomeObject> returnList = new List<SomeObject>();
    foreach(SomeObject item in paramList)
    {
        item.SomeValue = "value";
        returnList.Add(item);
    }

    return returnList;
}


그랬더니 로컬에서도 테스트 서버에서도 어디에서도 테스트 성공이다.

이유를 정확히 알지 못한 채 WCF에서는 되도록 받은 파라미터를 그대로 쓰지 말자.. 그대로 리턴하지 말자.. 뭐 그런 생각으로 상황 종료...

혹시 아는 사람 좀 알려주면 좋겠다...

2012. 3. 30.

CruiseControl.NET 에서 Robocopy 사용시의 에러

최근 진행되는 프로젝트는 현재 CruiseControl.NET 을 이용하고 있다.

아직 Real Open 된 프로젝트가 아니어서, 현재는 테스트 서버에만 적용하고 있는 상황으로
CCNet.config 상의 시나리오는 아래와 같이 진행된다.(매우 간단하고 평번하다)

1. svn 에서 변경사항을 update

2. MSBuild 를 이용해서 솔루션 빌드 수행

3. IIS 정지

4. Robocopy 를 이용해서 변경된 파일을 deploy directory에 Copy

5. IIS 시작

매우 단순하고, 일반적인 CruiseControl.NET 의 시나리오인데...

항상 변경이 있으면 Robocopy 수행후에 에러가 발생한다.


  robocopy.exe
  {basedirectory}
  .\ {deploydirectory} /E /R:2 /XA:H /PURGE /XO /XD ".svn" /NDL /NC /NS /NP
  60
  0,1


뭐 대충 위와 같은 Configuration 이었는데, 위 내용은 ccnet 사이트에서도 나온 내용을 거의 그대로 사용한 것이라서.. 문제가 없을꺼라 생각했다.

에러때문에 항상 force integration 만 사용을 해 왔다.(사실 우린 스케쥴까지 쓸 필요는 없는 프로젝트다)

force integration을 두번씩 하면 되니까 좀 불편하지만 사용을 했는데 오늘 갑자기 짜증이 확나서 이리저리 검색하고 결국 수정했다.

확인해보니 robocopy가 return 하는 exit code 중 0~16까지의 code 중 0~7은 오류는 아니다. (Robocopy Exit Code)

그래서 위의 설정을 간단히 아래와 같이 바꿨다는...

  robocopy.exe
  {basedirectory}
  .\ {deploydirectory} /E /R:2 /XA:H /PURGE /XO /XD ".svn" /NDL /NC /NS /NP
  60
  0,1,2,3,4,5,6,7

이제 한번에 Force Integration이 성공한다.

10분만 투자해서 검색하고 설정파일 수정했으면 될 것을 한달 정도를 불편해하면서 살았으니, 이 귀차니즘은 정말 불치병이다. 쩝!

2012. 2. 9.

Spring.NET, NUnit 사용시 Autowire 문제

Spring.NET과 NUnit 을 이용해서 테스트를 진행할 경우,

동일한 Interface를 상속받은 객체가 여러개인 경우가 있다.

이 경우 Test Class에 Get, Set 을 만들게 되는데...

Spring.NET에서는 NUnit 테스트 클래스에 DI를 할 경우 기본적으로 Type에 따른 Autowire를 이용한다.

따라서, Spring.NET에서 어떤 객체를 Set 할지를 알 수 없다는 오류를 내게 된다.

이럴때는 Test Class에 Set을 없애고,

Test를 Setup 해주는 함수에 application.getObject를 이용하여 Set을 해주면 해결된다.

WCF 에서 DataTable 을 사용할 때 Table Name 문제

요즘 회사에서 WCF 서비스와 WebOrb를 이용한 플렉스 프로젝트를 진행하고 있다.

이 외에도 C++로 만들어진 서버와는 gSoap으로 통신하는 부분도 있긴 하지만...

기본적으로 WebOrb아 통신하는 부분은 크게 꼭 Generic 타입을 사용해야 할 필요도 없고,

대부분의 데이터 역시 그리드에 표시할 내용들이라 DataTable 을 이용하고 있다.

기본적으로 Data는 POJO형태의 데이터를 iBatis 를 통해 맵핑되어 넘어온 IList<어쩌구> 를 

DataTable로 Convert 해주는 함수를 만들어서 쓰고 있는 형태이다.

POJO에 관계없이 DataTable로 만든 함수를 이용하다 보니 갑자기 Serialize 에러가 발생하더라는...

분명히 함수만 테스트를 했을때는 아무 문제가 없었는데.. 

결국, WCF 의 Trace 로그를 찍어보니 쳇... DataTable에 TableName이 없단다.

쩝~~

결국 Convert 해주는 함수의 new DataTable() 했던 부분에 

new DataTable(POJO타입네임) 형태로 바꿔줘서 해결했다는.. 쩝~~