2007-02-07

애플리케이션 개발의 목표

예전에 참여했던 프로젝트에서 애플리케이션을 어떻게 개발할 것인지에 대한 고객 질문에 답하기 위해서 정리한 내용입니다.


설계의 목적 및 방향

본 애플리케이션은 아래의 사항을 만족시키는 것을 목적으로 설계함.

  • 애플리케이션 인도 이후의 손쉬운 유지 보수 지원
  • 요구 사항 변경이나 새로운 기능 요구에 부합하기 위한 확장성 지원
  • 사용자가 애플리케이션을 사용하여 업무 수행을 하는데 지장이 없는 성능 보장
  • 애플리케이션의 주요 기능이나 데이터를 인증을 받지 않은 사용자가 접근하는 것을 방지하는 보안 기능 지원
  • 용이한 테스트가 가능하도록 설계하여 높은 수준의 품질 보장
  • 전체 애플리케이션에 대한 일관성 유지


설계에서 적용하는 기술 및 기법

위의 목적을 달성하기 위해서 아래의 설계 기술 및 기법을 적용함.

애플리케이션 인도 이후의 손쉬운 유지 보수 지원

  • 중복의 최소화(동일하거나 유사한 기능이 중복되어 설계되는 것을 방지함).
  • 동일하거나 유사한 구조를 갖는 기능을 하나의 컴포넌트로 통합하여 설계(분리하여 설계하면 애플리케이션 관리 비용이 증가하고, 시스템 성능에 부정적인 영향을 미침).
  • 모든 컴포넌트는 추상 상위 컴포넌트 클래스를 상속하도록 설계하여 공통적인 기능을 제공함.

요구 사항 변경이나 새로운 기능 요구에 부합하기 위한 확장성 지원

  • CBD(Component-Based Development)에 충실하여 컴포넌트의 인터페이스와 구현을 분리.
  • 컴포넌트를 사용하는 클라이언트 코드의 변경 없이 컴포넌트의 구현부 변경.
  • 다양한 디자인 패턴(Model-View-Controller, Inversion Of Control, Strategy/Status, Command 패턴 등)을 적용하여 변경이 용이하도록 설계.

사용자가 애플리케이션을 사용하여 업무 수행을 하는데 지장이 없는 성능 보장

  • 안정적인 성능을 보장하기 위해서 POJO(Plain Old Java Object) 방식을 통해서 컴포넌트 설계 및 구현.
  • 분산 기능이 필요한 경우에 한해서 성능에 부정적인 영향을 미치는 EJB를 제한적으로 사용.
  • 웹 UI에서 이미지의 사용을 최소화하고 웹 브라우저로 전송되어야 하는 HTML의 양을 최소화함.
  • 변경이 없거나 변경 빈도가 낮은 데이터(코드, 부대 코드, 메시지 등)를 캐싱하여 불필요한 DB 작업을 최소화함.
  • 자바 스크립트를 이용하여 보안에 문제가 없는 기능을 웹 브라우저에서 수행하여 서버의 부담을 최소화함.
  • DataSource 및 Connection Pooling 기능을 사용하여 안정적인 DB 성능 보장

애플리케이션의 주요 기능이나 데이터를 인증을 받지 않은 사용자가 접근하는 것을 방지하는 보안 기능 지원

  • 권한을 중심으로 보안 기능 설계(Role 디자인 패턴 적용).
  • 사용자 로그인 시 사용자에게 할당된 권한 부여.
  • 모든 URL에 대해서 권한 매핑을 하여 권한을 가지고 있지 않은 사용자가 접근하는 것을 원천적으로 방지함.
  • 메뉴, 버튼, 화면, 화면의 특정 영역에 대해서 권한을 가지고 있지 않은 사용자는 볼 수 없도록 함.(Limited View 디자인 패턴 적용).
  • 주민등록번호 등 주요한 데이터에 대해서 암호화하여 관리하고 불필요하게 노출되는 것을 제거함.

용이한 테스트가 가능하도록 설계하여 높은 수준의 품질 보장

  • WAS(Web Application Server)와 독립적으로 테스트를 수행할 수 있도록 설계(HTTP 및 RMI-IIOP 프로토콜에 독립적으로 컴포넌트 설계).
  • JUnit을 이용하여 자동화된 개발자 테스트 수행.
  • 일일 주기의 자동화된 빌드를 통한 계속적인 단위 형상간 통합을 수행하여 시스템 통합 단계에서의 문제점을 최소화함.
  • 자동화된 소스 코드 Inspection을 수행하여 소스 코드의 품질을 높임.

전체 애플리케이션에 대한 일관성 유지

  • CSS(Cascading Style Sheet)를 이용하여 전체 UI의 구조(색상 및 위치)에 대해서 일관성을 유지함. 또한 변경이 필요한 경우 한번의 수정으로 전체 애플리케이션에 반영되도록 함.
  • 소스 코드 표준 규약을 IDE(JBuilder)를 통해서 자동적으로 부여함으로써 완전한 코딩 표준 준수.
  • 각종 설계 및 구현 표준을 작성하고, 지속적인 Peer Review 및 Code Review를 통한 표준의 준수 여부 체크.




컴포넌트 아키텍처를 구성하기 위해 적용된 패턴 및 기준이 명시되었는가?


네트워크 부하 감소

  • 컴포넌트 구현 방식으로 분산 처리가 필요 없는 경우에는 EJB가 아닌 POJO를 사용한다.
  • EJB를 이용한 컴포넌트 구현 시 Fine grained 한 방식이 아닌 Coarce grained 한 방식으로 설계 및 구현한다.
  • EJB를 이용한 컴포넌트 구현 시 Local Interface를 사용해야 하나 제우스 WAS에서는 동일 프로세스 내에서는 Remote Interface와 Local Interface 간에 성능 차이가 없음으로, 테스트의 용이성 및 Fail Over 지원을 위해서 Remote Interface를 사용하여 구현한다.
  • EJB를 이용한 컴포넌트 구현 시 EJB를 호출하는 클라이언트는 Service Locator 디자인 패턴을 이용하여 EJBHome 객체에 대해서 캐싱을 한다.

재사용

  • Variation이 있는 부분에 대해서 Extension Point를 제공한다.
  • Variation은 Strategy/State 디자인 패턴을 적용하여 구현한다.
  • IoC 디자인 패턴을 활용하여 클라이언트는 컴포넌트 구현부가 아닌 인터페이스에만 의존하게 한다.
  • 특정 기술 및 프로토콜(RMI-IIOP)에 대한 의존을 지양한다.
  • 모든 컴포넌트는 공통 기능을 제공하는 BaseComponent를 상속하여 설계한다.
  • 여러 컴포넌트들이 절차를 공유할 때에는 템플릿 메소드 디자인 패턴을 적용하여 설계한다. 이 경우에는 Inner 클래스 사용을 허용한다.

결합도

  • 기능 구현에 있어서 개별 컴포넌트의 완전성을 추구하여 컴포넌트가 의존성을 최소화한다.
  • 그러나 완전성 추구는 기능(혹은 코드) 중복 방지에 우선하지 않는다.
  • 따라서 중복 방지를 위한 컴포넌트 간의 의존을 허용한다.
  • 컴포넌트 설계 기법 뿐만 아니라 객체지향 설계 개념도 충실하게 반영하기 위해서 컴포넌트 간의 상호 참조를 일정부분 허용한다. 단, 이는 같은 형상 내에서만 허용한다.
  • 형상 간에는 타 형상의 Sys 컴포넌트에 대해서만 참조를 허용한다. 이는 Facade 디자인 패턴을 적용한 것이다.
  • 같은 형상 내에서는 컴포넌트 상호 간의 순환 참조가 꼭 필요한 경우에는 허용하나 최대를 이를 회피해야 한다. 그러나 타 형상 간에는 순환 참조를 절대 허용하지 않는다.