2004-05-28

J2EE 프로젝트 좋은 습관

J2EE(Java 2 Platform, Enterprise Edition)는 웹 애플리케이션 개발을 위한 표준 기술 플랫폼이다. 이 글은 J2EE에 기반한 프로젝트가 성공하는데 필요한 것들을 좋은 습관(Best Practice)으로 정리하는 것을 목표로 한다. J2EE 관련 좋은 습관에 대한 기존의 논의들이 주로 프로그래밍에 초점을 맞추어 왔던데 비해서 이 글에서는 전체 프로젝트 개발 주기를 중심으로 좋은 습관을 정리하였다.


1. 서론

소프트웨어 애플리케이션 개발은 방법론(Methodology)과 기술(Technology)과 사람(People)의 상호 작용을 매개로 진행된다. 따라서 프로젝트 개발 조직이 애플리케이션 개발을 통해서 고객에게 가치를 전달하려면 위의 3가지와 그 관계에 대한 충분한 고려가 선행되어야 한다.

J2EE(Java 2 Platform, Enterprise Edition) 기반 프로젝트라면 어떤 요소들을 고려해야 하는가? 이 글은 이 질문에 대한 바람직한 해답을 찾기 위한 시도의 일부이다.

아래에서 소프트웨어 개발 방법론 각 단계에서 J2EE 기반 프로젝트를 성공으로 이끌 요소들을 좋은 습관(Best Practice)으로 정리하였다. 그런데 명심해야 하는 것은 아래의 좋은 습관이 현업에서 개발하고 있는 애플리케이션의 품질 혹은 프로젝트 생산성을 실제로 향상시킬 수 있는가는 프로젝트 팀원들이 스스로 판단해야 한다는 점이다.


2. 공통

소프트웨어 개발 모든 단계에 공통적으로 적용할 수 있는 좋은 습관들은 아래와 같다. 주로 프로젝트와 그 산출물에 대한 관리와 프로젝트 팀원들간의 커뮤니케이션 수단과 관련된 내용들이다.


좋은 습관 1. 프로젝트의 모든 활동이 1 주 혹은 2 주 안에 완료될 수 있도록 계획하고 체크한다.

모든 프로젝트가 관리되어야 한다는데 이견이 있을 순 없다. 그렇다면 어떻게 하면 프로젝트를 손쉽게 관리할 수 있는가? 우선은 관리해야 하는 대상을 축소하는 것이 방법일 수 있다. 관리를 위한 관리 혹은 가치 창출에 대한 기여가 적은 활동 혹은 대상들에 대한 관리를 제거해야 한다. 그리고 프로젝트의 긴장도를 높여서 관리를 용이하게 만들 수 있다. 긴장도를 높인다는 것은 프로젝트 팀원의 자율적인 관리를 가능하게 함을 의미한다. 프로젝트 팀원들이 수행하는 업무의 기간을 1 주 혹은 2 주 안으로 조정하게 되면 프로젝트의 긴장도가 높아지며 이는 자율적인 관리 기능이 동작할 가능성을 높여줄 것이다. 이는 전체 프로젝트 관리의 초점을 과정이 아닌 각 활동의 결과로 자연히 이동시킨다.


좋은 습관 2. 대면(Face-to-Face) 방식의 커뮤니케이션을 중시하고 모든 이슈에 대해서 즉각적인 피드백이 가능하도록 한다.

전화, 메일, 메신저 등의 커뮤니케이션 수단은 대면 방식의 커뮤니케이션에 대한 보조로서만 의미가 있다. 프로젝트 팀원들의 자리 배치는 대면 방식의 커뮤니케이션을 활성화시키는 방안을 최대한 고려하여 설계한다. 그리고 모든 대면 방식의 커뮤니케이션이 성공적으로 수행되도록 하기 위해서는 이에 대한 피드백이 즉각적으로 제공되는 분위기를 조성해야 한다.


좋은 습관 3. 필요한 산출물은 만들고 불필요한 산출물은 만들지 않는다.

프로젝트의 산출물은 이후의 개발을 위한 것과 운영을 위한 것과 감리를 위한 것 안에 포함되는 경우에만 필요한 것이다. 이에 해당되지 않는다면 일체 불필요한 산출물이다. 그리고 가장 이상적인 것은 감리를 위한 산출물이 개발과 운영을 위한 산출물과 동일한 것이다.

특히 이후 개발을 위한 산출물이 이후 개발이 완료된 후에 작성되는 모순적 상황이 습관적으로 발생한다면 이 산출물이 실제로 필요한 산출물인지에 대해서 검증한다.


좋은 습관 4. 프로그램 소스 코드를 포함한 모든 산출물에 대해서 형상관리를 수행하고, 이를 웹을 통해서 접근할 수 있도록 한다.

형상 관리 도구를 사용해야 한다라는 당위적 주장보다는 형상 관리 도구를 사용했을 때 어떤 장점들이 있는지를 프로젝트 팀원들에게 실습과 다양한 사례를 통해서 경험적으로 설득한다.


좋은 습관 5. 이슈, 리스크, 버그를 자동화하여 관리하고, 이를 웹을 통해서 접근할 수 있도록 한다.

중요한 이슈들이 프로젝트 팀원들의 개인적인 수첩 혹은 머리 속으로부터 꺼내서 프로젝트 팀원들이 모두 공유할 수 있도록 한다.


좋은 습관 6. 용어집(Glossary)을 작성하고, 이를 웹을 통해서 접근 할 수 있도록 한다.

용어 및 그 의미를 통일하고 프로젝트 팀원들이 그 용어를 정확하게 사용하게 한다.


3. 사전 조사

소프트웨어 개발 방법론에서 사전 조사는 기술적인 솔루션의 제안과 타당성 검토를 수행하는 단계이다. J2EE 명세서와 자바 웹 애플리케이션 서버(이하 WAS)를 검토/선택하는 작업이 주요한 활동이다.


좋은 습관 7. J2EE 명세서는 최신 버전이면서 동시에 성숙도가 높은 버전을 선택한다.

경험적인 관찰의 결과 새로운 J2EE 명세서가 발표되는 시점과 이를 구현한 WAS가 출시되는 시점 사이에는 5 개월 정도의 간극이 존재한다. 그리고 그 WAS가 안정화 되는데 5 개월 정도의 시간이 추가로 소요된다. 결국은 최신 버전의 J2EE 명세서와 그를 구현한 WAS 제품의 성숙도를 동시에 고려해서 J2EE 버전을 선택해야 한다. 또한 판단 기준 시점을 프로젝트의 시작으로 할지 프로젝트의 종료 시점으로 할지에 대해서도 의사 결정시 고려해야 한다. 가령 프로젝트의 기간이 긴 경우, 프로젝트 초기 단계에서는 성숙도가 낮던 WAS 제품이 프로젝트 종료 단계에서는 높은 성숙도를 보일 수 있다.

그러나 판단에 있어서 기술적인 부분에 대한 고려도 잊지 않아야 한다. XML 웹 서비스를 이용한 프로젝트의 경우에는 성숙도가 낮더라도 XML 웹 서비스를 공식적으로 지원하는 J2EE 1.4 버전을 선택하는 것이 현명할 것이다.


좋은 습관 8. 자바 WAS는 프로젝트 팀원들의 친밀도를 기준으로 선택한다.

J2EE 버전이 선택되면 그 버전을 구현한 WAS를 선택하면 된다. 선택에 있어서 일차적인 판단 기준은 당연히 프로젝트 예산과 성능과 관련한 고객의 요구사항이다. 이런 사항들을 고려하면 몇 개의 WAS 후보 군이 형성되는데 이 후보 군중에서 하나를 선택할 때의 판단 기준은 프로젝트 팀원들의 WAS에 대한 친밀도가 된다.

일반적인 고정 관념보다는 다양한 WAS 제품 간의 사용법이나 동작 방식의 차이가 크지 않은 것이 사실이나 그럼에도 불구하고 개발 단계 초기에는 WAS에 대한 친밀도가 영향을 미칠 수 있음으로 이를 간과하지 않는다.


좋은 습관 9. 애플리케이션 플랫폼(J2EE 버전, WAS 등)은 테스트 단계까지는 변경할 수 있어야 한다.

.NET이나 PHP와 같은 다른 애플리케이션 개발 플랫폼에 대해서 J2EE가 갖는 장점은 다양한 WAS 구현 제품 중에서 프로젝트에 가장 적합한 것을 선택해서 사용할 수 있다는 점이다. 이런 장점을 극대화하려면 프로젝트의 초기 단계에서 선택한 WAS 제품을 프로젝트 진행 과정에서 추가로 혹은 신규로 도출된 요구사항이나 문제점 등을 고려하여 프로젝트의 마지막 단계에서도 다른 WAS 제품으로 용이하게 바꿀 수 있어야 한다.

이는 운영 단계에서도 고스란히 적용된다. 예를 들어, 사용자의 규모가 작았던 초기 운영 단계에서는 아파치 톰켓을 사용해서 서비스하다가 사용자의 규모가  감당하기 힘든 정도로 커진 경우에 WAS 만을 고성능의 제품으로 바꾸어서 사용자의 증가라는 문제를 일차적으로 해결할 수 있어야 한다.


좋은 습관 10. 자바 IDE는 항상 사용한다.

프로그래밍 생산성을 높이기 위해서 항상 자바 IDE(Integrated Development Environment)를 사용한다. IDE는 개발에 필요한 모든 도구들을 하나로 통한한 것으로 개발자가 여러 도구를 함께 사용하고 학습하는데 따른 불편함을 해소하기 위해서 사용한다. 그리고 제품 선정 시 프로젝트 팀원들이 자바 IDE 사용을 빠르게 학습할 수 있도록 숙련된 교육자 확보가 용이한 제품을 선택하는 것도 바람직한 일이다.

프로젝트 예산에 제한이 있어서 고가의 상용 IDE를 구매하기 매우 어려운 경우에는 EclipseNetBeans와 같은 오픈 소스 IDE 제품을 사용할 것을 적극 권장한다.


좋은 습관 11. 검증된 오픈 소스 솔루션을 적극적으로 사용한다.

자바에는 운영 환경에서 사용할 수 있는 다양한 오픈 소스 솔루션이 존재한다. 비용 절감을 위해 이런 오픈 소스 솔루션에 대한 사용을 권장한다. 아파치, SourceForge, java.net 등의 사이트를 참조한다.


4. 요구사항 분석

소프트웨어 개발 방법론에서 요구사항 분석은 시스템과 관련된 고객의 요구사항 도출 및 정의를 통해서 프로젝트 팀이 수행해야 할 프로젝트 범위(고객에게 인도할 소프트웨어 제품의 범위 및 특성)를 명확하게 파악하고 합의하는 단계이다.


좋은 습관 12. 요구사항은 변경 내용을 포함하여 항상 문서화하고 고객의 승인을 득한다.

소프트웨어 개발 방법론에서 요구사항 문서에는 요구사항 정의서, 요구사항 명세서, 유스 케이스 명세서 등이 있다. 이런 문서화된 요구사항이 없다면 개발하지 않는다. 그리고 변경된 요구사항이 기존의 요구사항 문서에 반영되어 있지 않으면 변경하지 않는다. 결국 요구사항 문서가 없다는 것은 요구사항이 없다는 것이다.

그리고 가능하다면 작성된(혹은 변경된) 요구사항 문서에 대해서 고객의 승인을 받는다.


좋은 습관 13. 비기능적 요구사항(성능, 변경 가능성, 사용 편리성 등)을 경시하지 않는다.

프로젝트의 모든 팀원들이 비기능적인 요구사항에 대해서 관심을 가질 필요는 없다. 그러나 최소한 1 명은 비기능적 요구사항에 대해서 관심을 가지고 있어야 한다. 그리고 바로 그것이 아키텍트의 책임이다.


좋은 습관 14. 각각의 요구사항을 개발하는데 필요한 자원을 예측하고 기록한다.

프로젝트 팀원들의 개발 생산성을 정확하게 측정하고 있으면 프로젝트 관리가 수월하게 된다. 요구사항을 구현하는데 필요한 자원의 예측 내용과 실제 결과의 차이를 분석하여 다양한 정보를 획득할 수 있다. 이런 정보들은 프로젝트의 성공에 긍정적인 영향을 미칠 것이다.


좋은 습관 15. 요구사항 산출물을 토대로 다른 프로젝트로부터 재사용 가능한 컴포넌트 목록을 확보한다.

요구사항에 대한 분석이 완료되면 개략적으로 다른 프로젝트에서 개발한 컴포넌트나 외부에서 소싱할 수 있는 컴포넌트 중 재사용 할 수 있는 것들의 목록을 작성한다. 이런 컴포넌트들을 인지하고 다음 단계인 설계를 진행하면 그렇지 않을 때보다 재사용률을 높일 수 있다.


5. 기능 설계와 테크니컬 설계

소프트웨어 개발 방법론에서 설계는 기능 설계와 테크니컬 설계 단계로 구성된다. 기능 설계는 고객의 요구사항이 어떻게 충족될 것인지를 충분한 구성과 세부 사항을 제시하여 보여주고, 요구사항을 시스템화하는 단계이다. 그리고 테크니컬 설계는 사용자 관점의 기능 설계 명세를 기술적인 관점의 테크니컬 설계 명세로 변환 하는 단계이다.


좋은 습관 16. 프레임워크를 기반으로 설계한다.

MVC(Model View Controller) 디자인 패턴과 Dependency Injection 디자인 패턴 등에 기반하여 만들어진 다양한 프레임워크를 사용하면 애플리케이션 아키텍처를 설계하는데 소요되는 시간 및 비용을 최소화할 수 있다. 또한 프레임워크가 제공하는 다양한 컴포넌트 및 서비스의 사용을 가정하고 설계를 함으로써 설계 혹은 개발해야 하는 부분을 대폭 감소시킬 수 있다. 따라서 프레임워크를 사용하여 프로젝트를 진행하기를 추천한다.


좋은 습관 17. ORM Persistence 프레임워크를 사용하여 설계한다.

ORM(Object-Relational Mapping)은 Persistence를 구현하는 도구 중의 하나이다. ORM 방식은 JDBC(Java Database Connectivity) API를 직접 이용하는 것보다는 성능이 저하된다는 단점을 지니지만, 개발 생산성을 높여주고, 유연한 도메인 모델 방식의 개발을 가능하게 한다는 장점을 지닌다. 단 선택 전에 ORM 도구의 도입으로 인한 비용 증가와 도구에 대한 학습 비용을 충분하게 고려해야 한다.

자바 진영의 JDO(Java Data Object)가 표준이며, 그 이외에도 Hibernate, iBATIS 등의 오픈 소스 솔루션과 오라클 TopLink 등의 상용 솔루션이 있다.


좋은 습관 18. 메뉴 및 화면은 Composite View 디자인 패턴에 기반해서 설계한다.

사용자가 브라우저를 통해서 보는 전체 화면은 여려 개의 (개념적) 구성 화면으로 이루어 진다. 이것을 하나의 프로그램(통상 JSP)으로 개발하는 것은 바람직하지 않다. 그래서 이를 독립적인 작은 프로그램으로 개발하고 이를 결합하는 방식을 취해야 한다. 이는 두 가지 방식으로 구현된다. 하나는 HTML의 템플릿 혹은 아이프레임을 사용하는 방식이다. 두 번째는 Composite View 디자인 패턴을 이용하는 방식이 있다. 후자가 전자에 비해서 유연하고 사용자 편리성을 높이는 장점을 지닌다.

이를 구현한 솔루션으로 타일SiteMesh 등이 있다.


좋은 습관 19. 권한 처리는 J2EE 명세서 및 WAS가 지원하는 모델을 우선으로 고려하여 설계한다.

J2EE 명세서는 웹 애플리케이션과 EJB에 대한 (선언 방식의) 권한 처리 서비스를 제공한다. 물론 이 기능으로 권한과 관련한 모든 요구사항을 충족할 수는 없지만 주요한 기능에 대한 해결은 가능하다. 따라서 이 기능을 충분히 사용하는 것이 바람직하며 이를 위해서 설계 시에 이를 충분히 반영한다.


좋은 습관 20. 타 시스템과의 인터페이스는 컴포넌트로 설계한다.

타 시스템과의 인터페이스를 처리하는 프로그램은 컴포넌트로 설계한다. 컴포넌트로 설계하면 Mock 방식의 테스트가 가능하며, 다른 프로젝트에서 재사용될 가능성도 높일 수 있다.


좋은 습관 21. 다른 프로젝트에서 재사용 가능한 컴포넌트를 추출하여 Extension Point를 함께 설계한다.

컴포넌트가 다른 프로젝트에서 재사용될 수 있으려면 부가적인 노력이 필요하다. 일체의 수정 없이 컴포넌트가 재사용될 확률이 낮다는 것을 고려하여 변경이 필요한 부분을 Extension Point로 설계하여 제공한다.


좋은 습관 22. 에러 코드 및 메시지를 정의한다.

시스템 혹은 업무 로직과 관련된 모든 에러를 에러 코드로 표상하여 통합 관리한다. 에러 코드는 문자열(혹은 숫자열)로 표시하거나 예외 클래스 타입으로 표현할 수 있다. 그리고 동시에 각각의 에러 코드를 설명하는 메시지에 대한 관리도 되어야 한다.


좋은 습관 23. 모든 코드 관련 기능을 하나로 통합하여 설계한다.

통상의 애플리케이션은 다양하게 많은 코드 성 데이터를 사용한다. 데이터 자체만으로 코드 성인지 아닌지를 분별할 수는 없다. 코드 성 데이터는 데이터의 수와 변경 경향으로 판단할 수 있다. 일반적으로 레코드의 수가 300개 미만이면서 변경 및 추가 등의 빈도가 낮은 데이터들이 코드 성 데이터에 포함된다. 이런 코드 성 데이터를 통합해서 관리하는 것이 효과적이다. 코드 데이터의 캐싱 및 UI에서의 표현 등의 기능을 통합해서 가져가야 한다.


6. 개발

소프트웨어 개발 방법론에서 개발은 테크니컬 설계 내용을 프로그램과 데이터로 변화하는 단계이다.


좋은 습관 24. 1 주 안에 개발을 완료할 수 있는 단위로 진행한다.

프로젝트에서 개발 단계가 차지하는 기간이 가장 길다. 이로 인해 개발 단계에서 긴장감을 유지하고 성취감을 장려하는 일은 쉽지 않다. 전체 개발 단계를 1주 단위로 나누어서 개발자가 자신이 개발한 모듈에 대한 결과물을 빨리 확인할 수 있도록 관리하면 이 문제를 어느 정도 해결할 수 있다.


좋은 습관 25. WAS가 아닌 J2EE 명세서에 맞추어서 개발한다.

특정 WAS만이 제공하는 라이브러리는 되도록 사용하지 않는다. 프로그래밍은 J2EE API와 J2EE의 명세서에만 의존해야 한다. 다음 문서를 참조한다. Build to Spec!(Liz Blair)


좋은 습관 26. WAS가 제공하는 기능 및 서비스를 충분히 활용하면서 개발한다.

WAS는 데이터소스를 비롯해서 다양한 서비스를 제공한다. 이 서비스들은 J2EE 명세서에서 지정한 표준과 그렇지 않은 것으로 구분된다. WAS가 제공하는 기능을 만들지 않는다. 그리고 특별한 장점이 없다면 WAS가 제공하는 기능을 다른 솔루션으로 대체하지 않는다.


좋은 습관 27. WAS의 클래스 로딩 구조를 파악한다.

클래스와 자바 라이브러리의 위치에 따라서 애플리케이션이 다르게 동작할 수 있다. 이런 구조에 대해서 올바르게 파악하고 있어야 문제가 발생하는 것을 미연에 방지할 수 있다. 그리고 이 구조는 WAS 마다 상이하다. 가령 아파치 톰켓의 클래스 로딩 구조는 다음에서 확인할 수 있다.


좋은 습관 28. 하루에 2번 이상 개발 중인 애플리케이션을 자동 빌드한다.

프로젝트 진척도 평가의 대상은 통합 서버를 대상으로 한다. 형상 관리 도구에서 매일 2번 이상 애플리케이션을 빌드해서 통합 서버에 배치하고 관리자는 이 내용을 대상으로 진척도 관리를 한다. 개별 개발자의 컴퓨터 혹은 머리 속에 있는 것은 관리 대상이 아니다.


좋은 습관 29. 정기적인 코드 리뷰를 통해서 개발 표준의 준수 여부를 확인하고 획득한 지식을 프로젝트 팀원들간에 공유한다.

개발 표준이 준수되고 있는가? 준수 여부를 어떻게 효율적으로 체크할 수 있는가? 첫 번째는 Code Inspection 도구를 사용해서 개발 표준 준수 여부를 파악할 수 있다. JetBrains의 IntelliJ IDEA IDE에서 제공되고 있는 다양한 Code Inspection의 기능들은 다음과 같다. 그리고 CheckStyle과 같은 도구는 코딩 표준이 지정하고 이를 체크할 수 있도록 해준다. 그러나 이 방식으로는 추상화의 정도가 높은 디자인 수준의 분석을 수행할 수는 없다. 이를 해결하기 위해서 주기적인 코드 리뷰를 수행한다. 그런데 코드 리뷰의 초기단계에서는 주로 개발 표준의 준수 여부에 초점을 두더라도 이후에는 좀 더 바람직한 방법을 찾아내서 이를 개발 표준에 반영해나가는 방향으로 유도하는 것이 바람직하다.


좋은 습관 30. 다양한 구현 메커니즘(Reflection and introspection, Dynamic code generation, Aspect-Oriented Programming)을 활용하여 소스 코드의 중복을 최소화한다.

통상적인 프로그래밍 기법만으로는 모듈화나 소스 코드의 중복을 최소화할 수 없다. 그러나 자바가 제공하는 몇 가지 기교를 사용한다면 이 문제점을 해결하는데 몇 걸음 더 앞으로 나아갈 수 있다.

첫 번째는 Reflection 기능을 사용하는 것이다. 이를 통하여 프로그램을 동적으로 처리할 수 있다. 그리고 자바 가상 머신의 성능이 계속해서 향상됨으로써 Reflection 기능을 사용하였을 때의 가장 큰 문제점이었던 성능 저하 문제가 많이 해소되었다.

두 번째는 코드를 직접 생성하는 것이다. 이는 소스 코드를 생성하는 정적인 방식과 클래스 파일을 만드는 동적인 방식이 있는데 두 방식을 사용하면 유사한 코드의 작성을 자동화할 수 있다. 여기서 주의해야 하는 것은 자동으로 생성된 소스 코드의 경우는 일체 개발자가 수정해서는 안된다는 점이다. 그리고 코드 생성과 관련한 좀 더 자세한 내용은 다음에서 확인할 수 있다.

세 번째는 AOP를 기술을 이용할 수 있다. 이 기술을 이용하게 되면 비즈니스 로직이 아닌 부분들을 일반 클래스에서 분리하여 독립시킬 수 있고 필요에 따라서 다양한 형태로 결합할 수 있게 해준다.


좋은 습관 31. 버그의 처리를 뒤로 미루지 않는다.

확연한 버그를 수정하지 않고 새로운 기능을 개발하는 것은 그 기능을 개발하는데 투입될 노력을 헛되게 만들 수 있다. 버그의 수정으로 인해서 버그 수정 전에 추가하였던 모듈에 대한 추가 수정이 필요한 경우가 있을 수 있기 때문이다.


좋은 습관 32. (가능한) 단위 테스트를 자동화한다.

JUnit 등의 단위 테스트 도구를 사용해서 단위 테스트를 자동화한다. UI(User Interface)에 대한 테스트와 DB와의 연동에 대한 테스트의 경우와 같이 아직 자동화하기 어려운 부분에 대해서는 이를 굳히 적용할 필요가 없다. 그리고 단위 테스트를 자동화하기 쉽게 설계하는 것이 좋은 설계 전략 중의 하나이다.


7. 테스트

소프트웨어 개발 방법론에서 테스트는 통합 테스트 및 시스템 테스트를 통하여 개발된 시스템이 기능, 기술 및 운영과 관련하여 설계 사항들과 부합하는지 증명하는 단계이다.


좋은 습관 33. 테스트는 운영 환경과 동일한 설정에서 진행한다.

통합 테스트와 시스템 테스트는 운영 환경과 동일한 설정에서 진행하여야 한다. 운영 환경에서 웹 서버와 WAS를 분리하는 경우나 클러스터링을 사용하는 경우 이와 같은 설정하에서 테스트를 해야 한다.


좋은 습관 34. 테스트는 요구사항 문서를 기준으로 진행한다.

테스트 케이스 혹은 테스트 시나리오를 작성하였다면 이 산출물들을 테스트의 평가 기준으로 사용하면 된다. 그러나 이런 산출물을 작성하지 않았다면 요구사항 문서로 이를 대체할 수 있다. 프로젝트 진행 과정에서 요구사항이 변경된 부분을 문서에 잘 반영해야 하는 이유가 바로 여기에 있다.

테스트 케이스 혹은 테스트 시나리오는 요구사항 문서와 중복되는 부분이 많기 때문에 이들을 작성한다면 프로젝트 팀원들의 부담이 배가된다. 특히 변경 사항을 잘 반영하지 않으면 무용지물이 되기 십상이다. 따라서 관리 및 산출물 작성 부담을 줄이기 위해서 요구사항 문서로 이를 대체하는 것이 바람직할 수 있다는 것이다.


좋은 습관 35. 통합 테스트는 J2EE 애플리케이션과 DBMS 간의 모든 SQL 쿼리 실행을 모니터링 하면서 진행한다.

DBMS와의 작업 모듈이 애플리케이션의 성능에 가장 큰 영향을 미친다. 그래서 다른 어느 부분보다 DBMS와의 연동 모듈에 대해서는 철저한 모니터링 작업을 수행해야 한다. 이 때 모니터링은 항상 애플리케이션의 소스 코드에는 일체 수정을 가하지 않으면서 이루어져야 한다. 이를 가능하게 하는 것이 바로 Proxy 디자인 패턴이다. 데이터소스와 JDBC 드라이 사이에 Proxy를 사입함으로써 소스 코드에는 일체 영향을 주지 않으면서 원하는 모니터링을 수행할 수 있다. 이를 가능하게 하는 솔루션으로는 P6SPYJDBInsight 등이 있다. 이중 P6SPY는 오프 소스 솔루션이다.


8. 구현

소프트웨어 개발 방법론에서 구현은 개발된 시스템을 고객에게 인계하기 위하여 수행되며, 실제 운영 환경을 구축하여 인수 테스트 및 사용자 교육을 수행하는 단계이다. 여기서는 주로 애플리케이션 배치와 관련된 좋은 습관들을 다룬다.


좋은 습관 36. J2EE 패키징 방법과 특성을 이해하고 애플리케이션은 ear 혹은 war 파일로 패키지하여 배치한다.

J2EE 애플리케이션을 패키지하여 배치할 것인가? 아니면 디렉토리 구조로 배치할 것인가? 디렉토리 구조로 배치하면 소스 코드 상의 에러 처리와 긴급한 변경 사항을 신속하게 반영할 수 있다는 장점이 있지만 몇 가지 구조적인 단점이 존재한다. 첫째로 애플리케이션의 관리 수준이 떨어진다. 별도의 패키지 작업을 거치지 않고 운영 중인 애플리케이션이 임의적으로 변경될 수 있으므로 현재 운영 중인 애플리케이션의 정확한 버전 관리가 어려워진다. 둘째로 WAS가 배치된 애플리케이션의 변경사항을 항상 모니터링 하도록 해야 함으로 WAS의 성능 저하가 발생한다.

반면에 ear이나 war로 배치하는 경우는 변경 사항이 발생했을 때 이를 반영하는데 걸리는 시간이 오려 걸린다는 단점이 있다. 또한 재배치가 이루어지는 경우에는 애플리케이션을 일시적으로 정지해야 하는 부작용도 있다. 테스트를 철저하게 수행해서 에러가 발생하는 빈도를 줄이고 변경 사항에 대한 반영을 일정한 프로세스를 거쳐서 수행한다면 이런 문제를 해결할 수 있다.


좋은 습관 37. 모든 배치 과정을 자동화한다.

형상관리 도구에서 소스 코드를 체크 아웃하는 것부터 패키지된 애플리케이션을 WAS에 배치하고 시작시키는 것까지 모든 배치 과정을 ANT 등의 도구를 사용해서 일괄 자동화한다.
이런 자동화 과정을 반복해서 수행하면서 검증하면 수작업시 발생할 수 있는 실수를 미연에 예방할 수 있다.


좋은 습관 38. JSP는 컴파일해서 배치한다.

사용자(웹 브라우저)의 요청에 의해서 처음 JSP가 실행되는 경우에는 JSP 파일이 서블릿과 클래스로 변환되는데, 이 시간이 길기 때문에 사용자가 시스템의 반응 속도가 느리다고 오판할 수 있다. 특히 고객과의 리뷰나 인수 테스트 시에 이런 문제가 발생하는 것은 바람직하지 않다. 그래서 대부분의 WAS는 배치시에 미리 모든 JSP를 컴파일하는 기능을 제공한다. 그리고 부가적으로 컴파일 에러가 발생하는 JSP를 사전에 수정할 수 있는 기회도 제공된다.


좋은 습관 39. 정적인 리소스는 웹 서버에 배치하고, 운영 중에는 메모리에 캐싱한다.

성능 향상을 위해서 HTML 문서와 이미지 파일과 같은 정적인 리소스와 자바 웹 애플리케이션을 분리해서 배치한다. 여기서 분리는 하드웨어의 분리가 아닌 정적인 자원을 처리하는 웹 서버와 동적인 작업을 담당하는 웹 애플리케이션 서버의 분리를 의미한다. 그리고 웹 서버에 배치된 정적인 자원의 변경 빈도는 상당히 낮음으로 이를 메모리에 캐싱하는 것이 바람직하다.

Caucho Resin과 같은 WAS에 따라서는 분리하지 않는 것을 권장하기도 함으로 이를 확인하여야 한다.


좋은 습관 40. 배치된 애플리케이션에 대한 신규 버전을 생성한다.

성공적으로 애플리케이션을 운영환경에 배치하면, 배치된 애플리케이션을 구성하는 소스 코드들에 대해서 신규 버전을 생성한다. 통상 개발 단계에서는 최신의 소스 코드만을 관리하면 되지만, 운영 중인 환경에서는 그렇지 않다. 운영 이후에 작거나 큰 변경 작업이 이루어지게 되는데 이 과정에서 다양한 버전의 애플리케이션이 생성되게 된다. 이를 효과적으로 관리하지 않으면 현재 어떤 버전의 애플리케이션이 배치되어 있는지를 파악하지 못할 수 있다.


좋은 습관 41. 운영 시스템에서 생성되는 로그 파일에 대한 백업 프로세스를 수립한다.

운영 중인 시스템은 다양한 로그 메시지를 기록한다. 웹 서버, WAS, 애플리케이션, DBMS 등이 다양한 로그 메시지를 여러 파일에 기록한다. 일정 시간이 지나면 로그가 기록된 파일의 크기가 커지게 되는데 이럴 경우 애플리케이션의 성능에 부정적인 영향을 미칠 수 있다. 이런 문제를 사전에 회피하기 위해서 로그가 기록되는 파일의 크기가 일정 수준을 넘어서면 새로운 파일에 로그를 기록하도록 수정하고, 기존의 파일은 미리 지정한 위치로 백업이 되도록 자동화된 프로세스를 수립하여야 한다.


9. 결론

이 문서에서 다루고 있는 대부분의 좋은 습관들은 J2EE 기술을 사용하지 않는 프로젝트에서도 적용할 수 있다. 그리고 읽는 이의 관점에 따라서 이 항목들에 대한 이견이 표출되는 것 또한 자연스럽다. 결국 적용 여부의 판단 기준은 프로젝트에 참여하고 있는 팀원들의 동의에서 찾아야 한다.


좋은 습관 42. 소프트웨어 애플리케이션 개발 프로젝트는 표준을 준수하는 과정이 아니라 표준을 만들어 나가는 과정이다.

프로젝트의 유토피아를 완벽한 개발 표준의 존재와 그것이 준수되는 무결점적 시스템에서 찾기는 버겁다. 표준 자체의 부족함과 표준이 적용되는 과정에서 발생하는 갈등을 인정하고 각 프로젝트의 다양성을 받아들였을 때 추구해야 하는 바가 분명해진다. 프로젝트는 (표준의) 부족한 부분을 메꾸어 가는 고단한 장정이며 동작하는 애플리케이션은 그 선물에 지나지 않는다. 여기서 필요한 것은 끈질긴 참을성이며, 기댈 곳은 고객과 프로젝트 팀원들과의 부단한 대화일 뿐이다.


10. 참고 자료



2004-04-20

Learning Organizations and Software Developer

출처 : IEEE Software March/April 2004
URL : http://www.computer.org/software/homepage/2004/s2fte.htm


Software development guru define insanity as "doing the same exact thing over and over and expecting different results.

소프트웨어 개발 권위자는 "동일한 일을 계속하면서 다른 결과를 기대하는 것을" 어리석은 것으로 정의한다.


Every suggestion would get a reply withing 24 hours.

모든 제안은 24시간 이내에 대답을 얻는다.


If the suggestion was good, the process for implementing it would begin within 72 hours.

제안이 좋다면, 그 제안을 구현하는 것은 72시간 안에 시작된다.

2003-09-07

Who Needs an Architecture?

가끔은 영화를, 특히 많은 사람들이 보는 그런 영화는 꼭 볼 필요가 있나 봅니다. 매트릭스와 같은.
 
 
몇 일간 Martin Fowler가 [IEEE Software(July/August 2003)]에 기고한 [Who Needs an Architect?]라는 글을 들고 출퇴근을 하고 있습니다.
 
의역하면 "도데체 누가 아키텍트를 필요로 하는가?"가 될 도발적인 제목은 글을 여러차례 읽어도 쉽게 그 의미가 다가오지는 않습니다. 풀어야 할 숙제 또는 응전해야 할 화두가 다소곳이 놓여져 있을 뿐입니다.
 
3 페이지가 채 되지 않는 글은 Martin Fowler의 동료로 소개되는 Dave Rice의 "We shouldn't interview anyone who has 'architect' on his resume."라는 푸념으로 시작하며, [What is architecture?], [The architect's roles], [Getting rid of software architecture]로 구성되어 있습니다.
 
Martin Fowler는 ThoughtWorks의 주요 아키텍트로 소개되는 Dave Rice의 명칭 분열증(Title schizophrenia)의 원인을 아키텍트의 독선적인 또는 잘난척하는 이미지(the smug controlling image at the end of Matrix Reloaded)와 아키텍트가 수행하는 기술적 리더십의 필요성의 갈등에서 찾습니다.
 
 
[What is architecture?]
 
I define architecture as a word we use when we want to talk about design but want to puff it up to make it sound important.
                                                                                                                        - Martin Fowler
 
 
In RUP defines Architecture as the highest level concept of a system in its environment. The architecture of a software system is its organization or structure of significant components interecting through interfaces,...
                                                                                                                                     - RUP
 
 
There is no highest level concept of a system... Customers do not care at all about the structure of significant components. So, perhaps an architecture is the highest level concept that developers have of a system in its environment.... What makes a component significant? It is significant because the expert developers say so.
                                                                                                                     - Ralph Johnson
 
 
 
냉소적인 Martin Fowler의 정의를 옆으로 비켜 놓는다면, 이 글을 GoF의 한 명인 Ralph Johnson의 생각을 Martin Fowler가 정리하는 혹은 빌리는 방식으로 진행됩니다.
 
우선 Ralph Johnson은 아키텍쳐가 정의되는 범주를 전체 환경이 아닌 개발자가 생각하는 환경으로 묶습니다.
 
In most successful software projects, the expert developers working on that project have a shared understanding of the system. This shared understanding is called 'architecture'.... it makes clear that architecture is a social construct because it doesn't just depend on the software, but on what part of the software is considered important by group consensus.
                                                                                                                     - Ralph Johnson
 
Architecture is the set of design decisions that must be made early in a project.
                                                                                                        - Another style of definition
 
 
Ralph Johnson이 든 예를 확장하면, 소프트웨어를 J2EE로 구현할지? .NET으로 구현할지는 후자의 정의로는 아키텍처의 구성요소가 되지만, 두전자의 정의를 따르면 아키텍처의 구성요소가 아닌 것이 됩니다.
 
So, this makes it hard to tell people how to describe their architecture. 'Tell us what is important.' Architecture is about the important stuff. Whatever that is.

혹시 Presentation Layer, Business Layer, Integration Layer 등을 칠판에 그리고는 이게 우리가 개발할 시스템의 아키텍처라고 하시지는 않습니까? 뻔한 그림을 가지고. 끊임없이 지루하게 반복되는 교수의 지껄임처럼.
 
 
 
[The architect's roles]
 
So, if architecture is the important sutff, then the architect is the person who worries about the important stuff.

2003-08-16

A Programming Episode

Robert C. Martin의 [Agile Software Development]의 "6 장 A Programming Episode"는 밥 아저씨와 Robert S. Koss가 2000년 말 한 호텔방에서 함께 했다는 프로그램밍 과정을 에피소드 형태로 기술하고 있습니다.

작년에 인터넷을 통해서 대충 보긴 했는데, 오늘 책을 따라가면서 이클립스로 코딩을 하면서 다시 읽었는데 으시시(?)하군요. 영화 [유주얼 서스펙트]나 [식스 센스]와 같은 마지막 반전이 오랜만의 독서의 졸음을 확 달아가게 합니다.

둘은 볼링점수를 계산하는 프로그램을 작성합니다. 둘이서 함께 Pair Programming을 하면서 Test-Driven Developemnt와 리팩토링을 통해서 프로그래밍을 하는 과정을 상세히 기술하고 있습니다. 전부 40 페이지의 분량이긴 한데, 전체의 4/5가 (반복적인) 코드이기 때문에 많다고 느껴지지는 않습니다. 중간에 좀 졸립기도 하지만... 막바지에는...


성급하게 말하면 UML을 통해서 소프트웨어를 설계하려는 사람들의 등에 비수를 꽂고 확인 사살을 하는 내용이라고 생각하면 됩니다. 또한 디자인 패턴이나 객체 지향을 몽매하게 추종하는 사람도 쓴웃음을 숨길 수만은 없는...

하여간 2시간 정도 투자해서 Pair-Programming, Test-Driven Development, Refactoring에 대한 예증적인 경험을 할 수 있는 좋은 글인 것 같습니다.


범인이 케빈 스페이시라는 것을, 혹은 브루스 윌리스가 유령이라는 것을 알고 영화를 보는 것이 맥빠지듯...

책에 있는 내용과 인터넷에서 볼 수 있는 내용은 약간 다릅니다. 책에 있는 코드가 비교적 더욱 깔끔하고, 인터넷에 있는 글에서는 Kent Beck을 만날 수 있습니다.

http://www.objectmentor.com/resources/articles/xpepisode.htm


P.S. 여담으로 마지막에 최종적으로 나오는 코드를 통해 각주가 필요없는 코드란 무엇인가를 알 수 있습니다..

2003-04-24

Test-Driven Development

Test-Driven Development(이하 TDD)에 대한 이야기는 몇차례로 나누어서 진행하도록 하겠습니다. 오늘은 Java 환경에서 TDD를 하는데 꼭 필요한 JUnit Framework에 대한 이야기입니다.
 
 
본론으로 들어가기 전에 몇 가지 말씀드리겠습니다. 첫째는 다시 강조해 말씀드리지만 소개하는 책들이나 글들의 대부분은 저도 읽지 못했습니다. 여기 저기서 좋은 책이더라 혹은 좋은 글이더라는 입소문을 정리해놓고 언젠가는 한번 읽어야지 하고 생각하고 있을 뿐입니다. 설사 읽었더라도 10%도 이해하지 못한 수준으로 읽었을 뿐입니다. 그런데 보내는 글마다 "이 글은 저는 못읽었지만, 누가 그러는데 좋더라"라는 식으로 쓰는 게 어색해 보여서 당연히(?) 제가 읽었다는 투로 할뿐입니다.
 
둘째는 그래서 제가 이야기하는 주제에 대해서 저도 잘 모릅니다. 어쩌면 "주제 넘게" 설치고(?) 있는 것인지도 모르겠습니다. 알기 때문에 주장하거나 글을 쓰는 것이 아니라, 주장하고 싶기 때문에 주장하는 것이고 글을 쓰고 싶기 때문에 글을 쓰는 것입니다. 앎의 크기와는 별개로... 무식하면 용감해진다고 하는 것처럼. 제가 쓰는 글들이 학술 세미나에 발표될 논문도 아닌 거의 낙서(?) 수준인데 학문적 엄밀성 같은 건 없습니다. 그리고 알게 모르게 구라(?)도 좀 있습니다.
 
셋째는 제가 쓰는 글들이 "Agile" 적인 것에 집착(?)하면서 다른 것들을 의도적으로 폄하(?)하거나 무시(?)하는 경향이 있다는 것을 알고 있습니다. 금년 KBL 챔피언 결정전처럼 허재를 위해서 김승현과 김병철, 그리고 힉스가 저같은 허재의 팬들에게는 세상의 나쁜 놈이 되었던 것 처럼... 내년이면 저도 서른이군요. 제가 아무리 설쳐야 CMM이나 RUP가 가지는 위상에 변함이 없을거란, 그리고 Agile에 아무런 도움도 되지 않을 거란 정도는, 그리고 더 이상 세상이 "나"를 중심으로 돌아가지 않는 다는 정도는, 그리고 스스로의 능력의 크기 정도는 알 정도의 철은 들었습니다. 그러나 이것도 맞고 저것도 맞고 혹은 이것도 틀리고 저것도 틀리다는 식의 양비론 혹은 양시론적인 글쓰기는 쓰는 사람이나 읽는 사람이나 지루(?)하지 않을까요. 그건 조선일보만으로도 충분하다고 생각합니다. 앞으로도 쭉 Agile은 좋은 놈(?) RUP와 CMM은 나쁜 놈(?)입니다.
 
넷째, 제가 이런 글들을 쓰는 목적의 하나는 잘난 척(?)하려는 거고, 둘은 Agile을 주장하고 싶은 거고, 셋은 가지고 있는 생각들을 정리하려는 거고, 넷은 공유하려는 것입니다. 중요도 순(?)입니다.
 
 
JUnit Framework
 
"JUnit is a regression testing framework written by Erich Gamma and Kent Beck. It is used by the developer who implements unit tests in Java. JUnit is Open Source Software, released under the IBM's Common Public License Version 1.0 and hosted on SourceForge."
 
Kent Beck과 Erich Gamma가 어느 컨퍼런스 참석을 위해서 타고 가던 비행기에서 함께 만들었다고 알려진 자바 환경에서의 단위 테스트 실행(?) 프로그램입니다. 당연히 비즈니스 클래스였겠지요... 정확하게는 xUnit architecture for unit testing frameworks(이하 xUnit Architecture)로 불리는 자동 단위 테스트 실행을 위한 개념적 디자인을 자바 환경에서 구현한 것으로 파악할 수 있습니다. 이는 MDA(Model Driven Architecture)의 전형적인 예라고 할 수 있습니다. 실제로 xUnit Architecture를 프로그램밍 언어에 맞게 구현한 것이 30여개에 이르고 있습니다. 동일한 디자인(xUnit Architecture)을 공유하면서 다양한 플랫품(언어)에서 구현했다는 점에서 MDA와 같습니다. 그러나 MDA는 하나의 디자인이 상이한 플랫폼들로 구현되는 과정의 자동화를 추구한다는 점에서 특정 프로그램밍 언어 개발자들에 의해서 직접 구현되는 xUnit Architecture와는 다릅니다. 아래의 사이트에서 JUnit Framework에 대한 많은(?) 정보를 얻을 수 있습니다.
 
www.junit.org

 
최소한 자바 개발자들에게는 Martin Fowler의 격찬(?)이 맞다고 생각합니다.
 
Never in the field of software development was so much owed by so many to so few lines of code.

많은 사람들이 단위 테스트를 위한 툴이라는 본래의 목적 외에도 JUnit Framework는 패턴 스터디 대상물로 적격이라고 말합니다. Design Pattern이 실제 프로그램에서 어떻게 구현되는지를 알 수 있게 해주며 동시에 소스코드의 양도 작기 때문입니다. 또한 Kent Beck이나 Erich Gamma가 아직도 개발에 참여하고 있기 때문에 대가의 코드를 직접 접할 수도 있습니다. [JUnit A Cook's Tour]라는 글을 참조하면 좋을 것 같습니다.
 
JUnit Framework에 대한 좋은 읽은 거리는 다음과 같습니다.
 
Test Infected: Programmers Love Writing Tests (Erich Gamma)
http://junit.sourceforge.net/doc/testinfected/testing.htm

JUnit Cookbook (Kent Beck, Erich Gamma)
http://junit.sourceforge.net/doc/cookbook/cookbook.htm

JUnit A Cook's Tour (Erich Gamma, Kent Beck)
http://junit.sourceforge.net/doc/cookstour/cookstour.htm

JUnit FAQ (Mike Clark)
http://junit.sourceforge.net/doc/faq/faq.htm

 
이상은 JUnit(3.8.1)을 다운받으면 그 안(doc 디렉토리)에 모두 들어 있습니다. JUnit FAQ는 계속 수정이 되기 때문에 웹에서 확인하는 것이 좋습니다.
 
Martin Fowler의 [Refactoring: Improving the Design of Existing Code]에도 JUnit과 관련된 장이 있습니다. [Java Tools for Extreme Programming: Mastering Open Source Tools Including Ant, JUnit, and Cactus]에도 내용이 있습니다.

 
JUnit Framework를 설치하고 사용할 줄 아는데 걸리는 시간은 아는 사람들의 도움을 받으면 1시간이면 충분합니다. 사용해보고 싶은 분들은 언제든지 말씀하세요. 다음은 eXtreme Programming(XP)에서의 TDD와 Test-First Programming(TFP)에 대해서 이야기하도록 하겠습니다.
 

 
잡설 하나.
 
xUnit Architecture는 .NET에서는 NUnit Framework로 구현되었습니다.
 
잡설 둘.
 
Grich Gamma의 [Test Infected: Programmers Love Writing Tests]는 꼭 한번 읽어보세요. 이 글은 The Problem, Example, Testing Practices, Conclusions으로 구성되어 있는데 Example을 빼면 1 페이지 정도의 분량입니다. JUnit Framework에 익숙하지 않은 상태라면 Example을 제외하고 읽으시면 됩니다.

2003-04-21

The Unified Software Development Process

1999년 중반부터 2001년 초반까지는 Addison Wesley의 "Object Technology Series"(흰 바탕 겉표지 하단 오른쪾에 Booch, Jacobson, Rumbaugh의 이름을 담은 사각형 박스 낙인(?)이 찍힌 그 책들)가 90년대를 뜨겁게 달구었던 백가쟁명의 시대를 마감하고 천하를 통일한(Unified) 시대로 역사(?)에 오랫동안 기억될 것입니다. 진시황의 진나라처럼 너무나 짧은 기간이었지만...
 

법가(Capability Maturity Model, CMM)에 기반한 그 짧았던 왕조는 자신만의 것이 옳다고 주장하며 분서갱유를 마다하지 않았으며, 불로장생(Model-Driven Architecture, MDA) 꿈을 버리지도 못했습니다. 그러나 그런 왕조의 폭정에 항거하여 단호하게 일어난 이들이 있었으니 그들이 바로 그 자랑스런 에자일 연합(Agile Alliance)이었으며, 그들에 의해 왕조는 그 막을 내렸습니다. 그러나 진시황이 동시에 도량형, 화폐, 거궤, 문자를(Unified Modeling Language, UML) 통일하는 등의 업적이 있었음은 부정할 순 없을 겁입니다.

아마도 탁월한 합리주의자이자 기능주의자인 시황제가 아니었더라면 이런 대업적을 단기간에 이룩하는 것은 불가능했을 것이다. 진시황은 극단적인 합리성과 동시에 극단적인 비합리성이 기묘한 형태로 어우러져서, 아주 꼼꼼하게 정무에 힘쓰는 반면에, 거대건축을 세우거나 선약찾기에 막대한 재정을 쏟아부어 부질없이 낭비를 거듭하는 양극단을 오고가는 극과 극의 이중성을 지닌 인물이었던 것으로 생각된다.
                                                                                                       - 어느 인터넷 사이트에서 펌
 
 
그 시대를 빛냈던 그러나 상대적으로 큰 주목을 끌지 못했던 책이 바로 Ivar Jacobson, Grady Booch, James Rumbaugh가 쓴 [The Unified Software Development Process (이하 UP)] 입니다. 동시에 나온 책 중 [The Unified Modeling Language User Guide]는 Booch 주도로, [The Unified Modeling Language Reference Manual]은 Rumbaugh 주도로 쓰여졌고, UP는 Jacobson 박사(일반적인 그에 대한 존칭임) 주도로 작성되었다고 할 수 있습니다. 사실 UML Reference Manual은 저자가 세명이기 때문에 나온 저주받은 책이라는 느낌이 들고 Rumbaugh 역시 상대적으로 과소평가를 받고 있습니다.


RUP(Rational Unified Process, 이걸 '러프'라고 읽는다면서요?)는 UP(Unified Process)를 상품화한 방법론입니다. 사실 RUP와 관련된 책들이 20권 정도가 있는데, 대표적인 책들이 위의 UP를 비롯해 Philippe Kruchten의 [The Rational Unified Process: An Introduction, 2nd]와 Craig Larman의 [Applying UML and Patterns, 2nd]라고 할 수 있습니다. UP는 깊은(?) 철학에 대해서 설명하는 책이고, Kruchten의 책은 제목 그대로 기대할 것 없는 소개서이며 동시에 Rational 사 툴의 광고 팜플렛 같고, Craig Larman의 책은 Agile에 입각한 실천적인 분석·설계 지침서라고 할 수 있습니다.

 
그리고 RUP에 대한 좋은 자료는 Rational의 [Object-Oriented Analysis and Design Using UML] 교육자료입니다. 현재 야간에 교육하고 있는 수업에서 사용하고 있는 그 자료입니다. 전 2001년 여름에 이 수업을 들었는데, 강사말고 교재만 좋습니다.(강사 멀리서 보면 이쁘고(?) 사람은 무척 좋았습니다. 당시 전 안경을 쓰지 않았슴.) 당시 강사가 RUP를 쓰는 프로젝트에서도 실제로는 Iterative하게 개발하지 않는다고 너무 솔직하게 말하더군요. UP 책의 1/3을 Iterative and Incremental Process 설명에 쏟아부은 Jacobson 박사가 알면 눈물 흘리며 슬퍼했을 겁니다.

글고 한 수강생이 CBD에 대해 질문하자 다른 강사는 이런 말은 했습니다. "CBD의 대가인 Jacobson 박사도 아직 CBD는 시기 상조고 어렵다고 했다. CBD는 현실에 적용하기 힘들거다.(뭐 대충 이런투로)". 솔직히 이 답변은 문제가 될 것이 없습니다. 저 스스로도 그 답변에 동의하고, 당시 RUP는 CBD를 주장하던 사람들로부터 RUP는 CBD 방법론이 아니다라는 공격을 받던 시기였으니까요. 근데 요즘은 RUP = CBD 더군요. 2년만에 RUP가 엄청난 발전을 한건지 아니면... "뻥"이 는건지...
 

개인적인 생각으로는 이정도 자료를 접한 다음은 더 볼 책도, 필요도 없다고 생각합니다. 필요한 건 단지 RUP로 진행되는 프로젝트 경험일 겁니다.
 
하여간 이 책들 중 UP를 읽지 않고 RUP는 논한다면 그는 사기꾼입니다. (UP가 담고 있는 내용을 다른 형태로 접했거나 프로젝트 경험이 많은 사람은 예외입니다.) 그 정도로 중요한 책이라고 할 수 있습니다.
 
 
UP는 크게 3 부분으로 구성되어 있습니다.
 
첫번째는 "The Unified Software Development Process"로 책 제목과 같으며, UP의 핵심 사상을 담고 있습니다. 그 핵심 사상은 "A Use-Case-Driven Process", "An Architecture-Centric Process", "An Iterative and Incremental Process"입니다. 그리고 "People are Crucial"이라는 내용도 있습니다. 이 내용을 보면 Agile로부터 공격받는 RUP를 바라보는 Jacobson 박사의 심정이 궁금합니다. Alistair Cockburn은 Use Case는 Drawing하는 것이 아니라 Writing하는 것이다로 더 많은 지지자(?)를 확보했고(Craig Larman의 책도 Cockburn의 Use Case를 따릅니다), 최소한 J2EE와 .NET 환경의 개발에서 4+1 View에 기반한 아키텍쳐는 아키텍쳐를 위한 아키텍처라는 느낌이 들기도 하며, 마지막 Iterative Process는 현실 프로젝트에서 세부적이고 복잡한 RUP의 개발 단계로 인해 사실상 Waterfall을 벗어나지 못했습니다.
그럼에도 불구하고 그 기본철학은 구구절절히 맞는 이야기들입니다


두번째는 "Core Workflows"로 요구사항 분석부터 테스트까지의 단계별 기법들에 대해서 설명하고 있습니다. 이 부분을 이해하기 위해서는 큰 그림을 그릴 수 있어야 합니다. 그 큰 그림을 그리지 못하면 망(?)합니다. UP를 이해하는데 있어서 가장 어렵고 무시되는 부분이 Iterative Process인데 그 이유가 책에서는 Core Workflows를 Waterfall 형태로 설명하고 있기 때문입니다. 이렇게 평면적으로 판단하면 안되고 입체적인(Iterative)를 것을 고려해서 큰 그림을 그릴 수 있어야만 Core Workflows를 바로 이해할 수 있습니다. 그럼에도 불구하고 Core Workflows는 너무 많은 내용과 형태의 중간 산출물과, 활동(Activity), 역할(Role)들로 필요 이상으로 복잡하며, 이 부분이 Agile 진영이 RUP(UP보다 더 복잡한)를 비판하는 가장 큰 논거입니다.

 
세번째는 "Iterative and Incremental Development"로, Core Workflows가 기술적 기법 중심이었다면, 이부분은 프로젝트 관리 측면에서 다루고 있습니다. 그 관리의 중심에 바로 "Iterative and Incremental" 철학이 녹아들어가 있습니다. 이 부분은 UP에서 가장 중요하지만 가장 재미없는 부분입니다. 2000년 여름인가 Jacobson 박사가 한국에 왔을 때 멀리서나마 볼 수 있는 기회가 있었습니다. 참석자 중 한명이 Jacobson 박사에게 Iterative Process가 "Divide and Conquer"와 뭐가 다르냐고 했을 때, 그리고 실제 Waterfall가 뭐가 다르냐고 했을 때, Jacobson 박사의 대답이 기억에 없습니다. 그 역시 "Iterative and Incremental"이라는 개념이 프로젝트 성공을 위해서 얼마나 중요한 것인가에 대해서는 명확하게 알고 있음에도, 복잡한 UP의 Workflow(Unified라는 말처럼 4가지 방법론이 합쳐져서 발생하며, 동시에 모델링 툴을 비롯한 도구에 대한 의존도 때문에) 때문에 실제 프로젝트에서 Iterative하게 간다는 것이 불가능(?)하다는 것을 인정하지 않을까하는 주제넘는 생각을 합니다.
 
 
잡설 하나.
 
5월에 있는 "XP 2003", 6월에 있는 "Agile Development Conference"와 함께 3대 Agile Conference인 "XP Agile Universe 2003(8월)"에 Ivar Jacobson 박사가 강연자로 나온다고 합니다. 그가 어떤 이야기를 할지가 벌써부터 궁금합니다. UP를 통해 그를 보면 Agile과 그 사이에는 종이보다도 작은 차이만이 있음을 믿게합니다.
 

잡설 둘.
 
위의 3개 Agile 관련 Conference의 공통점은 뭘까요? MS .NET이 모두 후원을 하고 있다는 점입니다. 삥을 뜯겨도 단단히 뜯기는군요.
 

잡설 셋.
 
Agile Alliance는 Agile 진영의 느슨한(?) 연합이라고 생각하시면 됩니다. Agile Alliance 현 이사회(Grady Booch)에 놀랍게도 Grady Booch가 있습니다.

2003-04-20

Scrum Software Development Process

제 머리 속을 맴도는 생각들을 친절하게도 정리한 것 같은 글입니다. Linda Rising과 Norman S. Janoff가 작성한 [The Scrum Software Development Processes for Small Teams (July/August 2000, IEEE Software)]입니다. IEEE Software는 Harvard Business Review에 견줄만한 저널인 것 같습니다.


Scrum Development Process는 "Agile Alliance"의 대표 주자 중 하나입니다. XP(eXtreme Programming)만이 Agile은 아닙니다. XP가 프로그래밍에 초점을 맞춘다면, Scrum은 Management Process에 초점을 맞추고 있습니다. Scrum에 대한 자세한 내용은 [Pattern Languages of Program Design 4]에 실린 [SCRUM: An extension pattern language for hyperproductive software development]를 참조하시면 됩니다.
 
http://ootips.org/yonat/Scrum.pdf
 
그 외 Scrum을 이끌고 있는 Ken Schwaber와 Jeff Sutherland의 홈페이지도 참조하시기 바랍니다.
 
http://www.controlchaos.com/
http://www.jeffsutherland.com/scrum/index.html
 
 
내용 하나
Most development teams respond with, 'Make the chaos go away! Give us better requirements!' Unfortunately or not, chaos is the reality in this new business environment - as software developers we must learn how to meet customer needs and turn this chaos to our advantage.(26 page)
Chaos(멍 청하고 변덕스러운 고객과 기술 및 시장의 급격한 변화 등)는 위협(Threat)이 아닌 사업기회(Business Opportunity)입니다. 멍한 고객이 요구사항을 바꾸자고 하면 화내지 말고 쓰다듬어 주어야 합니다. 이 이쁜 것... Just embrace change!
 
 
내용 둘
Scrum advocates the use of small teams - no more than 10 team members..... (In the big project,) We thought initially that we could simply divide larger teams into collections of smaller subteams, each no larger than 10. We found that when the subteams are independent and the interfaces well defined, this works. When the overlap is considerable and the interfaces poorly understood, the benefits are not as great. Clearly, this(Scrum) is not an approach for large, complex team structures, but we found that even small, isolated teams on a large project could make use of some elements of Scrum. This is true process diversity.(29 page)
아직까지는 Agile Software Development와 프로젝트 규모와의 관계에 대한 적절한 답은 위의 발췌 내용이라고 생각합니다. 결국 규모가 큰 프로젝트는 Agile 대신 다른 것(RUP? ... 옌 될까?)을 선택하거나 위의 조건(when the subteams are independent and the interfaces well defined)을 충족시키도록해야 할 것입니다. 이를 위해서 중요한 것은 Common Team, Core Team에 대한 고민입니다. 다른 Module Team은 주로 Common Team, Core Team과 Interface를 이룰 뿐 자신들끼리의 Interface는 적기 때문입니다.
 
 
내용 셋.
As in all projects, there must be an initial planning phase. During this phase, the project team must develop an architecture and identify a chief architect. During development, the team should be prepared to make changes to this architecture, but they need a plan, an architecture, and a chief architect at the start. The chief architect defines the development project's vision based on this architecture and ensures that visions consistency throughout all the development phases.... 'The Architect role should advise and control the Developer roles and communicate closely with the developers.'(30 page)
개인적으로 Architect라는 역할을 좋아하진 않지만 위의 발췌 내용이 바로 Common Team이 해야 하는 것을 정확하게 서술하고 있습니다. Iterative 개발이 가능하려면 바로 Initial planning phase(혹은 warming up time)을 획기적으로 줄여야합니다. 바로 이게 표준 프레임워크의 목표입니다. 워크 플로우, 동적 메뉴 관리, 인증 및 권한 관리, 개발 기법 및 표준의 제공 등... Enterprise Common Team이 Project Common Team(EPM Common 팀)을 리드하고 도와줌으로써, 프로젝트 구성원은 Core Team을 중심으로 움직이도록 해야합니다. Core Team은 해당 애플리케이션에서 가장 중요한 모듈을 개발하는 팀입니다. 인사애플리케이션 개발의 경우 Core는 임직원 및 부서를 포함한 조직 체계를 관리하는 모듈을 개발하는 것이 될테고, 프로젝트 관리 애플리케이션 개발의 경우 프로젝트 정보를 관리하는 것이 Core가 될 것입니다.
 
 
내용 넷.
A sprint produces a visible, usable, deliverable product that implements one or more user interactions with the system. The key idea behind each sprint is to deliver valuable functionality..... A sprint is time-boxed development, meaning that the end date for a sprint does not change, The team can reduce delivered functionality during the sprint, but the delivery date cannot change.(30 page)
Sprint 는 Iteration 주기와 Release 주기의 중간개념으로 생각하면 됩니다. Sprint의 기간은 무조건(?) 4주보다 짧아야 합니다. SCMS에 비해서 NRMS의 결과나 생산성이 떨어졌던 이유에 대한 답이라고 생각합니다. 도메인의 복잡도에 차이가 있기 했지만 SCMS의 경우에는 time-box를 지켰던데 비해서 NRMS에서는 계속 날짜를 미루면서 Waterfall도 Iterative도 아닌 애매한 방식으로 개발을 진행했던 것이 가장 큰 실수 였다는 개인적인 생각이 듭니다.
 
클라이언트 애플리케이션과 웹 애플리케이션 개발 사이에 나타나는 차이 중에 하나가 바로 Beta 버전의 존재라고 생각합니다. 클라이언트 애플리케이션에는 여러차례의 Beta 버전의 출시 후에 최종 제품이 릴리즈 되는 반면, 웹 애플리케이션에는 Beta 버전 개념이 없는 것 같습니다. Iterative 개발을 하기 위해서는 Beta 버전이라는 개념에 기반한 Dynamic Release 방식을 채택할 필요가 있다고 봅니다.
 
 
내용 다섯.
The organization can make one very important decision at the end of a sprint: whether to continue product development. Given what was delivered during the last sprit and the current state of the market, the stakeholder meeting should address the question, "Should this project contiune?" This is a business decision and must be made after considering all the technical and marketing issues.'(32 page)
어렵지만 회피해서는 안되는 고민인 것 같습니다. 안그러면 NRMS 처럼 됩니다.
 
 
 

저번 주는 5년 전에 배웠던 생산 관리 교제[Operations Management - Strategy and Analysis, 4th (Krajewski / Ritzman)]를 꺼내 읽어야 했습니다. CMM과 RUP에서는 Frederick Tayler의 과학적 관리법이나 포드적 생산방식의 냄새가 난다면 과장일까요. 5년전 생산관리 시간에도 그런 구다닥리 기법은 가르치지도 배우지도 않았습니다. Lean Manufacturing이나 JIT(Just-In-Time) 등에서 Agile의 냄새가 난다면 과장일까요.
 
At XP2002 in Sardinia, noted economist Enrico Zaninotto observed, "... it appeared to me that software industry was trying to mimic method of industrial organization already exhausted ... industrial organization theory changed its view during the 1970's." What the software industry had been trying to mimic over the last twenty years - a more defined and granular approach to the process of software development was discredited and abandoned by a manufacturing industry that embraced lean manufacturing. Enrico observed that lean manufacturing is much like Extreme Programming and the agile processess.
 
XP2002에서 Kent Beck이 이런 말을 했군요.
 
At XP2002, Kent Beck called for focus during the next year on "the year of the manager," as we move agile practices into IT management and even into the business and IT management relationship. Indeed! Agile causes profound changes to this relationship and practicing, educating, and assisting IT and business management in the change will be a major factor in the success of the agile processes over the next years.

이미 NEXT YEAR은 올해입니다. 그리고 벌써 4월말입니다. 중학교 때 보았던 찰리 채플린의 [Modern Times]가 보고 싶은 하루입니다. 그 우울한 웃음도...

2003-04-19

소프트웨어 개발과 생산 관리

OB(Organizational Behavior, 조직행동)와 OR(Operation Research, 경영과학)이 경영학의 양대 축입니다. 전략, 인사, 마케팅은 OB에 뿌리를 두고 있고, 생산관리, MIS, 재무·회계는 OR에 뿌리는 두고 있습니다. 경영학 전공자는 결국 OB를 추구하거나, OR를 추구하거나 경영학과 담을 쌓죠...
 
개인적으로는 OR을 OB보다는 선호했고, 그 중 생산관리 과목(비슷하게는 관리회계, 기업재무 등을 포함해서)에 관심을 가졌습니다. ERP(Enterprise Resource Planning), SCM(Supply Chain Management), CRM(Customer Relationship Manageemnt) 등은 모두 MRP(Material Requirements Planning)에서 발전된 개념입니다.
 

강의 교재는 [Operations Management - Strategy and Analysis, 4th (Krajewski / Ritzman)]를 사용했습니다. 이 때가 제대 후 복학해서 첫학기 였으니깐 98년 1학기 였습니다.(처음 조 모임에 나갔는데 조원들이 OHP로 발표를 한다고 하더군요. OHP가 뭔지 한참 고민했습니다.) 오랜만에 책을 다시 꺼냈는데 놀라운 사실을 발견했습니다. 책은 책장 속에서도 늙어가는 군요.
 
비즈니스 애플리케이션 개발도 생산관리에 기반하고 있거나 혹은 기반해야 합니다. 여기서 잠깐! 혹시 "테일러의 과학적 관리법"이나 "포드의 컨테이너 벨트"를 아신다면 잊어도 됩니다. 그런 구닥다리는 구팔년에도 가르치지 않았습니다. "쨈"없는 CMM 보다는 "쨈"있는 Operation Management를 PM 교육 교재로 삼는다면 PM들이 싫어하겠죠...


9 장 Layout에서는 작업장 또는 사무공간에 대해서 다루고 있네요. 현재 우리는 소프트웨어 개발 공간에 대한 고려가 미흡하다고 생각합니다. 개발자의 행동양식과 의사가 반영되지 않은 개발공간이란 슬픈일입니다. 이런 부분에 대한 고민이 아직은 사치로 보일 수도 있지만 작은 차이가 큰 차이를 만들지 않을까요. Alistair Cockburn이 [Agile Software Development]에서 개발 공간에 대해서 다루고 있습니다.

 
6 장 Work-force Management에서는 Job Specialization과 Job Generalization (Job Enlargement, Job Rotation, Job Rnrichment)에 대한 내용이 있습니다. 세부적인 Role 방식을 따르는 RUP는 Job Specialization을, Agile 방법론들은 Job Generalization을 따릅니다. 인도 사람들에게는 모르겠지만 한국은 Job Generalization이 맞다고 봅니다. 안그러면 기분상하고 쌈납니다.  Ed Romand이 [Mastering Enterprise JavaBeans 2nd]에서 이 부분에 대한 이야기를 하고 있습니다.

2003-04-18

Design by UML VS. Design by Code

소프트웨어 개발에서 소프트웨어 디자인이 중요한 것은 엄연한 사실입니다. 디자인은 소프트웨어 개발의 중심입니다. 문제는 어떻게 디자인을 할 것인가입니다. 대표적인 방법이 Design By UML과 Design By Code (또는 Design By Programming)라고 할 수 있습니다.
 
일반적인 소프트웨어 개발이 [요구사항분석 -> 디자인 -> 구현 -> 배치 -> 테스트] 형태로 이루어진다고 할 때 두 방식은 전혀 다른 모습으로 나타납니다. Design By UML은 각 단계를 더 세분화하는 방식으로 갑니다. RUP 방법론에서 디자인 단계만 10 단계 이상입니다. 반면 Design By Code는 디자인과 구현 단계의 구분을 희석시키면서 각 단계를 단순하게 합니다. 결과적으로 Design By UML은 Waterfall Process를, Design By Code는 Iterative Process를 따르게 됩니다. 역설적인 것은 RUP가 주창하는 개발 모델은 "Iterative and Incremental process"라는 겁니다. RUP를 비판하는 많은 사람들의 주장 중 하나가 바로 "RUP는 Iterative Process를 주장하긴 하지만 RUP를 적용한 프로젝트는 Waterfall로 가기 쉽다"라는 겁니다. RUP의 근간이 되는 UP(Unified Process)는 정말로 훌륭한 방법론입니다. 하지만 Rose를 비롯한 Rational사의 각종 툴의 마케팅 수단으로 악용된(?) RUP는 쓰레기가 된 겁니다.

RUP 가 Design By UML의 한 극단을 차지하고 있다면, Kent Beck은 Design By Code의 다른 극단을 차지하고 있습니다.(eXtreme Programming을 사용하는 모든 사람들이 UML을 사용하지 않는 것은 아닙니다. Kent Beck이 유독 심할뿐입니다.) 그렇다면 어떤 방식을 따를 것인가?

 
논의 진전을 위해 대상 프로젝트를 객체지향언어를 이용한 비즈니스 애플리케이션 개발에 한정하도록 하겠습니다.(UML 자체가 객체지향 방식으로 소프트웨어를 디자인할 때 사용하는 것이고, 우리 회사가 개발하는 시스템이 주로 비즈니스 애플리케이션이기 때문에 이런 범위 제한은 당연하다 하겠습니다.)

 
소스 코드를 담고 싶은 UML

UML의 등장과 성공은 C++가 Java로 대표되는 객체지향언어의 등장입니다. "코드를 UML로 UML을 코드로(Reverse or Forward Engineering)"가 가능해지면서, UML이 부각되었습니다.(Model-Driven Architecture는 여기서 한 걸음더 나간겁니다.) UML은 꾸준히 코드를 담고 싶어합니다. 그러나 언제나 "싶어함"에 그칩니다. 이런 와중에서 사람들은 "소스 코드로 디자인할 수 있다."라는 사고까지 다다릅니다. 디자인은 UML로만 할 수 있는게 아니라 코드로도 할 수 있는 거였다. 사실상 객체지향언어의 등장이 새로운 패러다임 전환을 가져온 것이 바로 "소스코드로 디자인할 수 있다"는 겁니다. Jack Reeves의 [The Source Code is the Design]이 이를 잘 설명해주고 있습니다.

객체지향에 대해서 잘모르면 UML Notation을 알아도 UML을 쓸 수 없습니다. 객체지향에 대해서 잘알면 UML 보다는 코드로 디자인하는 것이 더욱 풍부하고 생산적입니다. 슬픈 UML...
 
 
동작하고 싶은 UML

비즈니스 애플리케이션은 요구사항이 애매모호한데다가 사춘기 소녀처럼 시도때도 없이 변하고 삐지는 특성이 있습니다. 이 문제에 대처하는 방법은 동작하는 시스템을 멍청한(?) 사용자나 고객에게 보여주는 겁니다. "이거 니가 원하는 건 맞아? 아냐? 그럼 어떻게 해줄까?" 만고 불변의 진리는 UML은 동작하지 않는다는 것입니다. 또한 디자인하는 과정에서도 현재의 디자인이 맞는지 확인할 수 있는 것이 중요합니다. UML은 동작하지 않습니다. Design By Code만이 이를 보장해줍니다. 자동화된 단위 테스트를 계속 수정하면서 개발자(혹은 디자이너)는 자신의 디자인에 대한 Feedback을 받으면서 디자인을 수정할 수 있습니다.
 
 
커뮤니케이션이 쉬운 것 같은 UML

UML을 중시하는 많은 사람들은 UML을 통해 고객 또는 비즈니스 도메인 전문가와 쉽게 커뮤니케이션할 수 있다고 생각합니다. 맞습니다. 맞구요... 하지만 뭐하러 그걸 고객이나 비즈니스 도메인 전문가에게 보여줍니까?  커뮤니케이션 대상은 개발자간에 이루어질 뿐입니다. 커뮤니케이션도 UML보다는 코드가...
 
 
결론적으로 소프트웨어 개발은 Design By Code를 중심으로 이루어저야 합니다. UML은 보조적인 수단일 뿐입니다. 보조적인 수단이란 의미는 개발 중에 UML로 작성된 것을 산출물로 관리하지 않는다는 것입니다. 프로젝트의 규모는 "Design By UML이냐? Design By Code나?"는 논쟁과 직접적인 상관관계가 있다고 보지는 않습니다. 그보다는 "Waterfall이냐? Iterative?"라와 관계될 것 같습니다. 이 이야기는 다음 기회에... 어찌되었든 RUP도 "Iterative and Incremental Process"에 기반하고 있다고 주장합니다.
 
 
잡설 하나. 예전에 처음 Rose를 사용했을 때 가장 큰 불만은 작은 모니터와 A4 종이만 지원하는 프린터였습니다. 만약 [마지막 황제] 시절의 대한극장 스크린만한 모니터와 그만한 종이를 지원하는 프린터가 있다면... 그리고 그걸 볼 수 있는 성능 좋은 돋보기가 있다면 Design By UML도 괜찮을 수 있습니다.

잡설 둘. UML이 시스템을 문서화할 때는 좋은 것 같습니다. 지들(고객)이 읽을 것도 아니면서 UML로 작성한 문서를 받으면 "헤헤헤"하니.. 뽀대가 나기는 합니다. 그런데 Reverse Engineering을 아십니까?
 
잡 설 셋. 비용을 고려하면 98년도에 네덜란드가 우리는 5:0으로 이기듯, Design By Code의 Design By UML에 대한 압승입니다. 천이백만원 짜리 툴이라는 게 뽀대는 나지만... 내실을 기할 때입니다. Open Source 진영의 개발자들이 UML을 싫어하는지 아직은 쓸만한 UML 모델링 툴이 없습니다.
 
잡설 넷. 작년 이맘 때까진 저도 RUP와 UML 추종자였습니다. 저처럼 지조가 깊은 사람이 변심한 건 Kent Beck의 "In software development, Duplication is evil. And  UML is duplication of source code. Therefore, UML is evil."이라는 논박하기 어려운 명제 때문이었습니다.

2003-04-16

Refactoring 이야기

Martin Fowler의 [Refactoring - Improving the design of existing code]는 재미없는 책입니다. 하지만 꼭 소장해야하는 책입니다. 이책의 추천사(Forward)도 Erich Gamma가 썼습니다.
 
Refactoring에 대한 Martin Fowler의 정의는 다음과 같습니다.
 
Refactoring (noun) : a change made to the internal structure of software to make it easier to understand and cheaper to modify without changing its observable behavior
 
Refactoring (verb) : to restructure software by applying a series of refactorings without changing it obsevable behavior.
 
 
Refactoring의 전제조건(Precondition)은 동작하는 코드입니다. 이런 이유로 Refactoring은 Design By UML보다는 Test-Driven Development과 궁합이 맞습니다. 동작하는 코드를 이해하기 쉽고 수정 비용이 최소화 되도록 "깨끗하게" 변경하는 것이 Refactoring입니다. 그리고 Refactoring의 완료조건(Postcondition)도 동작하는 코드입니다. 깨끗하지만 동작하지 않는 코드는 아무짝에도 쓸모가 없으니...
 
즉 이런 전제조건(동작하는 코드)과 완료조건(동작하는 코드)이 담보되기 위해서 필요한 것이 바로 자동화된 테스트 케이스입니다. Refactoring의 진행되는 과정과 완료 후에 현재 코드가 동작한다는 것을 간단한 마우스 클릭으로 알 수 있어야 하기 때문입니다. 예를 들면, JUnit Framework가 이런 자동화된 단위 테스트를 제공하는 툴입니다.
 
Refactoring 과정에서 필요한 두번째는 Refactoring 자체를 자동화해주는 Refactoring Browser의 필요성입니다. Intellij IDEA가 현재의 브랜드 파워를 갖추게된 가장 큰 동인이 Refactoring Browser의 개념을 Java 환경에서 현실화해했기 때문입니다. 자동화된 Refactoring은 수동으로 하는 Refactoring 시 발생할 수 있는 에러를 최소화하고, 지루한 단순반복 작업을 없애줍니다. 결과적으로 개발자가 용기를 가지고 과감하게 자주 Refactoring을 할 수 있게 합니다.
 
[Rename Method]는 클래스의 메소드 이름을 변경하는 간단한 Refactoring 입니다. 이를 수동적으로 처리할 때 개발자가 해야 하는 일은 다음과 같습니다.
 
1. Check to see whether the method signature is implemented by a superclass or subclass. If it is, perform these steps for each implementation.
2. Declare a new method with the new name. Copy the old body of code over to the new name and make any alterations to fit.
3. Compile
4. Chagne the body of the old method so that it calls the new one.
5. Compile and test.
6. Find all references to the old method name, and change them to refer to the new one. Comile and test after each change.
7. Remove the old method.
8. Compile and test.
 
Refactoring Broswer를 사용하면 위의 단계를 간단한 마우스 클릭으로 수행할 수 있습니다. 메소드의 이름을 변경하는 것을 막말로 이젠 껌입니다.
 
P.S. 현재 시중에 나와 있는 IDE들이 모든 Refactoring Catalog를 지원하지는 못하고 있습니다. 하지만 자주 사용되는 것들에 대한 지원은 충분하다고 생각합니다.

데이터베이스 리팩토링

축구를 졌습니다. 간만에 Martin Fowler(www.martinfowler.com)의 홈페이지에 방문했는데, 깔끔하게(?) 변경된 사이트에서도 그는 여전히 빛나는군요.
 
새 로 추가된 [Pramod's Database Refactoring Sildes]가 눈에 뜁니다. 작년 연말에 읽었던 [Evolutionary Database Design]의 후속작인 모양입니다. 이 작업(Database Refactoring)은 Martin Fowler가 아닌 Pramod Sadalage(이름이 인도틱하군요..)의 주도로 이루어지나 봅니다. 이 작업에서 Martin Fowler의 역할은 [Refactoring - Improving the design of existing code]의 저자로서의 명성을 Pramod Sadalage에게 빌려주는 것이 아닌가 하는 생각이 듭니다.(Martin Fowler 처럼 그도 [ThoughtWorks]에서 일하고 있으니까!)
 
SK(주) 의 eHR 프로젝트나 지금 왼쪽 발만 담구있는 EPM 모두 관계형 데이터베이스가 전체 시스템에서 차지하고 있는 비중이 크다는 것은 주지의 사실입니다. 대부분의 비즈니스 애플리케이션은 데이터베이스를 분리하고는 생각할 수 었습니다.
 
일반적으로 프로젝트는 E-R 다이어그램을 작성한 후 그 위에 애플리케이션을 입히는 방식으로 진행됩니다. 이런 환경에서 [Evolutionary Database Design]이라는 말은 낯설고 생소한게 사실이지만, 역설적으로 모든 프로젝트는 [Evolutionary Database Design] 방식을 취하고 있습니다. 정적인 데이터의 관계를 보여주는 E-R 다이어그램으로 복잡한 비즈니스 요구사항을 완전히 표현할 수 없기 때문에, 그런 요구사항이 구현되는 과정에서 테이블이 잔인한(?) 난도질을 당하는 것은 슬프지만 엄연한 사실입니다.
 
인도에서 넘 놀다와서 그런지 요즘 EPM 프로젝트를 진행하면서 애를 먹고 있습니다. EPM 전체 시스템에 대한 이해가 부족해서든, 요구사항의 추가나 변경이든 데이터베이스 테이블을 수정해야 하는 경우가 많은데 쉽지가 않습니다. 간단한 경우는 테이블의 컬럼 이름 또는 타입을 변경하거나 칼럼 자체의 삭제나 추가부터 테이블 자체의 삭제 또는 변경까지... 나름대로는 테스트 케이스를 작성했고 테이블을 접근하는 애플리케이션을 단일화하기도 했는데... 오늘 오전도 특정 칼럼의 Default 값을 변경한 결과 반나절을 디버깅하면서 보냈습니다.
 
[Pramod's Database Refactoring Sildes]는 이런 문제에 대한 해답 또는 시작을 제시하려는 시도입니다. Agile 방법론과 규율(Discipline)이 한 짝을 이루듯 Refactoring 작업은 애플리케이션을 개발하면서 늘상 하는 작업들에 규율을 제공합니다.
 
[Pramod's Database Refactoring Sildes]에서 제공하는 Refactoring은 다음과 같습니다.
 
- Add Nullable Column
- Add Default Value
- Remove Default Value
- Update Data
- Insert Data
- Make Column Non-Nullable
- Make Column Nullable
- Move Data
- Add Unique Index
- Drop Column
- Drop Table
- Add Foreign Key
- Remove Foreign Key
- Bulk Changes
- Rename Table
- Rename Column
- Split Table
- Split Column
- Merge Table
- Merge Column
- Add Database Code
- Remove/Change Database
- Add Index
 
 
이제까지는 Refactoring에 대한 관심이 애플리케이션 중심으로 이루어졌다면 앞으로의 Refactoring에 대한 관심은 Database를 중심으로 이루어지지 않을까하는 생각이 듭니다.(정확하게는 데이터베이스 스키마를 변경하려고 할 때, 애플리케이션 단에서 어떤 작업을 전후로 해야 하는가가 Database Refactoring입니다. 그리고 Database Refactoring의 별미는 운영중인 시스템의 시키마를 변경하는 순간일 것 같습니다.)
 
앞으로 Database Refactoring에 CBD에 대한 관심의 1/10 만 투자했으면 하는 작은 소망이 있습니다.
 
P.S. [Pramod's Database Refactoring Sildes]는 Martin Fowler의 [Refactoring]책과 같은 포맷을 가지고 있으며, 조만간 출판되지 않을까합니다.
 
P.S. 슬라이드에 나오는 코드를 보면 Martin Fowler가 [Patterns of Enterprise Application Architecture]에서 제시하고 있는 모든 내용들이 ThoughtWorks에서는 일상적으로 사용되는 것 같습니다. 부럽습니다.