728x90
iBatis.net 을 사용하면 확실히 닷넷 코드 레벨에서 데이터베이스 관련하여 고민할 것이 많이 줄어들기 때문에 무척 좋습니다. Entity Framework 를 쓰면 얻을 수 있는 더 많은 잇점들이 있지만 간단하게 데이터베이스 엑세스에 대한 부분을 정리하고 간편화하는데에는 iBatis.net 이 훨씬 투입 공수가 적은 장점이 있습니다.

다만 iBatis.net 단에서 문제가 발생했을 때는 트러블 슈팅이 쉽지 않은편입니다. 오픈소스기 때문에 누가 책임을 져주는 것도 아니고 한번 내부적으로 처리된 에러 메세지들이 나오기 때문에 더 상세한 오류 원인을 찾으려 삽질하기 일쑤지요. 이번에 개발된 내용물을 클라우드 서버에 포팅하면서 겪은 문제 역시 마찬가지였습니다. 기록 차원에서 블로그에 정리해 둡니다.

에러의 시작, " Unable to open connection to ... "

로컬에서 MS-SQL 을 가지고 작업을 할때 아무런 문제가 없었던 로직. iBatis.net 의 장점을 십분 활용해 실서버 환경에서 provider.config 를 오라클에 맞추어 조정하면 가볍게 끝날것으로 생각했던 작업은 만 하루가 넘게 걸리고서야 해결될 수 있었습니다. 오래걸린 주요한 이유 중 하나가 바로 iBatis.net 가 추상적으로 던진 에러의 원인을 찾기 위함이었네요.

로컬은 32bit 개발환경이고 공교롭게도 처음 포팅했던 서버는 Windows Server 2003 32bit 버전이어서 더욱 오래 걸렸던 이번 에러. 두번째 포팅한 서버가 Windows Server 2008 R2 64bit 환경이었고, 여기에서 System.Data.OracleClient 네임스페이스에 매핑된 라이브러리가 32bit 냐 64bit 냐 때문에 발생하는 것이었습니다.  

참조링크 : OTN 의 OracleClient 64bit 모드 관련 Forum 글 참조 [바로가기]


비주얼 스튜디오로 빌드를 하면서 특별히 빌드 환경을 지정하지 않고 Any CPU 로 하고 있던게 화근이었습니다. iBatis.net 이 계속 에러를 토하는 과정에서 내부 에러를 살펴보니 아래와 같은 메세지를 내놓고 있었습니다. 기본적으로 iBatis.net 이 던져주는 Exception 의 Message 로는 확인이 되지 않는 부분이었습니다.


여러가지 해결 방법들이 제시되었고 가장 많은 것이 Oracle Client 를 환경에 맞게 재설치 하는 것이었는데 제가 전담하는 서버도 아니고 해서 그 방법을 쓰는건 너무 위험해 보였습니다. 그래서 x86 과 x64 로 빌드후 포팅을 해보기로 했는데, x86 으로 재빌드 하고 나서 아무런 문제가 없이 잘 수행되는게 확인 되었습니다.

혹시 비슷한 오류를 겪으시는 분들은 서버 환경에 따라 빌드 옵션을 다르게 주고 빌드한 다음 테스트를 해보시는 것을 추천해 드립니다. 이것 때문에 하루를 넘게 소비했다는 것이 참 어이가 없을 뿐입니다. 아무쪼록 누군가에게 도움이 되고 스스로에게도 언젠가 레퍼런스로 활용할 수 있도록 블로그에 글 남겨둡니다.

- NoPD -
 
728x90
728x90
지난 포스팅에서 Binary 버전으로 다들 NAnt 를 설치하셨나요? Binary 버전을 설치해도 되지만 NAnt 를 이용하는게 주 목적이라면 굳이 Source 를 받아서 컴파일 하실 필요는 없을 것 같습니다. 지난 포스팅을 보지 않고 오셨다면 아래 링크를 이용해서 NAnt 를 먼저 설치하고 오시는게 순서입니다 ^^

 
NAnt 가 빌드하는 원리는 별로 복잡하지 않습니다. 빌드 하고자 하는 프로젝트의 루트 폴더에 *.build 파일을 만들고 이 파일에 빌드에 필요한 함목들을 정의해 주면 됩니다. 앞으로 하나씩 살펴 볼 것들이 바로 *.build 라는 파일에 들어가야 하는 내용을 살펴보는 것이 목적입니다.

간단하게 구성된 소스코드를 이용해서 먼저 NAnt 를 이용한 빌드를 해보고 *.build 파일에 무슨 내용이 기술되어 있는지 살펴보겠습니다. NAnt 공식 다운로드 링크에서 2001년에 개발된 0.1.3 버전의 NAnt 를 이용해서 빌드를 한번 해보도록 하겠습니다. 최근 소스는 규모도 크고 빌드하는 시간도 많이 소요되니 간단한 걸로 먼저 보자는 것이지요!

 
 
다운로드 받은 소스코드를 임의의 경로에 풀어놓고 명령 프롬프트를 실행합니다. 해당 경로로 이동한 다음 nant 라고 치면 위의 화면과 같이 출력되며 빌드가 끝납니다. 참 쉽죠? 0.1.3 버전 폴더에 이미 NAnt.exe 가 있기 때문에 Path 로 열심히 잡은 버전이 실행된 것은 아닙니다. 첫줄에 NAnt.build 파일을 이용한다는 내용이 눈에 띄시죠?

 
바로 확장자 build 를 가진 파일이 빌드에 대한 정보를 담고 있는 파일입니다. 어떤 컴파일러를 사용해서 어떤 경로에 어떤 확장자를 가진 파일을 어떤 소스코드와 리소스를 이용해서 빌드할 것인지를 XML 형태로 기술한 파일입니다. 간단한 소스코드인 만큼 정말 간단한 내용이 들어가 있습니다.

 
빌드 경로에 정말 파일이 생겼는지 찾아가 보았습니다. 네, 잘 생긴게 보입니다. 디버그로 컴파일이 되었기 때문에 pdb 파일이 같이 생성이 되었구요, 실행파일 형태의 NAnt.exe 가 만들어진 것을 볼 수 있습니다. 요게 어떻게 보면 NAnt 의 가장 중요하고도 전부일 수 있는 내용인 것 같습니다. (파면 더 나오겠지만... 일단 크게 보자면 그렇다는 말입니다! ^^) 바로 저 XML 을 어떻게 만드느냐! 에 따라 빌드 자동화를 얼마나 훌륭히 수행할 수 있는지 판가름 날 것 같습니다.

- NoPD - 
728x90
728x90
그동안 빌드 자동화에 대해서 관심만 있었지 실제로 사용해 본 적은 없었습니다. 대부분 Peer to peer 로 배포하는 방식으로 커버가 가능했고 수작업이 어느정도 들어가더라도 Configuration 등을 세심하게 하나씩 살피면서 배포하는 것이 더 편하다고 느끼고 있었기 때문입니다. 

하지만 갑자기 배포해야 할 서버의 규모가 세자리 수 가까이 된다는 생각을 하기 시작하니 이건 사람이 해야 할 일이 아니라는 생각이 들더군요. 그래서 NAnt 라는 도구에 관심을 갖게 되었습니다. 처음 NAnt 를 사용해 보면서 겪는 시행착오를 포스팅으로 고스란히 남겨볼까 합니다.
 

NAnt 는 아파치의 오픈소스 프로젝트인 ANT 에서 유래된 닷넷 버전의 ANT 프로젝트입니다. 빌드에 대한 자동화를 도와주는 도구로 스크립트로 TASK 를 정의하고 이를 이용하여 빌드 자동화를 할 수 있는 도구입니다. 주요한 닷넷 프레임워크의 버전들 지원하고 있으며 도구 상에서 다중 버전에 대한 빌드 진행등이 가능해 수작업으로 빌드하는 경우에 비해 무척 편리하다고 합니다. (써봐야 알겠지요! ^^)

 
NAnt 를 설치하는 방법은 무척 간단합니다. 공식 페이지에서 Binary 혹은 Source 파일을 다운로드 받아 설치하면 됩니다. NAnt 의 소스코드까지 보면서 설치할 요량이 아니라면 Binary 버전을 받아서 설치하는 것이 편리합니다. Binary 버전은 아래와 같은 순서로 간단히 설치가 가능합니다.

[1] Ant 공식 페이지에서 nant-x.xx-bin.zip 파일을 받는다  
[2] 설치하고 싶은 (이라 적고 압축 푼다고 읽는다) 경로에 압축을 푼다 (예> c:\program files\nant)
[3] 어디서나 실행할 수 있도록 nant.bat 를 만들어 PATH 가 잡힌 경로에 둔다

예> c:\Windows\nant.bat 
@echo off
"C:\Program Files\NAnt\bin\NAnt.exe" %* 

[4] 커맨드 창을 열어 nant -help 라고 쳐서 동작하면 설치 완료 



뭔가 많은 일을 했다. ^^ 특히 NoPD 처럼 Windows 폴더에 nant.bat 를 넣으려고 했다면 특히 윈도우7 을 쓰는 환경에서 관리자 권한으로 애를 많이 먹었을 지도 모르겠다. 아예 환경변수에 NAnt 압축을 풀어넣은 경로를 PATH 에 잡아버리는 것도 방법이다. 다음 포스팅 에서는 간단한 예제를 통해 NAnt 를 이용한 빌드를 해보도록 하겠다.

- NoPD -

 
728x90
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

+ Recent posts