정형화된 개발 프로세스는 건축과 같이 Waterfall 방식을 일반적으로 택한다. 그래서 소프트웨어 감리도 이 Waterfall 방식에 의거하여 검수하고 확인하게 된다.

개인적인 경험 기반으로 이 Waterfall 방식의 개발에서 가장 큰 문제는 분석/설계 단계에서의 완성도다. 이 분석, 설계 단계에서 만들어진 구조에서 조금이라도 빗겨나가면 개발이 크게 흔들리며, 결과물은 전혀 다른 결과물을 자아낼 수 밖에 없다. 흔들린 결과물을 원상복귀하는데 크나큰 댓가를 치르는 모습을 경험하기도 했고, 지켜바라보기도 했다.


여러가지 방법은 있겠지만, 대개의 경우 상황에 따라 아메바처럼 변하는 애자일 방식으로 진행하는데 그 중 XP 방식을 많이 진행하게 된다. 중구난방으로 마구 쏟아져 백로그에서 개발자들이 모여 틀을 구성하고 구현해보고 조립해본다. 단계 단계 마다 확인하고 연결하면서 구성하게 된다. Top-Down이 아닌 Down-Top 방식이지 않나 싶다.


일반적으로 작은 프로젝트나 일반 기업을 대상으로 프로젝트를 진행하는 경우 이 감리라는 단계가 생략되거나 축소 혹은 다른 형태로 제공하지만, 각종 공공기관에서는 각 담당자가 현재 공정에 대한 이해가 많이 부족하고, 업무 수행의 공정성을 증명하기 위해 감리라는 절차를 밟게 된다. 문제는 감리하는 프로세스다. 감리라는 조직은 검증하기 위한 조직이다 보니 모든 절차는 정형적일 수 밖에 없기 때문에 정해진 대로 밖에는 할 수 없다. 더욱이 새로운 프로세스라는 건 적용하는게 무리가 생길 수 밖에 없다. 결국 하던 대로 하게 되고, 가장 체크하기 좋은 방법인 이 Waterfall 방식을 고집할 수 밖에 없다.


개발과 감리는 바로 이 점에서부터 상충을 할 수 밖에 없다.
개발에서는 다양한 요구를 적용하기 위해, 알 수 없는 무언가를 개발하기 위해 유연한 진행을 하고자 한다면, 감리는 정확한 검사와 확인을 위해 딱 정해진 포인트를 강조하게 된다. 뻔한 개발이야 개발자들도 어느정도 정형화를 하겠지만, 막연한 요구사항과 그 결과물을 쉽게 예상하지 못한다면 자연스럽게 흩어지는 구성이 되는데, 이걸 리스크로 간주하고 더 철저히 감시하고 확인하는게 감리의 역할이 된다는 것이다.


물론 감리에서도 변경에 대한 유연성을 제시하면서 그에 따른 변경이 존재하면 당연히 허용을 해준다. 다만, 문서로 남겨서 그 근거를 제시하라는 내용에서 부터다.


보통 건축물은 한번 지어지면 정말 수정이라는게 불가능하다. 설계된 내용 그대로 지어져야 되며, 설계가 잘못되면 그 건물은 정말이지 끝이다. 정말 분석, 설계가 중요한 요소가 될 수 밖에 없다.


하지만 소프트웨어는 동적인 변화를 갖는다. 요구사항이 변해도 변할 수 있으며, 기술이 변해도 변할 수 있다. 중심 설계라는 것이 있겠지만, 간혹 그 중심 설계라는게 잘못되어도 수정은 가능하다. 물론 댓가는 크지만. 이 리스크 줄이는 방법은 개발자들은 작은 개발 단위 개발이라는 방식을 택한 것 뿐이지만...


( 출처 :https://www.slideshare.net/deview/1c3 )


만약 이 개발과 감리라는 두 개의 상충점을 조율을 어떻게 하냐에 따라 프로젝트는 윈윈이 되거나, 어느 한 쪽으로 질질 끌려다니거나 실패하거나 4중 하나가 되지 않을까 생각한다. 감리라는게 소프트웨어 개발 쪽에는 그다지 큰 도움이 안되는 것은 맞지만, 무언가 검증하기 위한 고객의 방법이라는 점에서는 쉽게 부인하기 어렵다. 해줄 것은 해줘야 할 것이다. 하지만, 개발자체를 감리에 맞춰서 하라고 한다면 이 부분은 전혀 다른 문제라고 생각한다.


최소한 감리 입맛에 맞는 개발을 하려면, 현재 개발하려는 대상에 대한 이해가 최소 7~80%가 정해지고 잘 알고 있어야 된다. 더욱이 감리에서 제시하는 문서를 작성하기 위한 인원이 규모에 따라 2~3명 정도여야 하며, 각 문서화에 대한 전문적인 지식(UML, 요구사항 분석서, 추적서, 아키텍처 문서 등등)도 상당해야 한다.

그리고 각 내용들의 기본적인 내용은 거의 미리 작성을 하고 각 고객과의 인터뷰를 통해 정형화 하며 정리하고 매 순간 순간 추적표에 하나씩 꼼꼼하게 기록해야 한다. 절대 얼렁 뚱땅하는 순간 무너진다. 이렇게 정해진 내용을 기반으로 설계 문서를 작성한다. 여기서 모든 개발이 이뤄진다는 생각을 갖고 문서를 작성한다. 규모가 있는 프로젝트에서는 이 단계가 1~2개월로 절대 끝나지 않는다. 산출되는 문서의 양도 4~500여 페이지는 훌쩍 넘길 수 밖에 없다. SI 중 대기업이나 이런 프로세스를 제대로 처리할 수 있지 않을까?


개발자에게 위의 일을 하라고 한다면 과연 할 수 있을까? 더욱이 스스로 쓰면서도 스스로 족쇄가 될 거라는 것을 빤히 알게 될 내용을 말이다. 되려 적다가 여지 만들어본다고 혼자 쑈하다가 감리에 지적당하기나 할 것이다.

더욱이 개발하다가 누락이라도 된 부분이 있으면 그 내용을 추가하려다가 근거 찾으러 다녀야 하고, 불필요한 개발이라고 생각되어 생략하고 싶어도 그 내용을 증명해야 한다. 매우 적극적이면 그 증거라는 것을 채워보려 하겠지만, 최소한 내가 경험해본 결과 대개는 그냥 방치하거나 그대로 둔다. 일을 사서 만들 수 있을 정도로 여유로운 개발기간이 아니니까. 그래놓고 왜 그 때 수정하지 않았냐고 닥달하면, 생각해보니 잘못한 것은 맞으니 묵묵히 욕 얻어 먹고, 속으로는 설계가 엉망이지 않았냐는 뒷담화만 잔뜩 늘어놓으면서 결국 야근과 지연을 반복한다.


요즘 내가 처한 처지가 저 상황 속에 있다.

뭘 어떻게 해야할지 이젠 전혀 감 조차도 서지 않는다.


감리를 위한 프로젝트인지, 개발을 위한 프로젝트인지 부터 생각해야 할 것 같은데, 자꾸 주변에서는 정론만을 들이대면서, 방법은 없다. 감리는 지키면서 개발을 위한 프로젝트를 하란다. 저 갭은 별 생각은 없으면서 말이다.



728x90

지금은 완전히(?) 복구되었지만, 국보1호 남대문을 예전에 찍은 사진이 있다.

겨울인데, 소실 전 산책길에 찍은 사진 몇점과, 소실된 그 날 밤에 찍은 사진이 있다. 

뭔가 감회가 새롭긴 하다....


728x90

간혹 프로그램 중 이상한 프로그램을 돌리고 나면 자꾸 알수 없는 사이트에 접속하거나 의도하지 않은 데이터 패킷이 끊임없이 나가는 경우가 발생한다.

대체... 이 프로그램은 어떻게 실행되는 것일까?


1. 서비스.

Windows에서는 뒤에서 실행되는 프로그램을 보통 Service로 만든다. 물론 이 경우 화면까지 영향은 잘 안미치지만, 뒤에서 열심히 무언가 알 수 없는 작업을 하는 경우가 많다. 특히 요즘 ActiveX 대체하는 프로그램들 중 보안 프로그램들이 이런 형태가 많은데, 잘 만들어진 제품은 문제가 없지만, 간혹 PC를 매우 느리게 만들거나 데이터 송/수신이 매우 많아지게 되는 경우가 많다.


2. 시작 프로그램

Windows 7 이하는 msconfig 에서, Windows 8 이상에서는 작업관리자(Task Manager)에서 확인해볼 수 있다. 로그인을 하면 자동으로 실행되는 프로그램들인에, 보통 자동으로 실행되게 만드는 프로그램들은 이 안에 있다. 보통은 비활성화 처리를 할 수 있다. 


3. 스케줄 작업

사실 많은 사람들이 잘 모르겠지만(필자도 헉했다.) 도스 명령창에서 taskschd.msc 라고 치면 나오는 스케쥴 작업이라는 것이 있다. 자동으로 특정 조건이 되면 실행하는것인데, 이 부분에다 열심히 무언가가 들어가 있는 경우가 있다. 아무리 서비스, 시작프로그램을 뒤져도 나오지 않고, 작업관리자를 뒤적이면서 이 프로그램이 왜 있나 싶을 정도로 궁금했는데, 이 방법을 써서 넘기는 경우가 있었다.


위의 방법외의 방법으로 실행하는 방법은 중요 파일을 대치하는 방법도 있고, 시스템 드라이버에 기생하는 방법도 있는데, 요즘은 대개 보안 정책에 의거 중요 파일들 안에는 MS 인증서가 들어가 있고, 이 인증서에 위배되는 파일이 있는 경우 자동으로 복구되거나 운영체제가 정상적으로 동작하지 않게 된다. 

하지만, 역시 제일 중요한 것은 신뢰할 수 있는 프로그램이 아니면 아예 설치를 하지 않는게 답일듯.


728x90

7zip에서는 증분(Incremental) 백업과 차등(differential) 백업이 있다.
한국어가 어려워서 그렇지 원리는 간단한다.

증분은 현재 백업 내용에서 변경된 내용을 업데이트하는데, 백업본 원본에 적용을 하는 것이다.

차등은 현재 백업 내용을 기준으로 차이가 나는 부분을 다른 압축파일에 적용을 하는 것이다.

상황에 따라, 조건에 따라 적용하는 규칙은 선택한다.
(위의 내용은 뿌비의 블로그 - 7zip 을 이용한 차등백업 (Differential Backup) 사이트를 참조하도록 한다.매우 잘 정리된 글이다.)

여기서는 차등 백업에 대해서 알아본다.

다만 필자는 Windows 기반으로 작성해본다. Linux는 실행 명령이 다를 뿐 옵션은 동일한다.

여기서 사용한 7zip은 64bit용 16.04 (2016-10-24) 버전을 사용한다.


차등 백업 방법.

1. 차등을 하기 위한 기준 압축을 만들어야 한다. 전체 압축을 수행하면 된다.

"C:\Program Files\7-Zip\7z.exe" a -t7z backup.7z {BackupTargetFolder}
  • a 명령은 압축을 수행하겠다는 의미.
  • -t7z 은 압축 타입을 7zip 포맷으로 하겠다는 의미.
  • backup.7z 은 백업 결과물을 backup.7z으로 하겠다는 의미 ""를 써서 전혀 다른 경로에 백업을 수행할 수도 있다. (예 : "C:\backup\2017\backup.7z"
  • {BackupTargetFolder} 백업 대상 경로. 일반적인 경로를 입력한다. "C:\SomeFolder\MyBackup\KK1 Options" 라고 쓸수도 있고, ".\Target" 이런식으로도 쓸 수 있다.


2. 기준 압축이 만들어졌으면 차등 백업을 만든다.

"C:\Program Files\7-Zip\7z.exe" u backup.7z  c:\backup\backup.7z  -ms=off -t7z -u- -up0q3r2x2y2z0w2!c:\backup\diff_%date%.7z

u 명령은 차이점 구성을 수행하겠다는 의미

backup.7z 은 기준 백업 파일로써, 기준 백업 파일의 정확한 경로를 넣어준다.

-ms=off 7zip에서는 Solid 압축을 지원하는데, 이 기능을 쓰면 차등백업이 정상적으로 동작하지 않는다고 한다.그래서 Off로 처리한다. (https://www.dotnetperls.com/7-zip-examples 에서 Solid archives 의 내용을 참고한다.)

-t7z  7zip 파일포맷을 사용한다는 의미. zip으로되 되기는 하지만, 압축적 효율성이나, 오류 대응이 7zip 포멧이 우월한다. 특별한 경우가 아니면 7zip 포멧을 강력히 권장한다.

-u- 업데이트(차등백업) 옵션을 초기화 한다. (뒤에서 설정하는데 왜 이렇게 하는지는 잘 모르겠다.

-up0q3r2x2y2z0w2!diff_%date%.7z  제일 복잡한 옵션인데, -u 까지는 업데이트(차등백업) 옵션이라는 의미고 p0q3r2x2y2z0w2 는 각각 업데이트 결과물에 대한 옵션이다. 여기서 설명하기는 너무 양이 많아(?) 아주 잘 설명되어 있는 사이트를 제공한다. http://a32.me/2010/08/7zip-differential-backup-linux-windows/ 마지막으로 !diff_%date%.7z 부분은 차등백업된 결과물이 저장되는 위치 및 파일명을 의미한다. ! 로 구분하고, 그 뒤에 파일명이 오면 된다.


전체 압축한 파일과 차등백업 파일들을 한 셋트로 잘 보관 해주면 된다.

(전체 압축한 파일이 변경되면 차등백업 파일들도 모조리 복원이 불가능하니, 반드시 원본 유지는 잘해야 한다.)


차등 복원 방법

복원의 순서는 원본을 적당한 위치에 복원을 하고, 그 뒤에 차이점을 저장한 백업을 해제하면 된다.
차이점 부분은 원하는 시점의 차이점으로 부으면 된다.

"C:\Program Files\7-Zip\7z.exe" x c:\backup.7z -oc:\recovery_path\
"C:\Program Files\7-Zip\7z.exe" x c:\archive.7z -aoa -y -oc:\recovery_path\

다른 옵션은 차치하고 -aoa와 -y가 있는데, -aoa는 겹치는 파일이 있더라도 무조건 덮어쓰겠다는 의미다. 보통 차이점이다 보니, 파일의 사이즈가 변경된 부분이 있는 경우 원본과 파일경로와 이름이 동일한 경우가 있다. 그러므로 기준 백업에서 생성된 파일도 덮어쓰겠다는 의미다. -y는 여러가지 압축 해제 중 7zip에서 질문을 던지는 경우 무조건 y로 처리하겠다는 의미다.


활용방안

위의 내용 중 차등 백업하는 부분을 배치로 만들어 Task Scheduler(작업스케줄러)에 등록해서 매일 백업하도록 했다. 최소한 매일 전체 백업하는 것 보다 Disk 용량 압박이 많이 줄었다.





728x90

최초 설치 후 아무생각없이 쓰다가, 문득 날짜보기가 조금 힘들다고 생각했는데 지금 보니, 14/11/17 이런식으로 되어 있었다.

17년 11월 14일.

이야...미쿡 분들이야 그렇게 쓴다지만, 우리 입장에선...

게다가, 오전/오후라는 뒤에 붙는 형식은 더더욱이 관리하는 입장에서는 어지럽기까지 했다.

이곳 저곳을 뒤져보다가, 처음에는 Java 사용자로케일 문제라고 생각도 하고, 때로는 운영체제가 지랄맞아서 그런가 싶기도 했다.(필자는 보통 영문판으로 설치해 놓는 나쁨 습성을 갖고 있다.)

그러다가 이 내용을 잘 설명해준 글이 있어 공유한다.

https://tempoplugin.jira.com/wiki/spaces/TEMPO0716/pages/150995129/Changing+date+and+time+formats


내용인 즉슨 시스템 -> 사용자인터페이스 -> 보이는 느낌(???) 으로 들어간 뒤, 맨 아래 쪽에 이에 대한 수정 부분이 있었다. 딱 ISO 8601 스타일로 모조리 바꿔버렸다.

딱딱해 보이지만 딱 보기 좋은듯.


728x90

이 내용은 Technet의 PowerShell 내용을 참고로 내 나름대로 수정했다.

( https://gallery.technet.microsoft.com/scriptcenter/AD-and-hMailServer-account-638691e5 )


동작 방식은 Active Directory의 사용자를 순차적으로 읽어, hMailServer의 COM Object들을 이용해 넣는 방식이다.

PowerShell 로 구성했으며, 당연히 AD 접속이 가능하고, Remote Administrator 객체가 있어야 한다. 

또한 hMailServer가 설치된 서버에서만 동작한다.


Import-Module ActiveDirectory


$hm = New-Object -ComObject hMailServer.Application 
$hm.Authenticate("Administrator", "관리자암호") | Out-Null 
$hmdom = $hm.Domains.ItemByName("knoie.net") 

foreach($acc in $hmdom.Accounts)
{

    echo $acc.Address;

}


foreach($user in  (Get-ADUser -Filter * -Properties EmailAddress -SearchBase "OU=Users,DC=knoie,DC=net")) 
{ 
    $hmaccount = $null;
    $name = ""    
    $name = $user.Name
    $mail = $user.EmailAddress
    try 
    {
        $hmaccount = $hmdom.Accounts.ItemByAddress($mail)
    }
    catch
    {
        $hmaccount = $null;
    }


    if($hmaccount -eq $null)
    {
        $hmaccount = $hmdom.Accounts.Add();
        $hmaccount.ADUsername = $mail;        
        $hmaccount.ADDomain = "knoie.net"
        $hmaccount.Address = $mail
        $hmaccount.PersonLastName = $name;
        $hmaccount.PersonFirstName = "";
        $hmaccount.IsAD = $true;
        $hmaccount.Active = $true;
        $hmaccount.Save();

    }
    else
    {
        #echo $mail;
        #echo "NOT Exsist!";
    }
}


728x90

간단한 메일 서버와 간단한 웹메일 클라이언트를 구축해보았다.

메일 서버는 hMailServer를 웹메일 클라이언트는 RoundCube로 구성했다.


다만, RoundCube에서는 몇가지 설정할 것이 있어 해당 내용만 적는다.


1. 기본 도메인 설정.

왜 그런지 모르겠지만, 기본 도메인 설정이 없으면, local 호스트가 되거나, imap 서버 설정 정보를 기반으로 이메일 주소가 된다. 그래서 aaaa@localhost 라는 이메일 주소가 기본 주소가 되거나, 혹은 aaaa@imap.knoie.net 이런 식으로 되버렸다. 내가 원하는 것은 aaaa@knoie.net 인데 말이다.

그래서 설정 파일을 열어보았다.

설정파일은 config/defaults.inc.php 파일이다.

이중 다음과 같은 설정을 편집하면 된다.

그러면 각 개인들의 이메일 주소가 위와 같이 고정된다.

다만, 이처럼 설정하면 멀티도메인인 경우(하나의 메일서버에 여러개의 도메인을 걸쳐서 쓰는 경우) 문제가 발생할 듯 싶다. 고민 필요.


2. 첨부파일 제어

program/steps/mail/attachments.inc 파일에서 128줄 근처에 파일 체크하는 로직에 아래와 같은 코드를 넣으면 된다. 

if($err = rcmail_check_ispdf($filename))
{
	$ispdferr = true;
	if (!in_array($err, $errors)) {
		$OUTPUT->command('display_message', $err, 'error');
		$OUTPUT->command('remove_from_attachment_list', $uploadid);
		$errors[] = $err;					
	}
	continue;
}


그리고 밑에 에러가 발생했을 때 분기별로 처리하는 로직이 있는데, 그 안에 else if 구분을 아래와 같이 추가해준다.

else if($ispdferr)
{
	$msg  = "Yon can upload only PDF";
}


맨 마지막에 rcmail_check_ispdf 함수를 만들어준다.

function rcmail_check_ispdf($filename)
{
	$file_parts = pathinfo($filename);


    if(!strcmp(strtolower($file_parts['extension']), 'pdf'))
		return;
    
    
    return "Yon can upload only PDF";
    
}


PDF 파일을 제외한 나머지 파일은 업로드 되지 않는다. 물론 체크로직을 좀더 그럴싸하게 정리하면, 더 많은 파일을 확장자로 조절할 수 있다.

728x90

기본적으로 설치된 Power Shell 모듈로는 서버관리를 위한 모듈들이 거의 없다.
사실 Winodws 내 설치본에는 기능들은 다 탑재되어 있는데,
보안상의 이유로 혹은 서버 구성을 단순하게 가져가기 위한 방안으로 대부분의 기능들은 막혀 있다.

특히 Active-Directory 관련된 기능들을 PowerShell 로 하려면 쉽게 되지 않는다.


이 기능을 활성화시키려면, Windows Feature를 추가해한다.
추가시키는 방법은 Windows Server 구성 내용 중 Remote Administration Tools를 활성화시키면 된다.

원하는 도구를 체크하면 그에 관련된 Power-Shell 모듈들이 자동으로 연결된다.
필자의 경우 Active Directory 관련 명령처리가 필요로하여 해당 기능을 활성화 시켰다.





728x90

+ Recent posts

728x90