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
728x90
프로젝트를 진행하다가 급하게 SMTP 서버를 구축하는 경우가 많습니다. 하지만 SMTP 서버로 사용할 자원이 없거나 다양한 이슈로 운영이 힘든 경우에는 외부의 메일서버를 사용하는 경우가 많습니다. 가장 대표적인 것이 구글에서 제공하는 SMTP 서버입니다. Gmail 계정만 있으면 사용할 수 있고 SSL 통신등도 지원하기 때문에 무척 사랑받고 있습니다.

그런데 Gmail 계정을 이용해서 smtp.gmail.com 을 사용하는 경우 문제가 하나 있습니다. 메일 헤더에 발신자(From)를 아무리 설정해도 인증을 받는 구글 계정으로 발신자가 표시되는 문제점이 바로 그것입니다. 한참동안 구글링을 하면서 해결 방법을 찾아보다가 너무 가까운 곳에서 해답을 찾았습니다. 같은 고민 하시는 개발자 분들을 위해 정리해 봤습니다.


Gmail 에 로그인 하신 다음 설정으로 먼저 들어갑니다. 설정의 여러가지 탭들 중 Accounts and Import 탭으로 이동해서 Send mail as 항목을 수정하는 것이 바로 해결책입니다. 기본적으로 gmail 계정이 등록되어 있는데 하단의 Send mail from another address 를 눌러 사용하는 이메일 계정을 추가해 주면 됩니다.

이메일을 추가한 다음 실제로 살아있는 정상 계정인지 확인을 위해 Verification 메일로 확인 코드를 전달해 줍니다. 해당 코드를 입력함으로써 이메일 추가가 완료됩니다. 이후 smtp.gmail.com 서버를 통해 메일 발송시에 새로 설정한 메일이 발신자로 기록되게 됩니다. 우측에 make default 버튼을 눌러서 꼭 default 로 설정하는 것 잊지 마시구요.

- 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

+ Recent posts