메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

J2EE 애플리케이션 상호의존도(圖) 작성하기

한빛미디어

|

2003-02-10

|

by HANBIT

8,511

저자: 알렉스(Alex Iskold)와 다니엘(Daniel Kogan), 역 김대곤

J2EE 애플리케이션은 근본적으로 복잡하다. 일반적인 시스템이라 하더라도 수 천 개의 요소(EJB, 자바 클래스, JSP 페이지, 서블릿)를 포함하기 때문이다. 또한 이러한 요소들은 밀접하게 상호의존하면서 복잡한 그물구조를 형성하고 있다. 이러한 복잡성을 적절하게 관리하는 것이야말로 안정적이고 유연한 J2EE 애플리케이션을 작성하는데 필수적인 요소이다. 그리고 이와 같은 복잡한 상호의존관계를 다루기 위해서는 시스템에 속한 모든 컴포넌트 간의 의존관계의 구조에 집중하는 것이 매우 중요하다. 과도하고 불필요한 의존관계는 혼란을 야기할 뿐만 아니라 비용이 많이 들고, 관리하기 어려운 시스템이 되도록 만들기 때문이다. 반면, 안정적인 소프트웨어는 항상 구조화되어 있으며 필요 이상의 의존관계를 가지고 있지 않다.

상호의존도(圖)

J2EE 애플리케이션의 구조는 컴포넌트와 컴포넌트 사이의 관계로 만들어진 상호의존도(圖)로 표현될 수 있다. 규칙은 다음과 같다. 컴포넌트A가 컴포넌트B에 대해 알고 있다면 컴포넌트A는 컴포넌트B에 의존하고 있다. 바꾸어 말해, 컴포넌트A의 코드에서 컴포넌트B를 참조하고 있을 경우 컴포넌트A는 컴포넌트B에 의존하고 있다.

예를 들어 Pet Store의 customer.jsp는 다음과 같은 코드를 포함하고 있다.

이것은 customer.jspCustomerEJB, AccountEJB, ContactInfo에 종속되어 있음을 암시한다.

마찬가지로 CustomerEJB.java의 다음 코드는 CustomerEJBAccountEJB에 의존되게 만든다.
public abstract void setAccount(AccountLocal account);
각 EJB, JSP 페이지, 서블릿이 의존하고 있는 컴포넌트와 그 관계를 조사하고, J2EE 애플리케이션의 상호의존도(圖)를 작성하기 위해 얻어진 시스템의 모든 컴포넌트와 그에 따른 의존관계를 하나로 통합한다.

자바 상호의존도(圖) 예제


[그림 1] UML를 이용한 자바 상호의존도(圖)의 예]

상호의존관계를 효과적으로 분석하기 위해서는 각 컴포넌트와 의존관계를 정확히 규명하고 표시하는 것이 필요하다.

먼저, 간단한 예제를 살펴보자. J2EE의 상호의존도(圖)상에 나타나는 모든 요소들을 고려하는 대신, 자바 언어가 만들어내는 기초적인 상호의존도(圖)를 생각해 보자. 자바에서는 클래스, 인터페이스, 패키지를 요소라고 하며 클래스와 인터페이스는 표준 UML에 이미 정의된 관계(사용-Uses, 포함-Contains, 상속-Extends, 구현-Implements)를 사용하여 연결한다.

[그림 1]은 자바 코드의 일부가 대응되는 상호의존도(圖)로 만들어지는 과정을 보여준다. JFrameFrame를 상속받으며 SwingConstants를 구현하므로 Frame 클래스와 SwingConstants에 의존하고 있다. 또한, JFramekeyEvent 메소드는 KeyEvent 클래스를 인자로 취하고 있기 때문에 JFrameKeyEvent에도 의존하고 있으며, JFramegetClassPanel 메소드는 Component 클래스를 리턴하기 때문에 Component 클래스에 의존하고 있다. 마지막으로 JFrameJRootPane타입의 rootPane 변수를 가지고 있기 때문에 JRootPane에 의존하고 있고 있다.

J2EE의 상호의존도(圖) 예제

J2EE는 J2SE보다 화려한 상호의존도(圖)를 가지고 있다. J2EE는 클래스, 인터페이스, 패키지 뿐 아니라 EJB, JSP 페이지, 서블릿, HTML 페이지, XML 설정파일, jar파일를 요소로 가지고 있기 대문이다.

“Pet Store” 애플리케이션에서 J2EE의 상호의존도(圖) 예제를 작성해보자. CatalogDAO 인터페이스를 중심으로 상호의존 관계를 살펴볼 것이다.

여기서는 자바와 J2EE의 자체 클래스와 인터페이스를 제외한 “Pet Store”만의 자체적인 의존관계를 살펴볼 것이다. 또한 인너클래스(inner class)와 예외(Exception)과 관련된 의존관계도 제외될 것이다.


[그림 2 ] CatalogDAO가 의존하고 있는 요소들


[그림 3] CatalogDAO를 의존하고 있는 요소들

[그림 2]는 CatalogDAO의 메소드 선언들이 어떻게 네 개의 사용-의존관계를 유발하고 있는지를 보여주고 있다. 프로그램 코드에 따르면 CatalogDAOCategory, Page, Product, Item 클래스를 사용한다.

[그림3]은 CatalogDAO 인터페이스를 사용하고 있는 서로 다른 4개의 파일에서 일부를 발췌한 것이다. 우선 CatalogDAOFactorygetDAO 메소드에서 CatalogDAO를 리턴한다. GenericCatalogDAOCatalogDAO 인터페이스를 구현하므로 CatalogDAO에 의존하고 있다. CatalogHelperCatalogEJB 모두 CatalogDAO의 인스턴스를 가지고 있으므로 CatalogDAO에 의존하고 있다.

상호의존도(圖)에서 컴포넌트A가 컴포넌트B에 의존하고 있으면 A와 B는 서로 한 단계 떨어져 있다고 말한다. 그래서 CatalogDAO에 직접 의존되어 있거나 의존하고 있는 모든 컴포넌트는 CatalogDAO와 한 단계 떨어져 있다고 할 수 있다. 그러나 CatalogDAO의 완전한 상호의존도(圖)는 한 단계 떨어진 컴포넌트 뿐아니라 단계에 관계없이 의존이 존재하는 모든 컴포넌트를 포함하기 때문에 예제에 표시되어 있는 것보다 훨씬 크고, 복잡하다.

이제 CatalogDAO와 두 단계 떨어진 컴포넌트를 포함하는 상호의존도(圖)를 그리는 방법에 대해 살펴보자. 이러한 작업을 위해서 CatalogDAO와 한 단계 떨어진 컴포넌트에 대해 생각해보자.

Category, Page, Product, Item, GenericCatalogDAO, CatalogDAOFactory 클래스는 위에서 설명한 대로 CatalogDAO와 한 단계 떨어진 의존관계를 가지고 있다. 그러나 이러한 클래스를 제외하고 CatalogHelperCatalogEJB에 의해서 생기는 추가적인 의존관계에 대해서만 살펴보자.

CatalogHelper는 몇몇 JSP 페이지에서 사용된다. 예를 들면 product.jsp는 CatalogHelper Bean을 참조하는 Bean 태그를 사용한다([그림 4] 참고). 그러므로 product.jspCatalogHelper에 의존하고 있다.


[그림 4] product.jsp는 CatalogHelper를 사용한다


[그림 5] ejb-jar.xml은 CatalogEJB를 사용한다

[그림 5]는 J2EE에서 발생하는 다른 종류의 의존를 보여준다. CatalogEJB의 Deployment descriptor인 ejb-jar.xmlCatalogEJB를 참조한다. 즉, CatalogEJB에 의존하고 있다.

지금까지 설명한 모든 컴포넌트와 그 관계를 하나로 모으면 다음과 같은 상호의존도(圖)를 얻을 수 있다.


[그림 6] CatalogDAO의 두 단계 상호의존도(圖)


[그림] 범례

화살표의 방향은 항상 독립된 컴포넌트에서 의존하고 있는 컴포넌트으로 향한다. 이것은 한 컴포넌트의 변경이 반영되어야 하는 방향이다.

정확한 이해를 위해서 CatalogDAO를 둘러싼 클래스들의 상호의존성을 살펴보자. GenericCatalogDAOCloudscapeCatalogDAO 모두 CatalogDAO를 구현하고 있다. 이것은 이 두 개의 컴포넌트가 Item, Page, Category, Product에 의존되어 있음을 말해주며, [그림 6]에서 이러한 의존관계를 정확히 볼 수 있다.

상호의존도(圖)를 이용한 사고방식

본 기사에서는 간단한 J2EE 상호의존도(圖) 구성하는 법을 살펴보았다. 상호의존도(圖)는 소프트웨어가 가지고 있는 의존관계의 복잡한 네트워크를 표현한다. 또한 각 컴포넌트 간의 의존관계에 대해 다루는 것은 복잡한 J2EE 애플리케이션을 단순화하는데 도움을 준다.

상호의존도(圖)는 시스템의 내부 및 외부 구조의 치밀하고 시각적인 표현을 제공한다는 측면에서 아주 중요하다. 코드 한줄한줄에 집중하다 보면 시스템의 전체 그림을 생각하지 못하는 경우가 많다. 상호의존도(圖)를 이용하여 시각적으로 표현하는 것은 항상 유익한 정보를 제공하며, 간과하기 쉬운 점을 놓치지 않게 한다. 상호의존도(圖)를 살펴보고, 분석하는 것은 필요하지 않은 의존관계를 피하고 예상하지 못했던 의존관계를 발견할 수 있도록 만든다.

Note
  • 복잡계 이론(Complexity Science)에 대한 개괄적인 설명을 위해서는 『Complexity』 (저자 M. Mitchell Waldrop, ISBN 0671872346)를 참조하라.
  • 본 기사에서는 Pet Store 1.3.1를 사용하였다.
  • Factory 클래스는 자신이 생성하는 클래스에 항상 의존하고 있다. Factory 클래스는 자신이 생성할 객체를 알고 있다.
  • 완전한 상호의존도(圖)는 모든 이행(transitive) 의존관계를 포함한다. 즉 A → B, B → C 이면 A → C 의 이존관계가 성립한다.

알렉스(Alex lskold)와 다니엘(Daniel Kogan)은 Small Worlds(소프트웨어 분석 및 시각화 툴)를 개발한 Information Laboratory(뉴욕에 있는 회사)의 설립자이다.
TAG :
댓글 입력
자료실

최근 본 책0