라이브러리
프로그래밍언어, 각종코드, 관련동향, 논문 등의 저장소
IT Library (284)
[객체지향 SW 설계의 원칙] ① 개방-폐쇄 원칙

[객체지향 SW 설계의 원칙]① 개방-폐쇄 원칙

-다시 보면 크게 보이는 개방-폐쇄 원칙

 

연재순서
1회.다시 보면 크게 보이는 개방-폐쇄 원칙
2히.헤어져서 행복해진 사례연구, 단일 책임 원칙
3회.인터페이스 분리의 원칙
4회. 리스코프 치환 원칙
5회. 의존 관계 역전의 원칙
6회. 정리

 

소프트웨어 설계의 묘미는 개발자가 작업하는 시스템의 창조자 역할을 할 수 있다는 것이다. 실세계의 경우 좋은 세상을 만들기 위해 적절한 질서, 정책, 의식 등이 전제돼야 하듯, 소프트웨어 설계의 경우는 객체와 객체간의 유기적 관계를 가장 효과적으로 구성하는 방법이 관건이 된다.

설계자는 자신의 문제영역에서 몇 가지 원리, 원칙, 패턴, 모델에 따라 문제들을 해결하면서 좋은 설계를 만들어간다. 이런 원리, 원칙들은 과거의 선배 설계자들이 시행착오를 거치면서 발견했던 것들이며 ‘설계자’란 종의 유전자에 묵시적으로 주입한 원칙들이다. 필자는 이번 연재를 통해 이 원칙들을 여러 측면에서 심도 있게 다룰 계획이다.

정상 세포와 암 세포는 거의 동일한 구조로 되어 있다. 단지 암 세포는 변이를 일으켜 정상 세포와 조금 달리 행동할 뿐이다. 세포 하나만 놓고 봤을 때는 크게 위험할 것 같지 않다. 하지만 이러한 세포들이 모였을 때 어떤 규칙은 생명을 유지하는 항상성을, 어떤 규칙은 생명을 앗아가는 암을 일으킨다. 개별 세포의 몇 가지 행동 방식이 다를 뿐이지만, 수천수만의 세포가 상호 작용하게 되면 이 조그만 규칙의 차이는 걷잡을 수 없이 커지게 된다.

세상은 생각보다 단순하다
유명한 NP 문제 중에 TSP(Traveling Salesman Problem)라는 것이 있다. 여러 도시가 있을 때, 가장 빠른 시간에 모든 도시를 순방하는 경로를 찾는 문제다. 언뜻 보면 쉬울 것 같지만, 도시의 수가 증가함에 따라 경로가 기하급수적으로 늘어나기 때문에 최단 경로 찾기는 지극히 어려워진다. 이는 네트워크에서 패킷이 목적지까지 도달하는 최단 경로를 구하는 문제와 똑같다.

1999년 간단한 규칙을 이용해 TSP를 가장 효율적으로 해결한 알고리즘이 발견됐다. 정말 단순하다. A에서 B를 향해 가상의 세일즈맨들을 보내면, 이들이 임의로 경로를 택해 B까지 도달한다. 그리고 B에 도달한 세일즈맨은 자신이 왔던 길을 따라 A로 돌아가면서, 각 도시에 시간이 지날수록 냄새가 옅어지는 무엇을 떨어뜨린다. 이제 다시 A에서 세일즈맨을 보낸다. 이 세일즈맨은 냄새가 가장 짙은 도시를 따라 B까지 가게 된다. 이 경로가 이 알고리즘의 최단 경로가 된다. 이 방법은 매우 효율적인 것으로 알려져 있으며, 유럽의 전화 회사에서 라우팅을 위해 사용하고 있다.

사용자 삽입 이미지
<그림 1> 독일 도시들로 구성한 TSP, 그리고 최단 경로


현대 의학으로 고치기 어려운 암도 결국은 구성 요소들의 간단한 규칙으로 인해 발생한다. 그리고 TSP와 같은 난공불락일 것 같은 문제도 구성 요소 간의 간단한 규칙으로 해결할 수 있다(이 때는 규칙으로 인해 암 대신 최단 경로라는 특성이 창발한다). 구성 요소들이 일정한 규칙을 따르고, 이러한 방식으로 상호 작용하는 요소가 많아질 때 부분보다 큰 전체가 나타나는 것이다.

단순하고 유연한 프로그램과 복잡하면서도 경직된 프로그램이라는 차이도 결국은 프로그램을 구성하는 가장 기본 단위인 객체들이 어떤 규칙을 가지고 상호 작용하는지에 의해 결정된다. 객체들이 정상 세포와 같이 좋은 규칙으로 관계를 맺는다면 좋은 프로그램이 나오고, 암 세포와 같이 (인간이 보기에) 나쁜 규칙으로 관계를 맺는다면 나쁜 프로그램이 나오는 것이다. 간단한 규칙이지만 이를 따라 관계 맺는 객체들이 모여 차이를 낳는다. 이러한 규칙을 알 수 있다면 얼마나 좋을까? 많은 인기를 끌고 있는 디자인 패턴이 이에 대한 답이 될 수 있을까?

디자인 패턴
디자인 패턴은 많은 프로그래머들이 성공적인 프로젝트에서 무수히 반복해 사용했던 문제 해결 기술을 발견해 정형화한 것이다. 각 패턴은 특정 맥락의 문제를 효과적으로 해결할 수 있게 해주며, 패턴들은 해결하는 문제의 맥락(GoF의 용어로는 Intent)이 다르다.

분명 패턴을 잘 이해하고 사용하면, 수많은 개발자, 연구자들의 “아하(Aha)!” 경험을 (그들이 들였던 노력에 비해서는) 손쉽게 사용할 수 있게 된다. 하지만 패턴은 빈번히 발생하는 ‘특정’ 문제에 대해 적용할 수 있는 해결책이기 때문에 객체들 간의 게임에 법칙에 관한 일반 룰까지 알려주지는 않는다.

패턴이 좋은 게임의 규칙을 이용해 객체들의 관계를 맺고 있음은 분명하다(좋은 게임의 규칙을 사용하고 있지 않다면, 특정 문제에 대해서도 좋은 해결책이 나올 수 없다). 그런데 이 때 패턴이 암묵적으로 사용하는 게임의 법칙을 모르면, 패턴이란 고도의 게임 전술을 유용하게 구사할 수 없게 된다. 패턴은 성공한 프로젝트 코드들에서 발견, 일반화되는 과정에서 코드에서 디자인으로 추상화됐기 때문에 이들 다시 코드로 구체화하려면 패턴이 사용하는 게임의 법칙을 알아야 한다. 이를 모른다면 장님이 코끼리 다리 만지듯 패턴을 사용하게 될 위험이 있다. 패턴을 사용해 프로그램을 만들었는데, 괜히 복잡해지기만 하던 걸? 글쎄….

게임의 법칙은 있다
수십 년간, 많은 개발자, 연구자들은 베일에 가려진 좋은 게임의 법칙을 찾기 위해 노력해 왔다. 노련한 개발자의 경험이 깃든 패턴으로 승화된 디자인은 이러한 게임의 규칙을 철저히 지키고 있으며, 이러한 규칙들을 지킨다면 단순하면서도 유연한 프로그램이 창발하게 된다. 이번 글에서는 많은 사람들이 노력해 발견한 이러한 게임의 법칙을 설명하려 하며, 구체적인 내용은 다음과 같다.


◆ OCP(Open-Closed Principle) : 개방-폐쇄 원칙
◆ LSP(Liskov Substitution Principle) : 리스코프 교체 원칙
◆ SRP(Single Responsibility Principle) : 단일 책임의 원칙
◆ DIP(Dependency Inversion Principle) : 의존 관계 역전 원칙
◆ ISP(Interface Segregation Principle) : 인터페이스 격리 원칙


이제 본격적으로 OCP에 대해 살펴보자.

개방-폐쇄 원칙
휴대전화를 살 때마다 느끼는 것이지만 똑같은 기능을 하는 충전기가 (같은 회사의 제품임에도 불구하고) 저마다 다른 모양으로 제작되는지 불만이었다. 의도는 뻔하게도 하나라도 더 팔아서 이윤을 높이기 위함이다. 기업에는 이익이겠지만 소비자에게는 똑같은 기능의 부품을 또 사야 하는 스트레스를 유발시키고, 국가적으로도 엄청난 자원 낭비가 될 만도 하다.

얼마 후 정통부에서 표준 규격으로 24핀 잭을 발표했다. 그 정책 덕분에 이제 휴대전화만 사고 충전기는 재사용할 수 있게 됐다. 따라서 휴대전화의 여러 종류에는 ‘개방하지만’ 충전기의 쓸데없는 생산은 ‘닫아두는’ 효과를 얻은 것이다. 바로 이번 호에서 소개할 개방-폐쇄의 원칙을 잘 반영한 결과라고 생각한다.

사용자 삽입 이미지
<그림 2> 1×1 호출 관계


다시 우리의 필드로 돌아와서 <그림 2>는 클라이언트가 서버의 서비스를 실행하는 모습이다. 일반적인 경우지만 서버의 서비스 타입이 여러 개 있을 경우 1×n의 클라이언트 대 서비스의 관계가 성립된다. 따라서 각각의 다른 서비스를 호출하는 클라이언트들은 호출 코드를 각 서비스 타입에 따라 다르게 작성해야 한다. 이 때 클라이언트가 파일만을 읽는 것이 아니라 스트링 버퍼로 바이트 배열로 읽는다면 실제로 그 관계는 n×m의 관계가 된다. 이렇게 읽는 대상의 타입이 확장, 변경될수록 복잡도는 <그림 3>과 같이 두 배 이상 증가한다.

사용자 삽입 이미지
<그림 3> n×m 호출 관계


물론 약간의 경력자들은 이런 객체 관계를 무의식적으로 피한다. 실제 자바 설계에도 반영됐지만 보통 <그림 4>와 같은 상속을 통한 다형성을 이용한다. 목적은 InputStream의 확장은 열어두고 클라이언트의 변경은 닫아두기 위함이다. 따라서 클라이언트는 InputStream 자식 클래스의 실제 타입에 상관없이 InputStream을 통해 충분히 읽고 싶은 것을 읽을 수 있다. 즉, 이상적인 1×n의 관계가 됐다. 확장에 대한 비용은 단지 생성 시점에 실제로 사용할 자식 클래스의 타입을 선택해주면 되는 정도다.

사용자 삽입 이미지
<그림 4> 상속을 통한 다형성을 이용한 호출 관계(1×n)


이 개방-폐쇄 원칙을 잘 정의한 버틀란트 메이어(Bertrand Meyer)는 소프트웨어 구성 요소(컴포넌트, 클래스, 모듈, 함수)는 확장에 대해서는 개방돼야 하지만 변경에 대해서는 폐쇄되어야 한다고 말한다. 변경을 위한 비용은 가능한 줄이고 확장을 위한 비용은 가능한 극대화해야 한다는 의미다.

방법은 우선 변하는(확장되는) 것과 변하지 않는 것을 엄격히 구분해야 한다. 변하는 것은 가능한 변하기 쉽게, 변하지 않는 것은(폐쇄돼야 하는 것은) 변하는 것에 영향을 받지 않게 설계하는 것이다. 다음으로 이 두 모듈이 만나는 지점에 인터페이스를 정의해야 한다. 인터페이스는 변하는 것과 변하지 않는 모듈의 교차점으로 서로를 보호하는 방죽 역할을 한다.

서버에 있어서 인터페이스는 확장의 내용이 정의되고 이 규약에 따라 확장이 구체화하는 역할을 한다. 따라서 인터페이스는 서비스 내용을 추상화하는 형태로 제공되므로 인터페이스 설계에 주의가 필요하다. 또한 인터페이스는 클라이언트에 있어서 서버의 확장·변경에 따른 클라이언트 변경을 무색하게 하는 방패가 된다. 서버에서는 인터페이스 규약에 의해서만 확장·변경하기 때문이다. 따라서 안정된 계약에 의한 설계(Design by Contract)를 보장한다.

이를 통해 얻을 수 있는 효과, 즉 목적은 앞의 예처럼 객체간의 관계를 단순화해 복잡도를 줄이고, 확장·변경에 따른 충격을 줄이는 데 있다. 또한 클라이언트는 InputStream의 타입을 알아야 할 시점(InputStream의 자식 클래스 생성 시점)과 각 타입의 무관한 사용 시점(호출 시점)을 명확히 분리해 사용할 수 있다. 따라서 다른 InputStream이 확장될 때 클라이언트에 있어서 InputStream의 자식 클래스를 생성하는 코드만 변경해 주면 된다. 물론 클라이언트의 확장에 따른 코드 충격은 다른 방법으로 단순화, 자동화할 수 있다(환경 변수로 타입을 정의하거나 문자열로 동적 객체 바인딩 메커니즘을 이용하는 등).

사례들
사실 이 원칙은 실세계에서도 흔히 찾아볼 수 있을 정도로 너무도 당연한 원칙이어서 소프트웨어에서 사례를 찾는데 오히려 안 보이는 곳이 없을 정도로 많이 적용된 원칙이다.

사용자 삽입 이미지
사례 1 : 컴파일러의 계층
사용자 삽입 이미지
 
사용자 삽입 이미지
컴파일러 개발자들은, 특히 GCC 같이 여러 종류의 시스템에 포팅되는 소프트웨어를 만드는 사람은 고생이 많을 것이다. 시스템마다 바이너리 포맷이 다르고 프로세서에 따라 명령어가 차이가 있다. 게다가 병렬 처리나 실시간, 임베디드 시스템의 경우는 제공해야 하는 라이브러리도 가중된다. 여기서 가변적인 요소는 운영체제와 프로세스의 종류이다. 따라서 컴파일러 개발자는 지금 주제의 관점에서 (앞의 두 요소에 의해) 변하는 모듈과 변하지 않는 모듈을 구분하고 이 두 모듈간의 인터페이스를 정의하는 미션이 중요할 것이다.

컴파일러 처리 과정을 보면 이 두 가지의 Open 모듈과 Closed 모듈이 명백히 분리되어 있다. 스캐닝, 파싱이나 구문, 문법, 의미 분석은 OS나 CPU에 영향을 받지 않는 프로그램 언어의 영역이다. 따라서 변경되지 않는 모듈로 보호해야 한다. 하지만 각 플랫폼에 따른 기계어로 바이너리 코드를 만드는 모듈은 포팅되는 시스템마다 확장되어야 하는 모듈이다. 즉 앞에 열거한 작업은 시스템에 의존성이 없기 때문에 시스템이 변경된다 하더라도 변경해줄 필요가 없다.

하지만 기계어 코드를 만드는 과정에서 최적화 제네레이팅하는 작업은 시스템에 의존적이기 때문에 시스템별로 확장을 요하는 모듈이다. AIX, 윈도우, 솔라리스 등의 버전이 필요하게 된다. 따라서 이 모듈은 확장에 적합한 구조로 개방해야 할 것이다. 여기서 중간 표현(intermediate representation) 데이터는 이 두 모듈간의 인터페이스 역할을 한다. 함수 형태의 인터페이스도 있지만 프로토콜과 같이 메시지(데이터 포맷) 형태의 인터페이스도 가능하다.
사용자 삽입 이미지
사용자 삽입 이미지

사용자 삽입 이미지
<그림 5> 컴파일러의 OCP 계층


GCC 처럼 여러 시스템을 지원하는 컴파일러의 경우와 같이 POSIX(Portable Operating System Interface)는 유닉스 기반 운영체제의 시스템 인터페이스 표준이다. 자바의 경우 한번 작성된 코드로 JVM이 제공되는 모든 플랫폼에서 실행을 보장한다(고수준의 플랫폼 추상화). 비슷하게 POSIX 표준 또한 여러 종류의 유닉스 시스템에서 공통으로 제공하는 시스템 인터페이스를 정의하고 있다(저수준의 플랫폼 추상화). 따라서 POSIX를 준수한 시스템 인터페이스를 사용하는 코드는 다른 운영체제의 시스템 함수를 사용하는 데 문제가 되지 않는다.

앞에서 예를 든 정통부의 휴대전화 충전기 24핀 표준 규격이나 자바 표준, POSIX 표준, IEEE에 이르기까지 어디에나 '표준'이 일종의 해결사, 중재자 역할을 한다. 이 '표준'의 역할은 지금의 맥락에서 의미심장하게도 OCP의 '인터페이스'의 기능을 한다. 표준에 의해 사용자는 서비스의 기능(규약)을 신뢰할 수 있으며(closed), 서비스 제공자는 자신의 목적에 맞게 확장·특화하여 서비스의 차별화, 상품성을 높인다(open).

OCP 주의점 1
다시 <그림 5>로 돌아가서, 공통 모듈(shared module)의 존재는 (그림에서와 같이) 시스템을 지저분하게 하는 경향이 있다. <그림 4>와 같이 상속 구조를 갖는 자식 클래스들이 있을 때 공통된 루틴이나 변수를 리팩토링의 ‘Pull Up Method/Pull Up Field’하고 싶은 유혹에 빠진다. 리팩토링은 설계를 깔끔하게 하는 좋은 방법이지만 문제는 대상의 크기에 있다. 위의 공통 모듈이 작을 경우 공통 모듈 재사용성을 얻기 위해 너무 잦은 (다른 영역의) 모듈을 접근해야 하고 모듈 구성도 보는 바와 같이 지저분해진다.

OCP에서 주의할 점은 확장되는 것과 변경되지 않는 모듈을 분리하는 과정에서 크기 조절에 실패하면 오히려 관계가 더 복잡해져서 설계를 망치는 경우가 있다는 것이다. 설계자의 좋은 자질 중 하나는 이런 크기 조절과 같은 갈등 상황을 잘 포착하여 (아깝지만) 비장한 결단을 내릴 줄 아는 능력에 있다.

사용자 삽입 이미지
사례 2 : 미들웨어의 출현
사용자 삽입 이미지
 
사용자 삽입 이미지
C/S에서 미들웨어로의 전환은 역시 변하지 않는 서비스를 독립시키려는 이유에서이다(물론 다른 의미도 많겠지만). 트랜잭션이나 분산 시스템, 메시징 서비스 같은 미들웨어적인 기능은 비대해지는 서버와 클라이언트 모두에게 부담이 됐다. 또한 이 모듈의 목적도 어느 정도 정리되어 있어 변하지 않는 모듈로도 손색이 없다. 따라서 자연스럽게 closed의 영역으로 분리됐다.

하지만 미들웨어도 완결된 시스템이 아니기 때문에 분리되는 과정에서 미들웨어 인터페이스를 만들게 된다. 즉 미들웨어 자체의 버전 업그레이드나 내부 모듈의 확장 여지를 남기기 위해 (변하지 않아서 분리됐음에도 불구하고) 자신의 인터페이스를 클라이언트와 서버에 제공한다.

여기서 레이어 시스템의 양방향 OCP 전략을 볼 수 있는데, 한 레이어의 인터페이스는 관계하는 양쪽을 위해 두 개의 인터페이스로 정의하게 된다. 가령 OSI 레이어에서 각 레이어는 위, 아래를 위한 두 개의 인터페이스를 갖는다. 이로써 그 레이어 내부의 확장·변경으로부터 외부에 전달되는 충격을 무력화한다. 마치 이더넷 카드를 다른 제품으로 바꾼다 하더라도 그 이더넷 카드는 하위 망 계층과 상위 드라이버 계층에 동일한 인터페이스를 준수하기 때문에 동작하는 데 아무 문제가 생기지 않는다.
사용자 삽입 이미지
사용자 삽입 이미지


OCP 주의점 2
하지만 재미있는 현상은 JTA와 같은 어댑터(adapter)의 역할이다. 가령 트랜잭션 모니터의 경우 MS의 MTS나 JTS, 턱시도(Tuxedo)들은 인터페이스의 차이가 있어 비슷한 기능을 함에도 불구하고 상호 운용을 위해 서로의 인터페이스를 변환시켜 주는 어댑터를 필요로 한다. 적절한 비유가 될지 모르지만, InputStream의 예에서도 공유 메모리 스트림을 확장해야 한다고 했을 때 문제가 발생한다. 공유 메모리 접근은 비동기적이기 때문에 기존의 동기적인 read() 메쏘드를 그대로 적용하는 데 문제가 생긴다. 이전까지 동기적인 스트림만 상대했던 설계자에게 있어서 공유 메모리는 경악할만한 요구 사항이다. 이 경우에도 비동기적 접근을 동기적으로 표현하기 위한 어댑터가 필요할 것이다.

확장을 보장하는 open 모듈 영역에서 예측하지 못한 확장 타입을 만났을 때 인터페이스 변경하려는 안과 어댑터를 사용하려는 안 사이에서 갈등하게 된다. 위의 두 예에서처럼 변경의 충격이 적은 후자를 택하는 경우가 대부분이다. 한 번 정해진 인터페이스는 시간이 갈수록 사용하는 모듈이 많아지기 때문에 바꾸는 데 엄청난 출혈을 각오해야 한다. 자바의 deprecated API가 대표적인 경우다.

즉, 인터페이스는 가능하면 변경해서는 안 된다. 따라서 인터페이스를 정의할 때 여러 경우의 수에 대한 고려와 예측이 필요하다. 물론 과도한 예측은 불필요한 작업을 만들고 보통, 이 불필요한 작업의 양은 크기 마련이다. 따라서 설계자는 적절한 수준의 예측 능력이 필요한데, 설계자에게 필요한 또 하나의 자질은 예지력이다.

사용자 삽입 이미지
사례 3 : 커맨드 패턴
사용자 삽입 이미지
 
사용자 삽입 이미지
텍스트 에디터에서 Copy란 명령은 여러 방법으로 실행할 수 있다. 아이콘, 메뉴에서 선택, 오른쪽 마우스, 단축키 등을 통해 사용할 수 있다. 하지만 명령을 요청하는 방법이 다를 뿐이지 처리하는 핸들러는 하나다. 이렇게 요청자와 처리자의 관계가 복잡해지는 객체 관계에서 그 처리를 단순화하기 위해 커맨드 패턴을 사용한다. 즉, 명령을 실행하는 방식이 어떤 방법이든지 Copy 기능을 구현한(execute() 메쏘드로) CopyCommand라는 객체를 생성하여 처리자에 전달하면 처리자는 CopyCommand가 어떤 작업을 하는지 알 필요 없이 execute()를 실행하여 객체 관계를 단순화할 수 있다.

Command 객체는 실제 작업과 정보를 캡슐화하여 처리자에 전달된다. 따라서 복잡도는 낮아진다. 이렇게 처리하는 방식은 스트럿츠에서도 적용되는데, 스트럿츠 Action 클래스는 커맨드 패턴의 좋은 사례가 된다. 커맨드 패턴은 이렇게 호출을 요청하는 요청자와 그 요청을 처리하는 처리자 간에 Command라는 실제 처리 로직을 캡슐한 객체를 통해 의존성을 분리하는 패턴이다.

이제 우리는 이 구조에서도 OCP의 형태를 직관할 수 있다. 이 패턴이 유용한 점은 이 처리 캡슐 단위의 조합으로 또 하나의 처리 단위를 만들 수 있다는 것이다. 가령 '파일 비교'란 명령을 수행하기 위해 '파일 열기' → diff → '파일 닫기' 명령을 두 파일을 통해 수행함으로써 하나의 처리가 완성된다.
사용자 삽입 이미지
사용자 삽입 이미지

사용자 삽입 이미지
<그림 6> 커맨드 패턴


OCP 주의점 3
이 패턴이 성공하기 위한 포인트는 요청자와 처리자 사이의 계약인 커맨드의 역할이다. 처리자는 execute()란 인터페이스만 알면 어떤 처리도 수행할 수 있다. 따라서 서로 의미적 관계가 없는 Command들도 execute()란 메쏘드로 무엇이든 확장할 수 있다. OCP 구조에서 서버가 확장할 수 있는 운신의 폭이 넓어진 반면 클라이언트는 서버가 어떤 처리를 하는지 무지해진다. 물론 커맨드 패턴에서의 execute() 메쏘드는 적절하지만 InputStream 예제에서의 read()를 doWork() 같은 메쏘드로 대치한다면 좋은 구조가 되지 못 할 것이다. 왜냐하면 클라이언트는 자신이 어떤 작업을 하는지 모르기 때문이다.

즉, 인터페이스 설계에서 적당한 추상화 레벨을 선택하는 것이 중요하다. 우리는 추상화라는 개념에 '구체적이지 않은' 정도의 의미로 약간 느슨한 개념을 갖고 있다. 그래디 부치(Grady Booch)에 의하면 ‘추상화란 다른 모든 종류의 객체로부터 식별될 수 있는 객체의 본질적인 특징’이라고 정의하고 있다. 즉, 이 '행위'에 대한 본질적인 정의를 통해 인터페이스를 식별해야 한다. 이것이 OCP의 세 번째 주의점이다.

설계 원칙의 역설
디자인 패턴은 소프트웨어 설계의 좋은 템플릿이다. 우리는 디자인 패턴을 이용하여 설계 모델을 좋은 구조로 유도한다. 이 구조는 소프트웨어 품질을 높이게 하고 기능을 강화시키기도 한다. 소프트웨어 설계 모델의 메타적인 원리가 디자인 패턴의 단위라고 한다면 디자인 패턴에 등장하는 좋은 구조들에 대한 메타적인 원리가 이번 연재를 통해 소개할 원칙들 정도 된다.

이 원리들은 물론 표준화 작업에서부터 아키텍처 설계에 이르기까지 다양하게 적용할 수 있지만 그 크기의 대비를 보면 패턴보다 훨씬 작고 여러 곳에 적용되는 원칙이다. 그리고 우리는 이 원칙들에 자연스럽게 익숙한지도 모른다. 하지만 이 원칙의 정체에 대해서는 (필자가 앞에서 추상화를 언급한 것처럼) 모호하게 생각한다. 이 연재를 통해 좀더 이 원칙들의 의미와 내용을 심도 있게 다룰 계획이다.

초로의 나이이임도 불구하고 태극권의 일인자였던 어느 노인이 이런 말을 했다고 한다. “나는 한평생을 걸쳐 무술을 연습했지만 이제 서기(자세)를 제대로 할 수 있을 것 같다.” 입문자 때 배우는 서기 자세는 아주 쉬운 것 같지만 역설적이게도 아주 어렵다고 한다. 우리에게 있어서 이 설계 원칙이 이 정도의 의미가 아닐까 생각된다. 따라서 한 번 더 고민할 만한 화두일 것이다.@

* 이 기사는 ZDNet Korea의 제휴매체인마이크로소프트웨어에 게재된 내용입니다.

 

최상훈 (핸디소프트), 송치형 (서울대)

2005/04/07

 

사용자 삽입 이미지

 

원문 :http://www.zdnet.co.kr/techupdate/lecture/etc/0,39024989,39134727,00.htm

  Comments,     Trackbacks
개인의 비전을 명확하게 해주는 4가지 질문

사용자 삽입 이미지
사용자 삽입 이미지
2005년 4월 9일 토요일

모든 사람으로부터 배운다

(예병일의 경제노트, 2005.4.7)

그는 주변 사람들에게서 많은 것들을 배우려고 한다. 물론 처음부터 그렇지는 않았다. 사회생활 초년생 때는 낯선 사람들과 마주치는 게 부담스러운 경우가 적지 않았다.

그러나 차츰 사회생활을 해 나가면서 모든 사람들에게서 배울 점이 있다는 것을 알았다. 젊은 사람이든 나이 든 사람이든, 선한 사람이든 악한 사람이든 각각 장점들을 갖고 있다는 것을 발견했다. 그리고 그런 장점들을 자신의 것으로 만들기 위해 노력했다.



모든 사람으로부터 배우려 노력하는 자세. '열린 마인드'의 소유자입니다.
이런 사람은 시간이 갈 수록 '일일신 우일신'하는 모습을 보여줍니다. 누구를 만나든, 나이가 적든 많든, 지위가 낮든 높든 "이 사람에게서 나는 무엇을 배울 수 있을까"를 고민합니다.

하지만 '닫힌 마인드'를 갖고 살아가는 사람이 더 많습니다. 나보다 지위가 낮거나 조건이 부족해보이면, 마음을 걸어잠급니다.

푸르덴셜생명보험의 조의주 상무. 수학을 전공한 여성으로 생명보험업계에서 전문가로 '일가'를 이룬 조 상무는 항상 주변 사람들로부터 배우려 노력했다고 합니다.
여성으로서 사람들을 대하기가 부담스러웠고, 때로는 '상처'도 받았지만 이렇게 생각을 하기 시작하니 실제로 모든 사람들에게 각자의 장점이 눈에 들어오게 됐습니다.

모든 사람으로부터 배우려 노력하는 자세는 자기경영의 핵심입니다.

  Comments,     Trackbacks
[UML 제대로 알기] ④ 닷넷 환경 UML 툴 활용 가이드

[UML 제대로 알기] ④ 닷넷 환경 UML 툴 활용 가이드

 

연재순서
1회.가능성·확장성 품고 등장한 UML 2.0
2회.초보자를 위해 다각도로 살펴본 UML
3회.바로 알고 제대로 쓰는 UML 실전 모델링
4회.닷넷 환경에서 UML 툴 활용 가이드
5회.표준을 넘나드는 UML의 적절한 사용

 

케이스 도구는 양날의 검이다. 활용도에 따라서 소프트웨어를 죽일 수 도 있다. 래쇼날 로즈(이하 로즈) 같은 케이스 도구는 능숙하게 다룰 수 있어야 되기까지 많은 학습 곡선을 필요로 한다. 능숙해진 다음에도 여전히 불편하다.

하지만 IDE와 통합된 케이스 도구는 코드의 자동 생성 등의 많은 편리한 도구를 제공한다. IDE와 통합된 케이스 도구는 UML이라는 것에 너무 얽매이지만 않고 자유롭게만 사용한다면 아주 훌륭한 프로젝트 도우미가 될 수 있다.

전통적으로 MS의 개발 플랫폼에서 사용하는 개발 도구는 MS가 100% 독점하다시피 해 왔다. STL이나 MFC를 개발하거나 사용하는 도구는 거의 비주얼 C++가 독점적이었고, COM 기반의 개발을 위해 사용되는 도구는 거의가 비주얼 베이직이었다(COM 개발을 위해 비주얼 C++를 사용하는 경우도 많이 봤지만 그 당시 이슈가 되던 RAD와는 거리가 먼 환경이었다). 물론 볼랜드의 델파이 등을 많이 사용하기도 했지만 MS의 막강한 개발 도구 비주얼 스튜디오를 넘기에는 벅차 보였다.

닷넷 환경이 발표되고, 닷넷이 산업계에서 서서히 자리를 잡아가자 닷넷 개발 도구의 필요성이 절실해 졌고, 당연히 MS의 비주얼 스튜디오 닷넷이 닷넷 개발 도구의 최강자 자리를 당연히(!) 차지했다. 사실, 비주얼 스튜디오 닷넷이 없으면 닷넷 개발이 불가능하다고 생각하는 사람들도 많다.

볼랜드가 C# 빌더 등의 닷넷 환경을 지원하는 도구를 내 놓았고, 기타 여러 벤더들이 제품을 출시했지만 MS의 아성을 무너트리기에는 역부족이다. 비주얼 스튜디오 닷넷은 닷넷 환경이 존재하는 한 닷넷 기반 IDE의 최강자로서 그 자리를 내놓지는 않을 듯 하다.

그렇다면 비주얼 스튜디오 닷넷에는 약점이 없을까? 아니다, 분명히 약점은 존재한다. 그것도 아주 커다란, 치명적인 약점이 있다. MS는 닷넷 환경을 분명한 객체지향 개발 환경(닷넷 환경에서의 CBD는 객체지향이 없이는 존재할 수 없다)이라고 했다. 객체지향 개발 환경이라면 객체지향 설계 도구가 없다면 그 활용 범위가 반감될 수밖에 없는데, 비주얼 스튜디오 닷넷 엔터프라이즈 아키텍트 버전에 포함된 비지오가 어느 정도 그런 기능을 해 주긴 하지만, 다른 객체지향 개발 도구인 로즈나 볼랜드 투게더(이하 투게더) 등의 편리함과 기능성에는 결코 미치지 못한다.

설계 도구와 개발 도구의 진정한 결합. 이상적인 환경이지만 사실 구현하기 어려운 개발 환경임에 틀림없다. 비주얼 스튜디오 닷넷은 분명 막강한 개발 환경이고, 비주얼 스튜디오 닷넷을 사용하면서 투게더 또는 로즈 같은 개발 도구를 같이 사용할 수는 없을까 하는 생각을 누구나 한번쯤은 해 보았을 것이다. 정말 그럴 수 있을까? 대답은 "물론 있다"이다. 로즈와 투게더는 비주얼 스튜디오 닷넷 XDE를 제공한다(물론 구입해야 한다).

래쇼날 로즈 2000 XDE
객체지향 모델링 도구 중 가장 유명하며, 많이 사용되는 도구인 로즈는 2002년 MS의 비주얼 스튜디오 닷넷에 애드인되어 사용될 수 있는 ‘래쇼날 로즈 2000 XDE for 비주얼 스튜디오 닷넷’을 발표했다(어찌된 일인지 아는 사람도 별로 없고 사용하는 사람은 더더욱 없다). 로즈 XDE를 가지고 있다면 그 자리에서 설치해 보기를 바란다. 물론 설치하는 시스템에 비주얼 스튜디오 닷넷이 설치되어 있어야 한다.

사용자 삽입 이미지
<화면 1> 로즈가 설치된 비주얼 스튜디오 닷넷 2003


로즈를 처음 설치하고 나면 처음엔 아무것도 없다. 도구상자에 뭔가 추가된 것도 아니고, 특별히 뭔가가 설치되었다는 느낌을 받을 수가 없는데(굳이 뭔가 설치되었다는 느낌이라면 아마 비주얼 스튜디오 닷넷의 실행 속도가 눈에 띄게 느려졌다는 느낌이 될 것이다) 솔루션 탐색기를 눈여겨 보면 평소에 볼 수 없던 아이콘이 하나 생겨있음을 알 수 있다. 그 아이콘을 주저 없이 클릭해 보자.

사용자 삽입 이미지
<화면 2> 추가된 동기화 아이콘


동기화 아이콘을 클릭하면 로즈와 비주얼 스튜디오 닷넷이 동기화되어 mdx 파일을 생성한다. 그리고 Model Explorer 창이 새로 생기고 프로젝트에 포함되어 있는 개체들을 탐색할 수 있게 해준다.

사용자 삽입 이미지
<화면 3> 로즈 XDE를 이용하여 Iterator 패턴을 디자인한 모습


로즈를 사용하여 모델링을 어느 정도 마쳤으면, 다시 동기화 버튼을 눌러 순 공학할 수 있다.

사용자 삽입 이미지
<화면 4> 로즈가 생성한 C# 코드


감동의 기능


[1] 너무 깔끔한 코드를 생성하고 닷넷 환경에서 권장하는 주석 내용들을 그대로 생성해준다. 다른 도구들은 생성한 코드의 indentation이 잘 되지 않거나 참조한 라이브러리의 네임 스페이스를 제대로 표시하지 않는 경우가 많은데, 그런 단점이 사라졌다.

[2] 참조한 라이브러리의 개체들을 모두 설계에 사용할 수 있게 해준다. 다른 모델링 도구들은 기본으로 포함되거나 직접 작성한 개체들만이 사용가능 한 경우가 대부분인데, 최상의 도구다운 기능을 보여준다.

[3] 깔끔하고 예쁜 출력을 지원한다. 다른 설계 도구의 경우 한 페이지 또는 두 페이지에 깔끔하게 출력할 수 있는 기능에 대한 지원이 부족한데, 깔끔하고 예쁘장한 산출물을 만들 수 있도록 도와준다.

[4] ASP.NET/ASP/Service Page 들에 대한 설계를 지원한다. Web Presentation Pattern을 응용한 설계가 필요할 때 아주 유용하다.


단점이라면, C#으로 작성한 메쏘드의 수정이 아주 불편하다. 또한, RUP를 너무 강조하는 경향이 있어 닷넷의 빠른 개발과는 어울리지 않는 부분이 엿보이고, 일일이 동기화를 해 주어야 코드와 설계가 연동이 되는데, 에러를 자주 발생하여 동기화가 되지 않는 경우가 빈번히 발생한다.

볼랜드 투게더
비주얼 스튜디오 닷넷에서 다른 유명한 설계 도구인 투게더를 사용할 수 있다. 투게더 역시 로즈와 마찬가지로 비주얼 스튜디오 닷넷에 애드인되어 설치된다. ‘볼랜드 투게더 for 비주얼 스튜디오 닷넷 2.0’을 설치하면 비주얼 스튜디오 닷넷에 투게더 VS.NET Model View라는 창이 생성된다.

사용자 삽입 이미지
<화면 5> 투게더 for 비주얼 스튜디오 닷넷 Model View


또한 솔루션 탐색기에 ModelSupport라는 폴더가 생성되고 폴더 내부에는 .txvpak이라는 확장자를 가지는 모델 파일이 생성된다. 이 파일을 더블클릭하여 모델링 도구를 사용하여 설계할 수 있는 설계 창을 열 수 있다.

사용자 삽입 이미지
<화면 6> 투게더를 사용해서 Iterator 패턴을 디자인 한 모습


투게더는 로즈와 달리, 코드의 실시간 생성을 지원한다. <화면 6>에서 보이는 클래스 아이콘을 더블클릭하면 코드를 곧 바로 생성하게 된다. 코드를 수정하건, 설계를 수정하건 간에 설계 또는 코드의 수정 사항이 즉시 상호간에 적용되게 되어있다.

감동의 기능


[1] 필자가 투게더를 사용해 보고 가장 감동적이었던 기능은 시퀀스 다이어그램을 실시간으로 생성해 주는 기능이었다. 메쏘드가 특정 객체들을 사용하도록 구성되었으면, 투게더는 그 메쏘드의 시퀀스 다이어그램을 아주 믿을만한 수준으로 자동 생성해 준다. <화면 7>은 Petshop 3.0의 AccountController 클래스의 CreateAccount 메쏘드의 시퀀스를 자동 생성한 것이다.


 

사용자 삽입 이미지
<화면 7> 자동 생성한 시퀀스 다이어그램


 


[2] 여러 디자인 패턴에 기반한 설계를 지원한다(로즈 역시 이 기능을 지원한다). GOF 디자인 패턴에 기반하여 설계를 하고자 하면 투게더는 디자인 패턴에서 각 객체들의 역할을 보여주며 각 역할을 하는 객체를 추가하고 삭제하는 Node by Pattern 도구를 지원한다. 투게더는 디자인패턴에 기반한 설계를 쉽고 오류 없이 할 수 있도록 도와주며 특히 디자인 패턴을 공부하는 사람에게 아주 유용한 도구가 될 수 있다.


단점이라면 생성된 코드가 그다지 깔끔하지 않아 재 정렬을 해줘야 한다는 점 등이다. 앞에서 설명한 두 가지 도구의 치명적인 단점이 하나 있다. 닷넷 환경에서는 실행할 때 참조되는 라이브러리를 복사하고 실행시 참조하므로 개발 중 라이브러리를 수정하고 다시 컴파일하여도 누군가 파일을 사용 중이기 때문에 덮어쓸 수 없다는 메시지를 절대로 보여주지 않는다. 하지만 앞의 두 도구는 모델링에 사용하고 있는 참조되는 라이브러리를 ‘물고’있기 때문에 참조하는 프로젝트를 종료하고 컴파일한 후 다시 비주얼 스튜디오 닷넷을 실행하여 계속 진행해야 한다.

그리고 전통적으로 닷넷 개발에서는 RUP 같은 개발 방법론이 사용되지 않아, 만약 UML을 그렇게 많이 사용하지 않는 개발자라거나 다른 개발 방법론을 준수하는(MSF 등의) 프로젝트라면 사용할 수 있는 다이어그램은 클래스 다이어그램뿐이고, 너무 많은 도구를 제공함으로서 개발에 혼란이 오며, 비주얼 스튜디오 닷넷 자체가 너무 느려져서 개발자의 '성질'에 나쁜 영향을 끼칠 수 있다는 것이다.

비주얼 스튜디오 닷넷 2005에 포함된 모델링 도구
MS도 닷넷 환경이 객체지향 환경이고, 객체를 모델링 할 수 있는 통합된 개발 도구가 필요하다는 것을 모를 리가 없다. 그래서 MS는 비주얼 스튜디오 닷넷의 차기 버전인 비주얼 스튜디오 닷넷 2005에 그런 모델링 도구를 추가했다(전체적으로는 투게더와 비슷한 모습이고, 필자가 현재 기사를 작성하고 있는 시점에서는 클래스 다이어그램 기능 이외의 기능은 들어있지 않다).

비주얼 스튜디오 닷넷 2005의 클래스 다이어그램 기능을 알아보자. 비주얼 스튜디오 닷넷 2005는 특별히 이전 버전과 비교해서 달라진 기능이 없다. 웹 프로젝트를 다른 프로젝트와 구분해서 생성하는 정도가 외관상으로 볼 때 달라진 기능이라 할 것이다. 비주얼 스튜디오 닷넷에서 클래스 다이어그램을 그리고 실시간으로 변경될 수 있는 기능을 사용하려 한다면 이전 버전에서 새 항목 추가 메뉴를 선택하는 것과 같이 한다. 새 항목 추가 다이얼로그 박스를 유심히 살펴보면 클래스 다이어그램이라는 항목 아이콘이 보이고 그 항목을 사용하여 클래스 다이어그램을 작성할 수 있다.

사용자 삽입 이미지
<화면 8> 비주얼 스튜디오 닷넷 2005의 새 항목 추가 다이얼로그 박스


 

사용자 삽입 이미지
<화면 9> 비주얼 스튜디오 닷넷 2005를 사용해서 Iterator 패턴을 디자인 한 모습


장점


[1] 아무래도 비주얼 스튜디오 닷넷에 애드인된 것이 아닌 빌트인된 모델링 도구이다 보니 애드인된 도구보다는 강한 결합성을 가진다. 빌트인되었을 때의 가장 큰 기대점은 아무래도 성능적인 측면인데 아직 베타 버전이기에 평가 내리기가 이른 듯 하다. 하지만 꽤 만족할만한 성능을 보여주고 있으며, C# 또는 비주얼 베이직 닷넷에 종속적인 멤버들만을 포함하므로 닷넷 개발에 어울리는 도구가 될 듯 하다.

[2] 비주얼 스튜디오 닷넷에 포함된 도구이다 보니 닷넷 개발에 가장 어울리는 코드를 생성하고 다른 도구들과 통합하여 사용할 수 있다. 닷넷에 추가된 수많은 새로운 개념들과 도구들을 사용할 수 있다.

[3] 비주얼 스튜디오 닷넷에는 지면 관계상 다 소개할 수는 없지만 모델링에 관계된 많은 새로운 도구들이 추가되었다. XML 디자인이나 데이터베이스 디자인, 배포 디자인까지 비주얼 스튜디오 닷넷에서 할 수 있다. 이런 기능들은 평소 비주얼 스튜디오를 사용하던 개발자들에게 아주 친숙한 환경을 제공해 줄 수 있다.


단점이라면, 그 외에 아무것도 없다는 것이다. 또한, 현재 베타 버전에서는 다른 라이브러리에 포함된 개체들을 클래스 다이어그램에 포함하는 인터페이스가 상당히 불편하다. 이는 개선되어야 할 점이다. 사실 투게더나 로즈같은 훌륭한 도구들을 사용하던 입장에서 비주얼 스튜디오 닷넷 2005의 설계 도구를 테스트 하는 입장에서는 전혀 새로울 것도 없고 감동적일 것도 없다.

또한 MS가 자사의 객체지향 개발 방법론을 연구하고 있다는 소문이 풍문에 들려오는 것을 보면, 정식 제품에는 다른 도구가 추가될 지도 모르고, 로즈나 투게더 같은 도구 정도의 많은 기능은 아니더라도 다른 많은 도구들이 추가될 것으로 보인다.

독이 될 수도 갈라드리엘의 별이 될수도
UML은 좋은 도구다. 하지만 대부분의 개발 팀에는 도움이 되기보다는 방해가 되기 일쑤다. UML에는 너무나 많은 것이 있고, 다 활용하기는 벅차고, 그렇다고 사용하지 않기에는 또 뭔가 빠진 듯한 느낌이 드는 것이 그것이다. 늘 절제하는 마음으로 UML을 사용한다면, UML은 아주 좋은 도구가 된다.

필자는 항상 이런 얘기를 한다. "로즈가 설치되어 있는 책상 위에는 항상 연필과 지우개, 그리고 종이가 있어야 한다" 특히 개발자의 입장에서는 UML이라는 도구는 독이 될 때는 한 모금에 사람을 죽일 수도 있는 치명적이 독이 될 수도, 또는 길을 안내해주는 갈라드리엘의 별이 될 수도 있다.@

* 이 기사는 ZDNet Korea의 제휴매체인마이크로소프트웨어에 게재된 내용입니다.

 

김상훈 (동명정보대학 정보기술 연구원)

2005/03/31

 

사용자 삽입 이미지

원문 :http://www.zdnet.co.kr/techupdate/lecture/etc/0,39024989,39134439,00.htm

  Comments,     Trackbacks
[UML 제대로 알기] ③ 개발 프로세스에 따른 UML 실전 모델링

[UML 제대로 알기] ③ 개발 프로세스에 따른 UML 실전 모델링

개발 프로세스에 따른 UML 실전 모델링

 

연재순서
1회.가능성·확장성 품고 등장한 UML 2.0
2회.초보자를 위해 다각도로 살펴본 UML
3회.바로 알고 제대로 쓰는 UML 실전 모델링
4회.닷넷 환경에서 UML 툴 활용 가이드
5회.표준을 넘나드는 UML의 적절한 사용

 

UML과 개발 프로세스라는 것이 만나게 되면 각 프로세스 별로 UML을 활용하여 모델링을 하는 방법이 약간씩 달라지기 때문에 사용상 주의가 필요하게 된다. 이와 더불어 웹 애플리케이션 개발을 위한 UML 모델링은 어떻게 하면 좋은지에 대해서도 생각해볼 필요가 있다.

이번 글에서는 지금까지 UML을 이용하여 소프트웨어 개발을 수행하면서 느꼈던 개념상의 모호함과 모델링 시 주의할 점에 대해 살펴보고자 한다.

약 7년 전 필자는 UML에 관하여 세미나를 하려고 어느 업체를 방문한 적이 있었다. 세미나를 막 시작하려고 하는 순간 어느 분께서 'UML이 이번에 새로 나온 XML의 한 종류인가 보죠?'라고 질문을 했다. 과연 이 난관을 어떻게 헤쳐 나가야 할지 막막한 순간이 UML에 관한 이야기를 하려고 하면 지금도 떠오른다.

UML이 우리나라에 처음 소개되던 시기에는 많은 분들이 객체지향이나 모델링 언어에 대한 개념이 일반적이지 않았다. 하지만 약 7년이 지난 지금은 소프트웨어 개발을 하는 대부분의 종사자들은 UML이라는 것이 무엇이고 어디에 쓰는 것인지 알고 있다. 또한 소프트웨어를 개발하기 위해서는 적어도 UML 다이어그램 몇 개 정도는 그려줘야 할 것 같은 생각을 갖고 있다. 많은 인식의 변화가 있었지만 지금 이 순간에도 여전히 UML이라는 것을 제대로 활용하여 소프트웨어를 개발하고 있는지 제대로 알고 있는지는 의문을 갖지 않을 수 없다.

UML과 모델 그리고 산출물
UML과 모델, 산출물은 비슷한 것 같지만 실은 아주 다른 개념이다. 우리가 소프트웨어라는 것을 개발하기 위해 '무엇을 만들 것인가?'라는 질문에 답하기 위해서는 대상이 되는 문제영역을 정확히 알 필요가 있다. 소프트웨어 개발팀 혹은 개발자는 문제영역에 대하여 정확하게 이해하기 위한 가장 좋은 방법은 모델을 통하는 것이다. 모델은 문제영역의 현실을 단순화시킴으로써 우리가 만들고자 하는 시스템을 더 잘 이해할 수 있게 한다.

『The UML User Guide』에 의하면 모델링을 통해 우리는 다음과 같은 4가지 목적을 얻을 수 있다고 한다.


◆ 모델은 시스템을 현재 또는 원하는 모습으로 가시화하도록 도와준다.

◆ 모델은 시스템의 구조와 행동을 명세화할 수 있게 한다.

◆ 모델은 시스템을 구축하는 틀을 제공한다.

◆ 모델은 우리가 결정한 것을 문서화 한다.


즉, 복합한 시스템에 대해 모델을 만드는 이유는 그러한 시스템을 전체적으로 이해할 수 없기 때문이다. UML은 앞에서 언급한 4가지 목적에 충실히 부합하기 때문에 소프트웨어를 개발함에 있어 모델링 언어로 UML을 이용한다.

UML 다이어그램이 산출물인가?
필자는 어느 프로젝트의 개발 프로세스 멘터링를 하기 위해 한 업체를 방문한 적이 있었다. 그 곳에서 도착하여 간단한 미팅을 한 후 가장 먼저 요구했던 정보는 고객과 합의한 활동과 산출물의 목록이었다. 그 문서에는 역시 예상대로 요구사항 산출물에 '유스케이스 다이어그램'이라는 것이 있었고 분석 산출물에 '클래스 다이어그램'이라는 것이 들어 있었다. 이외 여러 부분에 'XXX 다이어그램'이 눈에 띄었다.

UML 다이어그램이 산출물이 될 수 있는가? 결론적으로 말하자면 UML 다이어그램은 산출물이 아니다. 나중에 자세히 설명하겠지만 산출물의 한 종류가 모델이고 모델을 표현하기 위한 수단 중에 하나가 UML 다이어그램이다.

예를 들어 UML의 클래스 다이어그램을 생각해 보자. 다양한 종류의 산출물은 그 산출물이 표현하고자 하는 정보를 보여주기 위해 UML 다이어그램을 이용한다. 유스케이스 실현(Realization)의 VOPC(View of Participating Classes)에서도 사용하고 비즈니스 조직을 표현하고자 할 때도 클래스 다이어그램을 사용할 수 있다. 또한 아키텍처 메커니즘을 표현하고자 할 때도 클래스 다이어그램을 이용한다. 유스케이스 다이어그램의 경우도 비즈니스 유스케이스 모델을 표현할 때도 쓰이고 시스템 유스케이스 모델을 표현할 때도 쓰인다. 다양한 산출물에 UML 다이어그램을 쓴다.

요구사항에서 혹은 분석/설계에서 산출물로 클래스 다이어그램이라고 명시해 놓으면 과연 어떤 클래스 다이어그램인지 알 수 있을까? 또한 시퀀스 다이어그램이 산출물 목록에 버젓이 들어있다면 그 다이어그램은 과연 어떤 정보를 표현하려고 하는 다이어그램인지 알 수 없다. 다이어그램은 산출물의 의도를 표현하기 위해 사용하는 하나의 표현도구이다. 산출물은 절대로 아니다.

우리의 목적은 산출물이다
앞에서 UML은 산출물이 아니며 모델은 산출물의 한 종류라는 것의 이야기했다. 그렇다면 산출물을 무엇을 의미하는가? 일반적으로 산출물이라는 것은 종이 형태의 문서로 알고 있다. 하지만 산출물은 프로세스를 통해 프로젝트 기간 동안 만들어지는 의미를 갖는 모든 것을 일컫는다. 그 중 하나가 모델이며 실행 가능한 바이너리 형태의 컴포넌트, 문서, 소스코드, 스크립트 등이 해당한다. 산출물(Artifact)의 정의를 보면 다음과 같다.


산출물은 어떤 정보의 일부로서 1) 프로세스를 통해 만들어지고 변경되고, 사용되며 2) 책임영역을 정의하며 3) 버전컨트롤의 대상이 된다. 산출물은 모델, 모델요소, 또는 문서 등이 될 수 있으며 문서는 다른 문서의 일부분으로 포함 될 수 있다(A piece of information that: 1) is produced, modified, or used by a process, 2) defines an area of responsibility, and 3) is subject to version control. An artifact can be a model, a model element, or a document. A document can enclose other documents).

모델(model) :유스케이스 모델, 분석 모델, 설계 모델과 같이 다른 산출물을 포함하는 형태를 갖는 산출물

모델 요소(model element) :다른 산출물 내부에 포함되어 있는 산출물로 예를 들면 유스케이스 모델 안의 유스케이스, 액터와 설계 모델 내부의 설계 클래스, 설계 서브시스템 등과 같은 산출물

문서(document) :문서로 존재하는 산출물로 비즈니스 케이스, 소프트웨어 아키텍처 문서 등과 같은 산출물

◆ 소스코드나 실행 가능한 것(컴포넌트) 등


<그림 1>은 산출물과 모델 그리고 UML과의 관계를 클래스 다이어그램으로 표현한 것이다.

사용자 삽입 이미지
<그림 1> 산출물의 종류와 UML간의 관계


모델링은 개발기간을 늘이는 원흉?
필자는 지금까지 여러 프로젝트에서 직접 개발에 참여하기도 했고 컨설팅 또는 멘터링 형태로 참여하면서 사람들로부터 많은 질문을 받아왔지만 그 중에 가장 많이 하는 질문은 “우리 프로젝트에 UML이 꼭 필요하겠습니까? 프로젝트 규모가 좀 작으면 UML을 적용하지 않아도 괜찮지 않을까요?”라는 것과 “UML을 적용하면 개발이 좀 늦어지지 않겠습니까?”라는 두 가지 질문이 대표적이다.

우선 첫 번째 질문의 의미를 생각해 보자. 프로젝트 규모가 작으면 UML을 굳이 적용하지 않고 두어 명 개발자들이 그냥 뚝딱뚝딱 시스템을 만들면 되지 않을까 하는 것이다. 필자도 비슷한 생각으로 모델링을 하지 않고 프로젝트를 진행해 본적이 있었다. 개발자 3명이 기능 수 약 100개 정도의 시스템을 개발한 적이 있었는데, 작고 간단한 시스템이었으므로 순진한 생각에 그냥 테이블 정도만 정리해 놓고 코딩부터 시작하면 쉽고 금방 될 줄 알았다.

하지만 상황은 그렇게 호락호락하지 않았다. 용어와 기능부터 명확히 정의되지 않았고, 시작부터 개발자간의 서로 다른 이해수준은 프로젝트를 암울하게 만들었다. 어렴풋한 이해를 바탕으로 만들어지는 코드는 만들고 나서 뜯어고치는 코드가 더 많아 졌고 비즈니스 컴포넌트간의 인터페이스로 수시로 어긋났다. 결국 간단하게나마 모델을 만들면서 진행하기로 했고 모델링 시간 약간 줄이려고 하다가 우왕좌왕한 만큼 시간을 허비한 결과로 나타났다. 꼭 UML이 아니더라도 어떤 형태로든지 모델링은 해놓았어야 했고 그것이 업계 표준인 UML로 했더라면 더 좋지 않았을까 하는 후회가 든다.

혼자 만들더라도 역시 UML로 모델링을 하는 것이 개발하는 중에도 좋고 개발하고 난 뒤를 생각해봐도 반드시 필요하다는 생각이다. 개발을 마치고 난 뒤에 누군가 그 시스템을 유지보수 해야 한다면 전 개발자가 UML을 이용하여 만들어 놓은 모델을 보고 아마 감사하게 생각 할 것이다. 또 개발하고 있는 순간에도 몇 명밖에 없지만 그 사람들끼리 의견 교환이나 문제 영역에 대한 공통적인 이해를 돕기 위해서도 필요하다. 혼자 개발하더라도 생각이 정리가 잘 안되면 UML로 아이디어를 정리하는 판에 다른 사람과 생각을 맞추는데 필요가 없겠는가?

“UML을 적용하면 개발 기간이 늦어진다”. 어떻게 보면 약간 황당할 정도의 이야기임에 틀림없다. UML 때문에 개발기간이 늘어나는 것이 아니라 익숙지 않은 UML을 모델링 언어로 선택함으로써 배우는 기간이 더 늘어나는 것이 정확한 의미가 아닐까 싶다. 심지어 어떤 프로젝트 매니저는 개발은 그냥 개발대로 나가고 산출물은 산출물대로 만들어 나가서 나중에 소스코드가 나오게 되면 역공학(Reverse Engineering)을 통해 UML 모델을 만들어내자는 제안을 하기도 했다. 모델과 코드간의 동기화를 위해 역공학을 이용하지만 과연 이것이 시간을 줄이는 방법일까?

개발 프로세스와 과도한 모델링
무엇을 모델링 할 것인가? 어느 정도의 정밀도 수준으로 모델링 할 것인가? 모델링의 범위는 어떻게 설정해야 하는가? 이러한 질문에 답하기 위해 이것저것 고민해보기도 하고 업계에 종사하는 분들과 메신저로 혹은 술자리에서 때로는 프로젝트 회의 시간에 토의를 많이 해 보았다. 그 중 필자가 알고 지내는 대부분의 개발자들의 한결같은 주장은 '과도한 모델링'의 압박에 시달린다는 것이었다. 이야기를 해 본 결과 실제로 개발자들이 느끼는 '과도한 모델링'의 기준은 주관적이었지만 몇몇 주장은 일견 수긍이 가기도 했다.

그 중에 하나가 프로세스의 적용 문제였는데 지구상에 존재하는 모든 프로젝트는 서로 다른 시스템을 만들고 있기 때문에 모든 프로젝트 천편일률적으로 적용되는 모델링 범위나 정밀도 수준은 없다. 하지만 그것을 프로젝트의 규모나 도메인의 종류 등의 일반화된 기준으로 묶고 그 기준에 해당하는 개발 프로세스를 제공해야 한다. 예를 들어 현재 우리나라에서는 RUP(Rational Unified Process)나 마르미와 같은 프로세스 프레임워크를 많이 사용한다. 또 SI 업체에서는 자체적으로 발전시켜온 방법론이나 앞에서 언급한 RUP 또는 마르미를 기반으로 하여 자체 프로세스를 개발하여 사용한다.

문제는 각 프로젝트마다 프로세스를 조정(Tailoring)해서 적용해야 하는데 현실은 그렇지 않다는 것이다. 심지어 이런 이야기를 들은 적도 있다. "CBD를 적용하기엔 우리 프로젝트 규모에 좀 안 어울리지 않나요? 아는 사람한테 물어봤더니 규모가 작으면 CBD가 안 어울린다고 하더라고요. 대신 굳이 CBD를 하려면 UML 모델링 툴을 반드시 도입해서 진행해야 한다고 하던데…" 누가 이 분에게 그런 이야기를 했는지 모르지만 이 정도 되면 거의 사기에 가깝다. 그 분이 생각한 CBD라는 것이 무엇이었는지 어림짐작되는 대목인데 마치 신발에 발을 맞추는 꼴이 되어 버렸다.

발을 보호하는 것이 1차적인 목표이고 멋도 부리는 것이 신발을 신는 2차 목표라고 보면, 우선 성공적인 프로젝트를 수행하기 위해 프로세스를 도입하고 이왕 개발할 것 좀 체계적으로 가이드를 받아보자는 목적도 있을 것이다. 객체지향이나 CBD와 같은 단어의 의미는 일단 논외로 하고 앞에서 언급한 프로세스 조정에 관하여 이야기 해보자.

프로세스 조정
앞에서 언급했듯이 RUP나 마르미는 일반적이고 범용적인 개발 프로세스이다. 세 달간 3명이 개발하는 프로젝트와 2년간 50명이 개발하는 프로젝트 모두 개발 프로세스가 같을 수 있겠는가? MS 워드와 같은 워드프로세서를 개발하는 것과 은행을 위한 전산 시스템을 개발하는 개발 프로세스가 같을 수 있겠는가?

서로 다른 특성을 갖는 프로젝트를 위해 프로세스 조정(Tailoring)이란 작업을 하게 되는데 여기서 유의해야 할 것은 조정할 수 있는 영역을 제한해야 한다는 것이다. 프로젝트 현장에서 편의대로 프로세스를 고치거나 누락시켜서는 안되고 프로세스 조정의 결과는 승인되어야 한다. 더 나아가 프로젝트 세부 유형에 따른 개발 프로세스를 제공한다면 더할 나위 없이 좋을 것이다. 프로세스의 대표적인 구성 요소로는 작업 영역, 작업 흐름, 활동, 산출물, 역할 등이 있다. 필자는 이 모든 것이 프로세스 조정 대상이 될 수 있다고 생각한다.

RUP의 경우 '프로세스 엔지니어'가 프로세스 조정 작업을 진행하고 마르미 경우 ‘도구 및 방법론 관리자’가 그 역할을 수행한다(XP의 경우는 코치라고 한다. 편의상 이 글에서는 모두를 프로세스 엔지니어라고 칭하겠다). 이런 역할의 특성상 다른 사람과의 의견 교환이나 대립이 있기 때문에 프로세스 엔지니어는 소프트웨어 개발에 관한 폭넓은 지식을 갖고 있어야 하며 의사소통 능력이 있어야 한다. 프로젝트 관리자나 프로젝트 리더 또는 시스템 분석가나 아키텍트를 설득해야 할 일이 있을 수도 있다.

프로젝트 관리자나 프로젝트 리더는 프로젝트 관리 관점으로 개발 프로세스를 바라볼 것이고 시스템 분석가나 아키텍트는 소프트웨어 시스템을 개발하는데 중요한 결정을 내리기 위한 관점으로 프로세스를 바라보며 자신의 의견을 제시 할 것이다. 이들의 의견을 통합하고 조정하며 고객의 요구를 반영하여 해당 프로젝트의 상황에 맞는 프로세스로 조정하게 된다.

사용자 삽입 이미지
<그림 2> 프로세스 엔지니어의 활동과 산출물


<그림 2>에서 프로세스 엔지니어는 현 개발 조직 평가, 개발 케이스(Development Case) 작성, 프로젝트 전용 템플릿 작성의 세 가지 활동을 하게 된다. 이에 따른 개발 조직 평가, 개발 케이스 프로젝트 전용 템플릿의 세 가지 산출물을 작성하는데 여기서 가장 핵심적인 산출물은 개발 케이스이다. 특정 프로젝트를 위한 프로세스를 조정하고 개발 케이스를 작성하기 위해서는 프로젝트의 상황을 이해 할 필요가 있는데 이를 위하여 현 개발 조직에 대한 평가가 이루어져야 한다. 또한 개발 조직 이외에도 고객에 대한 평가도 동시에 이루어져야 한다.

예를 들어, 기업을 위한 애플리케이션을 개발한다고 가정한다면 개발 완료 후에 고객은 유지보수를 위한 산출물을 요구할 것이다. 프로세스 엔지니어는 개발 조직 및 고객을 대상으로(좀 더 의미를 확장하자면 이해관계자를 의미 할 수 있다) 현 개발 조직에 대한 평가를 할 때 프로세스, 툴, 사람들의 능력, 사람들의 태도, 고객들, 사용 기술, 문제점, 개선 분야의 관점에서 개발 조직의 현재 상태를 평가한다.

프로세스 조정을 위한 요구사항을 파악하고 이를 근거로 프로세스 조정을 실시한다. 프로세스 조정의 결과는 개발 케이스이다. 프로세스 조정에 관한 자세한 사항을 알고 싶으면 RUP나 마르미 또는 Barry Boehm과 Richard Turner가 쓴 『Rebalancing Your Organization's Agility and Discipline』를 참조하면 도움이 될 것이다.

케이스 툴을 쓰면 생산성이 높아지는가?
Steve McConnell은 그의 저서인 『Professional Software Development(2003)』에서 코끼리에 관한 재미있는 이야기를 소개했다. 이야기를 요약하면 이렇다.

고대 이집트 어느 왕의 피라미드를 만드는 공사가 한 참 진행 중이었다. 엄청나게 큰 암석을 사람들이 일일이 날라야 했으므로 공사의 진척은 매우 더디었다. 그래서 공사 프로젝트 관리자는 고민 끝에 어디선가 코끼리라는 엄청난 동물이 있는데 이 동물은 사람이 운반하는 것 보다는 몇 배 혹은 몇십 배 높은 생산성은 낸다는 이야기가 얼핏 기억이 기억났다. 이 동물만 들여오면 지금까지 지연되었던 일정을 단번에 만회할 수 있을 것 같은 생각이 들었다.

공사 프로젝트 관리자는 그 동물을 도입하기로 결심하고 일을 추진했다. 코끼리라는 동물을 들여놓고 보니 과연 듣던 대로 몸집도 엄청나고 그에 걸맞게 힘도 대단했다. 공사 프로젝트 담당자는 입가에 미소를 머금으며 공사현장에 코끼리를 투입하라는 지시를 내렸다. 그러나 그 동물을 투입하는 순간 순조롭게 진행될 것 같은 공사가 점점 이상하게 진행되고 일정도 생각했던 것만큼 줄여지지 않았다. 줄여지기는커녕 오히려 사람이 진행했던 것보다 더 늦어지는 조짐이 보였다.

공사 프로젝트 관리자는 상황파악에 나섰는데 공사 현장에 가서 자세히 관찰을 해보니 문제를 바로 파악할 수 있었다. 바로 코끼리를 다룰 수 있는 사람이 없었던 것이었다. 그의 공사팀은 그런 동물을 부리면서 일을 한 적이 단 한번도 없었기 때문에 기존의 공사프로세스와 엄청난 혼선을 빗었다. 또 코끼리에 대해 아는 것이 전혀 없었기 때문에 코끼리를 돌보지 못해 걸핏하면 앓아눕기 일 수였고 몇몇 코끼리는 도망가 버려 엄청난 비용을 들여 도입한 코끼리가 무용지물이 되어 버렸다. 공사 진행은 그 만큼 지연되었고 코끼리를 포기할 수밖에 없었다"


필자가 보기엔 그 코끼리가 바로 케이스 툴이 아닌가 싶다. 프로젝트 생산성을 높이기 위해 케이스 툴을 도입하는 것은 바람직하지만 그 생산성을 높이기 위해서는 일정 기간의 훈련이 필요하다. 요즘 나오는 케이스 툴은 기능도 막강하고 더불어 복잡하다. 또 종류도 많아 수많은 케이스 툴과 연동도 필요하다. 일례로 IBM 래쇼날의 스위트 제품은 내장하고 있는 서브 제품만 해도 10여 가지가 넘는다. 다른 케이스 도구도 사정은 다를 바 없다.

프로젝트 현장의 요구는 이러한 제품을 좀 편하게 사용하고 싶어 한다. 소프트웨어 개발 라이프 사이클 전반에 걸쳐 케이스 툴을 적용하려고 서로 다른 회사 목적이 다른 툴을 서로 연계시켜야 한다. 이 일은 대단히 복잡하고 가변적이어서 앞의 요구를 충족시키려면 프로세스적으로나 케이스 툴에 대한 상당한 지식과 수준의 기술이 요구된다.

요구사항관리 도구와 분석/설계를 위한 모델링 도구와의 연계 부분, 모델링 도구와 개발 및 테스팅 도구와의 연계 부분이 대표적인 연계 부분이다. 또한 각 케이스 툴에서 쏟아져 나오는 다양한 모델과 문서들을 통합적으로 관리할 수 있는 형상 및 변경 관리와 각 작업영역(요구사항, 분석/설계, 구현, 테스트 등)을 기반으로 하여 반복 개념으로 프로젝트를 관리해야 하므로 실제 케이스 툴이 소프트웨어 개발을 도와주려면 아주 많은 것들을 고민해야 한다.

특히 프로젝트 현장에서 따르고 있는 프로세스를 정확히 지원해줘야 하므로 케이스 툴 자체의 유연성도 갖춰야 한다. 케이스 툴은 단어의 의미에서와 같이 소프트웨어 개발을 정말로 도와주는 케이스 툴이 되어야 하지 않을까 싶다.

머릿속 아이디어를 모델로 구체화하기
필자는 항상 프로젝트를 진행하다 보면 항상 딜레마에 빠지는 문제가 있다. 프로젝트에 참여하는 사람들이 UML을 잘 모르는 경우이다. UML을 모델링 언어로 채택한 프로젝트는 그 프로젝트에 참여하는 모든 사람들이 UML을 알고 있어야 한다는 전제조건이 따른다.

하지만 현실은 어떠한가? 프로젝트를 수주해야만 먹고 사는 개발 업체의 경우 UML을 알던 모르던 일단 수주를 해야만 하는 상황이다. 그 회사의 개발팀 구성원이 UML을 잘 알고 있다면 문제가 없겠지만 잘 모르는 경우 심하면 그 구성원 중 단 한 명도 제대로 알지 못하는 경우 문제가 아닐 수 없다.

이 때 가장 많이 활용하는 방법은 UML을 알고 있는 사람이나 업체를 고용하여 먼저 샘플을 만들게 한 후 그것을 템플릿으로 하여 모델링을 진행하는 것이다. 물론 이런 프로젝트가 많아야 필자 같은 사람들이 먹고 살긴 하겠지만 프로젝트 입장에서는 참 못마땅한 일이 아닐 수 없다.

예를 들어 UML을 알고 있는 사람이 시스템의 한 부분에 대하여 클래스 다이어그램을 그렸다고 하자. 그 클래스 다이어그램이 샘플로 나오면 다른 모든 사람들은 그 샘플을 기반으로 모델링을 시작하게 된다. 맞는지 틀리는지 자신의 판단 기준이 없는 채로 샘플을 '다른 이름으로 저장하기'로 해서 따로 하나는 만들어 놓은 다음 다이어그램을 그리고 저장을 한다. 예전에 학교에서 다른 친구 소스코드 구해다가 변수명 좀 바꾸고 약간 짜깁기해서 리포트를 제출하는 것과 비슷한 상황이 된다.

다이어그램이야 만들어 졌지만 모델링을 하는 사람이 그 모델이 적합한지 아닌지 판단할 수 없으므로 그려진 다이어그램을 들고 샘플을 만든 사람에게 달려와 이것저것 물어본다. 물론 어쩔 수 없는 상황이고 그런 과정을 거치면서 사람들의 모델링 실력이 향상되겠지만 모르면서 그림을 그리는 사람도 답답하고 프로젝트 진행에도 문제가 많다.
잘 모르는 사람이 프로젝트를 하는, 어떻게 보면 시작부터 이상하긴 하지만 어쩔 수 없다고 보고 조금이나 도움이 되도록 머릿속의 아이디어를 모델로 구체화 하는 과정을 소개하면 조금 낫지 않을까 싶다.

시작은 글쓰기부터
만들고자하는 모델이나 그리고자 하는 다이어그램에 따라 접근 방식이 다르겠지만 결국 시작은 머릿속의 생각을 글로 정리하는 것부터 시작한다. 글로 쓰기 귀찮다면 메모장이나 화이트보드에 본인의 생각을 간단하게나마 자유로운 형식으로 정리하면서 시작하게 된다.

예를 들어, 고과장이 애플리케이션 프레임워크를 모델링 한다고 가정해 보자. 프레임워크를 모델링하는 사람이 UML을 설마 모르진 않겠지만 이 사람이 어떤 과정을 거치면서 머릿속 아이디어에서부터 구체적인 모델을 만들어 가는지 살펴보자. 고과장은 프레임워크의 한 부분을 모델링하기 위해 고심하다가 머릿속에서만 맴도는 아이디어를 글로 써보기로 했다.

클라이언트에서 어떠한 메시지를 보내면 프레임워크에서는 그 메시지를 해석하여 어떤 비즈니스 로직을 수행할 지 결정하여 수행한다. 메시지에 따라 수행하는 비즈니스 로직은 메시지가 변해도 동일한 비즈니스 로직이 수행되어야 하거나 동일한 메시지에도 상황에 따라 비즈니스로 로직이 바뀔 수 있어야 한다.

써 놓고 읽어보니 대충 어떤 방향으로 만들어야 할지 느낌이 좀 오기 시작했다. 왠지 잘 될 것 같은 느낌으로 입가엔 미소를 머금으며 모델링 도구를 실행시켰다.

모델링을 시작하다
우선 고과장은 클라이언트와 클라이언트가 보내는 메시지를 받는 무엇인가가 있어야 하지 않을까 하는 생각이 들었다. 또 어떤 비즈니스 로직을 수행할지 판단하는 객체도 있어야 할 것 같고, 클라이언트가 보낸 메시지에 대응하는 비즈니스 로직을 갖고 있는 정보를 갖고 있는 객체도 있어야 할 것 같다.

고과장은 우선 '클라이언트', '메시지 판단자', '메시지와 비즈니스 로직 맵핑 정보' 등이 객체가 되지 않을까 생각했다. 모델링 툴을 띄워놓고 세 가지 객체를 그리고 나니 이들 간의 관계와 각 객체가 어떤 일을 해야 하는지(Responsibility)가 알쏭달쏭 했다. 그래서 이 세 가지 객체를 놓고 이들 객체가 서로 어떻게 인터랙션(Interaction)하는지 알아보기 위해 시퀀스 다이어그램을 그려보기로 했다.

사용자 삽입 이미지
<그림 3> 개념 정리를 위한 시퀀스 다이어그램


이렇게 그려놓고 보니 객체 간에 어떻게 교류하는지 눈에 들어와 더 구체적으로 생각할 수 있게 되었다. 고과장은 시퀀스 다이어그램을 보면서 차근차근 짚어보기로 했다. 클라이언트가 메시지를 '메시지 판단자'에게 보내면 해당 메시지에 대응하는 비즈니스 로직을 알려주고 메시지 판단자가 비즈니스 로직을 수행하여 클라이언트에게 보내주는 깔끔한 형태로 정리된 것 같았다.

뭔가 빠진 것 같은데?
하지만 객체 간에 어떻게 교류하는지 눈에는 보였지만 왠지 무엇인가 빠진 듯한 느낌이 들었다. 시퀀스 다이어그램을 쳐다보고 있으니 메시지 판단자가 '비즈니스 로직 수행'을 하는 것이 메시지 판단자의 역할에 비해 좀 오버하는 듯한 느낌이 들었다. 또 비즈니스 로직 수행이 잘 되었는지 아닌지 판단하는 부분도 있어야 할 듯 했다. 그래서 '비즈니스 로직 수행자'라는 이름은 좀 이상하지만 이런 객체를 따로 빼 두어 시퀀스 다이어그램을 보완하기로 했다.

사용자 삽입 이미지
<그림 1> 산출물의 종류와 UML간의 관계


비즈니스 로직 수행자를 넣어 시퀀스 다이어그램을 다시 그려보니 이제 뭔가 맞아 돌아가는 느낌이 들었다.

사용자 삽입 이미지
<그림 5>"그림 3"의 클래스 다이어그램


UML의 시퀀스 다이어그램과 클래스 다이어그램을 통해 객체간에 교류와 각 객체의 책임(Responsibility)를 찾아냈다.

설계를 위한 모델로 발전
이제 개념적으로 정리한 모델을 바탕으로 좀 더 구현하기 좋은 형태로 발전시켜 보자. 구현을 위해서는 좀 구체적인 형태로 정의하고 실제적인 비즈니스 로직 처리와 에러 처리를 표현하기 위한 무엇인가가 필요했다. 고과장은 고민 끝에 웹 서버로부터 아이디어를 얻었다. 웹 서버는 웹 브라우저와 커뮤니케이션을 위해 Request와 Response를 사용한다. 브라우저의 요청은 Request에 담아 웹 서버로 보내고 웹 서버의 응답은 Response에 담아 브라우저로 보내게 된다. 이런 비슷한 개념을 프레임워크에 적용해보면 어떨까 생각했다.

즉, 클라이언트의 요청은 BusinessRequest에 담아 보내고 서버의 응답은 BusinessResponse에 담아 보내되, 비즈니스 로직 수행시 Exception이 발생하면 BusinessResponse에 담아 메시지 판단자가 처리하게 하면 어떨까 하는 생각을 했다. 고과장은 이렇게까지 생각이 정리되자 시퀀스 다이어그램을 통해 아이디어를 구체화 해보기로 했다. 시퀀스 다이어그램은 <그림 6>과 같다.

사용자 삽입 이미지
<그림 6> 보다 더 구체화된 시퀀스 다이어그램


클라이언트 쪽의 예상 소스코드도 넣어 보고 메시지를 비즈니스ID라는 용어로 바꿔봤다. 또한 비즈니스ID의 해당 비즈니스 로직을 실행시키기 위해서는 리플렉션(Reflection)이라는 기술도 써야 할 것 같고 Exception 처리를 위한 부분도 따로 둬야겠다는 생각이 들어 BusinessResponse에 BusinessExcuteHelper가 Exception을 담아주는 형태로 모델링을 했다.

<그림 6>의 시퀀스 다이어그램을 보면 중간 중간 노트가 많이 달려있는 것을 볼 수 있다. 시퀀스 다이어그램의 중간 중간을 보면 샘플 코드나 리플랙션, Exception과 같은 구현을 염두 한 노트를 볼 수 있다. UML로 모델링을 할 때 노트의 역할은 필수 불가결한데 해당 다이어그램의 이해를 돕기 위해서나 모델러의 의도를 명확히 하기 위해서 또는 아직 불분명한 부분이 있을 경우 판단에 도움이 될 만한 주석을 달기 위한 수단으로 이용하면 좋다.

구체화된 모델
자 이제 구현을 위한 시퀀스 다이어그램도 그렸고 구체적으로 어떻게 접근하면 될지 방안이 섰기 때문에 최종 클래스 다이어그램을 그려보기로 했다. 클래스 다이어그램을 그리면서 고과장은 클라이언트가 보내는 메시지와 해당 비즈니스 로직 정보를 어떤 형태로 할 까 고민하다 XML 형태로 하는 것이 가장 좋을 것 같다는 판단이 들었다.

애플리케이션이 실행되면서 XML에 있는 정보를 읽어 캐싱하고 있는 형태로 만들고 그 역할은 BusinessMapper라는 객체에 해당 정보를 Map에 담아 두기로 했다. BusinessMapper는 단 하나만 존재해야 하므로 싱글턴(Singleton) 패턴을 적용하기로 했다(실제 구현을 하기 위해서는 보다 더 구체적으로 모델링을 해야겠지만). <그림 7>는 고과장의 아이디어를 반영한 최종 클래스 다이어그램이다.

사용자 삽입 이미지
<그림 7> 고과장 생각을 정리한 최종 클래스 다이어그램


이 클래스 다이어그램에서 XXX_ServerPage나 XXX_Action, XXX_ActionForm, XXX_Mgr과 같이 XXX라는 접두어가 붙은 클래스는 비즈니스 로직 개발자들이 직접 만들어야 하는 부분이다. 개발자들은 XXX라는 접두어가 붙은 클래스만 개발하면 되고 고과장이 만든 프레임워크에 끼워 넣어 어떤 메시지가 어떤 비즈니스 로직과 맵핑되는지 XML 파일만 편집하면 되는 구조로 모델링이 되었고 고과장의 생각대로 메시지와 비즈니스 로직과의 느슨한 관계를 유지할 수 있는 모델이 만들어 졌다.

일단 이런 구조의 프레임워크가 좋은 것인지 아닌지는 일단 논외로 하고 머릿속의 아이디어를 모델로 구체화하는 과정을 다시 한번 정리하자면 우선 1) 머릿속의 아이디어를 글로 정리하고 2) 정리한 글을 바탕으로 UML로 바꿔 본다. 이때 동적인 측면과 정적인 측면을 고려하고 전에 정리한 글에서 UML로 변환하는 과정에서 빠진 것은 없는지 미처 생각하지 못한 것들이 있는지 확인한다. 그냥 글로 확인하는 것보다는 UML의 시퀀스 다이어그램이나 엑티비티 다이어그램 등을 이용하여 확인하면 보다 더 정확하게 모델링할 수 있다. 3) 이렇게까지 진행이 되었으면 실제 구현을 위한 모델로 발전시켜 본다. 특정 플랫폼이나 개발언어, 미들웨어 등을 고려하면서 그려나간다.

결국 1)~3)까지가 실제 모델링을 통해 아이디어를 구체화 시켜나가는 모든 것이다. 1)번을 잘 하기 위해 각종 기법(예를 들어, 유스케이스나 유저스토리 등)이 동원되고 2)번을 잘 하기 위해 CRC 카드와 같은 기법이 사용된다. 3)번 역시 마찬가지로 각종 설계 패턴이나 J2EE 패턴과 같은 것을 참조한다. 개발 프로세스에 따라 어떤 모델을 만드는가, 어떤 산출물을 만드는가에 따라 그려야 할 다이어그램이나 모델의 정밀도가 다르겠지만 결국 1)~3)까지의 행위를 반복함으로써 우리가 얻고자 하는 모델을 얻어낼 수 있다.

쉽고도 어려운 유스케이스 모델링
1960년대 후반쯤 이바 야콥슨에 의해 만들어진 유스케이스는 1990년대에 들어서면서 아주 폭넓게 사용하는 요구사항 파악 및 분석 기법으로 자리 잡았다. 우리나라의 경우 아마도 대부분의 프로젝트에서는 유스케이스라는 이름의 산출물을 만들고 있고 만들었을 것이다. 필자도 여러 프로젝트를 하면서 유스케이스를 써서 요구사항 분석을 했었다.

초기 접근하기에 개념적으로 어려운 부분이 별로 없기 때문에 누구나 의욕적으로 참여하여 유스케이스를 작성해 해 나간다. 하지만 이 유스케이스라는 것이 단순해 보이지만 결코 만만치 않은 특성을 갖고 있다. 처음에는 쉬운 듯하지만 진행해 나갈수록 어려워지는 경향이 있다. 또한 프로젝트의 진행 상태나 규모에 따라 유스케이스 작성 방식이 달라진다. 이러한 특성 때문에 바쁜 프로젝트에서 뭔가 별 고민을 하지 않고 쉬운 작성 형식이나 방법을 목말라하는 개발자들에게는 혼돈의 연속일 수밖에 없다.

필자 개인적으로 유스케이스에 관해 잘 설명한 도서는 Alistair Cockburn의 『Writing Effective Use Cases (2001)』이다. 영어에 어려움을 겪는 분들은 번역본도 나와 있으니 구해서 한번 꼭 읽어보길 바란다. 이 책의 내용 중에 유스케이스 작성시 주의할 점이 있는데 그 중 현장에서 실제로 많이 나타나는 몇 가지를 소개하고자 한다. 일부 주의사항은 책에서 발췌하고 필자가 느낀 점을 중심으로 설명해본다.

유스케이스는 산문체 수필이다
유스케이스 다이어그램을 갖고 지지고 볶던 독자들에게는 약간 의아한 말일 수 있다. 사실 유스케이스는 텍스트 기반의 서술이다. UML의 유스케이스 정의를 보아도 '유스케이스는 시스템 전체나 유스케이스 일부 행동을 명세화 하고 순차적으로 발생하는 활동들을 서술하는 것이다. 시스템은 이러한 활동을 수행하여 액터에게 원하는 결과를 준다'라고 되어 있다. 그래픽으로는 타원으로 표현하고 중심에는 몇 단어로 이루어진 이름이 있다.

프로젝트를 진행하면서 다이어그램에 얽매여 오로지 다이어그램만으로 유스케이스를 작성하려고 하면 관련 팀은 점점 어려움으로 빠져 들게 된다. 유스케이스 다이어그램 그 자체가 담고 있는 정보는 매우 한정적이다. 유스케이스명과 어떤 액터와 관계가 있는지를 나타내는 선 몇 개, 복잡하게 뒤 얽힌 '포함(include)와 확장(extends)을 표현하는 점선들이 뒤덮여 있을 뿐이다. 사람들이 그 다이어그램을 보고 요구사항이 뭔지 정확하게 알 수 있을까?

단어 몇 개로 이루어진 유스케이스 명을 보고 무엇을 하는 유스케이스인지 추측을 할 뿐이다. 다이어그램의 정보가 충분치 않으므로 답답한 마음에 다이어그램에 갖가지 정보를 넣으려고 하고 유스케이스의 목표 수준은 점점 내려가고 복잡해지는 현상이 나타난다. 결국 아무도 이해할 수 없는 다이어그램이 만들어지면서 오히려 팀간의 명확한 이해의 공유는커녕 혼란만 가중시키는 결과를 낸다. 유스케이스 다이어그램만을 놓고 이틀 동안 논쟁만 하는 개발팀을 실제로 보았다. 다시 한번 강조하지만 유스케이스는 텍스트 형식의 서술이다. 액터와 유스케이스 간에 어떤 일이 일어나는지 글로 적음으로써 이해를 명확히 할 수 있다.

유스케이스와 사용자 매뉴얼
유스케이스 교육을 들어 봤거나 프로젝트를 해 본 분들이면 아마도 귀가 따갑게 유스케이스는 GUI에 관한 부분은 적지 않는 것이라고 들어왔을 것이다. 유스케이스를 작성하면서 유저 인터페이스에 관한 내용을 언급하기 시작하면 유스케이스가 점점 사용자 매뉴얼이나 화면 설계서처럼 변해간다.

유스케이스는 향후 작성할 분석/설계 모델이나 화면 설계 등의 모델의 기본 정보를 제공한다. 또한 유스케이스로 추적(Trace)할 수 있다. 아니 추적되어야 한다. 사용자 매뉴얼이나 화면 설계서가 분석/설계 모델의 상위 요건이 될 수 있는가? 결코 그렇지 않다. 유스케이스는 적당한 목표수준으로 작성함으로써 상위 요건으로써의 역할을 다 할 수 있어야 한다.

포함과 확장의 오남용
어떤 유스케이스 다이어그램을 보면 다이어그램 가득히 실선과 점선이 어지럽게 꼬여 있는 그림을 가끔 본다. 왜 이런 다이어그램이 나오는지는 앞에서 언급하였다. 필자의 경우 이런 다이어그램은 십중팔구 뭔가 잘못되었을 것이라는 예감이 뇌리를 스친다. 우선 복잡하면 제대로 파악할 수 없고 서로 이해를 명확하게 하지 못했을 가능성이 높으며 이해도가 떨어지는 상황에서 유스케이스가 제대로 작성되었을 리가 없다.

사용자 삽입 이미지



유스케이스 다이어그램이 복잡하면 각 유스케이스의 이벤트 흐름을 작성하면서 아주 여러 부분에 포함(include)과 확장(Extends)이 나타나게 되고 결국 전체적으로 유스케이스의 유지보수를 어렵게 만든다. 유지보수가 어렵게 되면 요구사항을 정확히 담는데 점점 힘들어지고 현실과 동떨어진 그저 서로 다른 이해수준으로 각자의 머릿속에만 존재하는 요구사항이 나오게 된다.

최초 확장이라는 개념이 등장하게 된 이유는 이전 시스템의 요구사항 파일을 건드릴 수 없다는 실행 지침 때문이었다(Alistair Cockburn, 2001). 그 당시 개발팀의 임무는 새로운 서비스를 추가하는 것이었고 기존의 요구사항 문서를 건드릴 수 없는 상황에서 원래의 요구사항은 한 줄도 건드리지 않은 채 새로운 요구사항을 추가했다. Alistair Cockburn은 확장이 필요할 경우 다이어그램 상에서 보여주지 말고 기존 유스케이스 안에서 확장 유스케이스의 참조를 그저 텍스트로 서술할 것을 권유한다. 다이어그램에 복잡하게 확장을 표현함으로써 정작 중요한 유스케이스를 볼 수 없게 만들기 때문이다. 필자도 그의 주장에 동의 한다.

케이스 툴로 유스케이스 작성하기
케이스 툴로 유스케이스를 작성한다는 것이 잘못되었다는 것은 아니다. 오히려 케이스 툴이 활용상의 문제로 인해 정확한 유스케이스를 작성하는데 걸림돌로 작용하는 현상을 이야기하고 싶은 것이다. 필자는 지금까지 프로젝트를 진행하면서 유스케이스의 고단함에 대해 무척 많은 고민을 했었다. 일반적으로 개발자들은 작문을 싫어하는 습성이 있지만 요구사항을 파악하고 분석하는 사람들은 일반 고객과의 의사소통이 많기 때문에 산문 형식의 문서 작성(Technical Writing)에 능숙해야 함에도 불구하고 대부분의 프로젝트에서는 이러한 사실을 애써 외면한다.

작성하기 귀찮은 유스케이스를 케이스 툴로 그리고 끝내 버리려는 생각을 한다. 사실 필자도 예외는 아니어서 웬만하면 케이스 툴에서 모든 걸 해결하고 싶은 유혹에 항상 시달렸다. 하지만 대부분의 케이스 툴은 유스케이스를 서술하기 위한 조그만 다이얼로그 창만을 제공한다. 유스케이스를 기술한 문서를 따로 하이퍼링크 방식으로 케이스 툴과 연결하는 방법을 주로 취했는데 사실 힘들고 불편하다. 만약 어떤 케이스 툴의 기능 중에 일정한 유스케이스 작성 형식의 레이아웃을 디자인할 수 있고 그 템플릿 안에서 유스케이스를 작성하면 다이어그램이 역으로 만들어지는 케이스 툴이 있다면 얼마나 좋을까 하는 생각을 해본다. 언제쯤이면 편하게 유스케이스 모델링을 할 수 있는 케이스 툴이 나올까?

분석/설계 모델과 MDA
분석(分析)은 그 단어의 의미에서도 알 수 있듯이 무엇인가를 어떠한 목적 때문에 나누어(分) 쪼개는(析)것이다. 소프트웨어 개발에서 나누어 쪼개야 할 필요가 있는 부분은 문제 영역으로 시스템을 개발하는 사람들이 문제 영역을 올바로 이해하기 위한 목적으로 분석을 한다. 이해한 것을 즉시 시스템으로 만들 수 없으므로 중간에 문제 영역의 이해와 실 시스템간의 가교역할을 하는 것이 있는데 그것이 바로 설계이다.

사실 웬만하면 설계를 하지 않고 시스템을 만들고 싶은데 구현 언어나 플랫폼 등의 영향을 많이 받기 때문에 분석한 결과를 바로 시스템화하기 힘든 것이다. 현재 분석에서 설계를 거치지 않고 바로 실 시스템으로 건너가기 위한 노력이 진행되고 있는데 독자 여러분들도 잘 알다시피 MDA(Model Driven Architecture)가 그것이다.

현재 소프트웨어를 만드는 사람들의 작업 행태는 당연하게 생각되지만 지루하게도 4단계를 거친다. 문제 영역을 파악하고 분석하여 그 결과를 바탕으로 설계한 후 소프트웨어를 구현한다. 만약 정말 MDA가 활성화 된다면 중간에 1가지 단계가 빠지는 3단계 개발 공정이 나올 것이며 그저 요구사항 파악해서 분석 모델을 만들어 놓으면 실행 시스템이 튀어나오는 정말 환상적인 세상이 오지 않을까 싶다. 그런데 정말 이런 세상이 가능할까?

현 컴퓨팅 시스템은 다 계층 분산 시스템인 관계로 많은 설계 요소와 다양한 관련 기술이 필요하다. 이 모든 기술을 모두 알 수 없으므로 특정 기술 기반을 가진 사람들이 한 프로젝트에 모여 개발을 하고 그 중 충분한 경험과 깊은 지식을 갖고 있는 누군가가 아키텍트라는 역할로 소프트웨어 개발을 이끌고 나간다.

아키텍트라는 일반 비즈니스 로직 개발자들의 개발 자유도를 통제하기 위해 '메커니즘'이 라는 것도 만들어 놓고, 마음이 안 놓이는지 '프레임워크'라는 것도 만들어 놓아 오직 비즈니스 로직 구현에 몰두할 수 있게 만들어 놓는다. 비즈니스 로직 개발하는 것도 '패턴'이라는 이름으로 개발하는 방식을 제한하는 경우가 많다. MDA에서는 이러한 부분을 프로파일로 작성한다. 이 프로파일을 바탕으로 비즈니스 분석 모델을 빌드하면 실행 컴포넌트가 나오게 된다.

현재도 제품으로 출시되어 있는 MDA 솔루션들이 있다. 필자가 보기엔 어떤 솔루션은 무늬만 MDA인 것도 있고 실제 MDA의 비전에 상당히 근접한 솔루션도 있었는데 모델링 도구에서 모델을 만들고 OCL을 작성해 놓으면 놀랍게도 실제로 시스템이 작동했었다. 다만 일부 표준을 지원하지 않아 문제가 되긴 했지만 말이다.

하지만 언젠가는 MDA가 우리 피부에 와 닿을 정도로 현실화 되리라 믿는다. 초창기 컴퓨팅 환경에서 고급 언어로 일컫는 3세대 언어들은 그 당시 개발자들에겐 환상적인 꿈의 개념이었다고 한다. 기계어와 어셈블리 수준에서 프로그래밍을 하던 그들에게는 자연어와 비슷한 모양의 개발 언어는 얼마나 환상적으로 보였을까? 지금 우리는 이와 같은 과도기를 겪고 있다고 필자는 생각한다. 독자 여러분들도 그런 시대를 대비하여 하루빨리 모델링 능력을 한껏 끌어올리기 바란다.

자바 웹 애플리케이션 모델링
만약 개발 프로세스가 비슷하다면 그 프로세스를 적용하여 개발하는 모든 애플리케이션 모델링의 방법은 거의 유사하다. 웹 애플리케이션이라고 해서 별다르게 특이한 것은 없겠지만 웹 애플리케이션의 특성상 몇 가지 짚고 넘어갈 부분이 있다. 사실 엄밀하게 말 하면 웹이라는 특성도 있지만 자바의 특성으로 인해 모델링 방법이 약간 달라지는 수준으로 볼 수 있다. 특히 현 엔터프라이즈 컴퓨팅 환경은 다 계층 분산 시스템이므로 계층과 분산에 관한 부분의 모델링이 강조된다.

또한 사용자 웹 인터페이스 모델링도 중요한 부분으로 생각할 수 있다. 웹 페이지의 특성상 HTML이라는 제약으로 인해 약간 특이한 점이 있다. 웹 페이지 모델링에서 폼(form)과 같은 구성요소는 스테레오 타입(stereo type)으로 정의하여 모델링을 한다. 또 웹 페이지는 화면의 흐름에서 해당 정보를 갖고 다니거나 세션을 참조하기 때문에 어디까지 해당 정보를 갖고 다닐지 세션을 어떻게 참조할 지가 모델링의 주요 포커스가 된다. 일단 개요 수준은 여기까지 하고 실제 예제를 보면서 모델링이 어떻게 진행되는지 살펴보자.

분석 모델
좀 전에도 언급했듯이 웹 애플리케이션도 역시 다른 시스템과 마찬가지로 요구사항 파악 및 분석으로부터 시작한다. 요구사항을 위한 모델링으로 유스케이스를 이용하는 것은 이미 앞에서 이야기했고 특집 4부에서 자세히 다룰 예정이므로 유스케이스 자체에 관한 설명은 하지 않겠다. 또한 웹 애플리케이션이나 다른 기술을 이용한 애플리케이션이나 요구사항과 분석 모델링의 기법은 사실 별반 다르지 않다. 분석 모델은 구현과 관계가 없는데 분산(distribution), 영속성(persistency), 커뮤니케이션(communication), 인증(authentication)과 같은 메커니즘과 상관없는 개념적인 모델이기 때문이다. 즉, 유스케이스 모델을 기반으로 분석관점으로 유스케이스 실현(realization)을 표현한 객체모델이 바로 분석 모델이다.

사용자 삽입 이미지
<그림 8> 분석 클래스 다이어그램의 예


<그림 8>은 분석 모델의 유스케이스 실현(realization)에 참여하는 분석클래스 다이어그램이다. RUP에 의하면 분석클래스는 <<boundary>>, <<control>>, <<entity>> 등 세 가지 종류의 스테레오 타입을 갖는다. 원래 스테레오 타입은 태기드 벨류(tagged value)와 함께 UML의 확장 메커니즘의 한 종류이기 때문에 필요하다면 추가적인 스테레오타입을 정하여 사용하여도 무방하다.

사용자 웹 인터페이스 모델링
사용자 웹 인터페이스 모델링 부분은 웹 애플리케이션을 개발하면서 모델링 하기에 가장 껄끄러운 부분이 아닌가 생각된다. Jim Conallen은 그의 저서 『Modeling Web Application Architectures with UML(2002)』에서 웹 인터페이스 모델링을 자세히 설명하고 있다. 한마디로 요약하자면 웹 애플리케이션 모델링을 위한 다양한 '스테레오 타입'을 만들어 냈다.

필자가 보기에는 실무 프로젝트에서 과연 이런 노가다 작업을 할 필요가 있을까 생각이 되지만 순수 모델링 관점에서 볼 때 웹 페이지를 모델링 하기 위한 작업으로서 의미는 있다고 본다. <그림 9>는 그가 제안한 웹 페이지를 모델링 예제이다. 참고하기 바란다.

사용자 삽입 이미지
<그림 9> Jim Conallen이 제안한 웹 인터페이스 모델링 예


실무 프로젝트에서 Jim Conallen이 제안한 방법으로 모델링 하는 경우를 본적은 없고 필요한 부분만을 발췌해 많이 단순화시킨 형태로 모델링을 진행한다. 사용자 인터페이스 모델은 화면 흐름, 참여 화면의 설명, 화면 이동 맵, 화면 클래스 다이어그램, UI 프로토타입 등으로 구성된다. 이중 UML로 모델링 하는 몇 가지를 소개하겠다.

화면 흐름
화면 흐름의 경우 비즈니스 로직 처리와는 전혀 관계없이 오직 해당 작업을 수행하기 위한 화면 관점에서 모델링을 한다.

사용자 삽입 이미지
<그림 10> 시퀀스 다이어그램으로 표현한 화면 흐름도


화면 이동 맵
화면 이동 맵은 각 화면의 구성 요소를 클래스 다이어그램으로 표현한 것이다.

사용자 삽입 이미지
<그림 11> 클래스 다이어그램으로 표현한 화면 이동 맵


웹 애플리케이션을 위한 프레임워크 모델링
자바를 이용하여 웹 애플리케이션을 개발하게 되면 우선 여러 제약 사항들이 나타나게 된다. 앞서 이야기한 페이지 제어 문제, 세션 처리 문제, 데이터 처리 문제, 다양한 프로토콜의 처리 문제, 까다로운 보안 문제, 웹과 분산 컴포넌트간의 동적 호출 문제, 예외처리 문제, 웹 애플리케이션과 레거시(legacy)와 인터페이스 문제 등 각 메커니즘에 관해 다루어야 할 부분이 많다. <그림 12>는 각 메커니즘을 고려한 일반적인 웹 애플리케이션의 시스템 구성도이다.

사용자 삽입 이미지
<그림 12> 일반적인 웹 애플리케이션의 시스템 구성도


이 그림에서 메커니즘으로 정리해야 할 주요 부분은 여러 가지가 있지만 그 중에서 Web Server와 Web App Server와의 연동 부분으로 JSP에서 어떠한 Action을 통해 EJB 비즈니스 컴포넌트를 수행시키고자 하는 부분과 데이터 처리하는 부분, 타 시스템과 인터페이스 기술을 만약 웹 서비스로 할 경우 웹 서비스 클라이언트와 웹 서비스 서버간의 메커니즘 등을 들 수 있다. 몇 부분에 대한 메커니즘에 대하여 모델을 보면서 살펴보자.

JSP에서 Action을 통해 비즈니스 컴포넌트를 수행하는 부분
이 부분의 경우 프리젠테이션 레이어와 비즈니스 레이어간의 느슨한 결합을 지원하기 위해 J2EE 패턴 중에 '비즈니스 델리게이트 패턴(business delegate pattern)'을 사용할 수 있다. 원래 비즈니스 델리게이트 패턴은 비즈니스 서비스 컴포넌트와 일어나는 복잡한 원격 통신에 관련된 사항을 클라이언트로부터 숨기기 위해 사용한다. 비즈니스 델리게이트에 관해 자세한 것을 알고 싶으면 자바 웹 사이트나 코어 J2EE 패턴을 참고하면 된다.

다음에 소개할 프로젝트의 상황 때문에 약간 변경이 되었는데 비즈니스 델리게이트는 원격 통신에 관한 처리와 함께 해당 프로젝트의 사정으로 EJB 비즈니스 컴포넌트와 일반 자바 클래스 형태의 비즈니스 컴포넌트, 그리고 웹 서비스를 통해 타 시스템의 비즈니스 컴포넌트도 함께 수행해야 했다.

따라서 비즈니스 컴포넌트가 EJB건 일반 자바 클래스건 SOAP 기반의 통신이던 간에 클라이언트는 그저 비즈니스 컴포넌트 아이디와 비즈니스 컴포넌트 쪽에 넘겨줘야 할 파라미터만 알고 있으면 되도록 설계하였다. 해당 비즈니스 컴포넌트는 비즈니스 델리게이트에서 리플렉션을 이용해 동적으로 수행되도록 했다.

사용자 삽입 이미지
<그림 13> 비즈니스 델리게이트 부분의 클래스 다이어그램


<그림 13>에서 BusinessMapper의 역할은 XML 형태의 컨피규레이션(Configuration)로 빠져있는 파일을 읽어 웹 애플리케이션이 기동할 때 캐싱하게 된다. 이 컨피규레이션 파일에 담겨있는 정보를 바탕으로 BusinessMap 클래스가 모델의 역할을 하게 되는데 BusinessMapper는 BusinessMap을 자신이 갖고 있는 Map에 담아 갖고 있는다. 또한 BusinessMapper는 JVM상에 오직 하나만 존재해야 했으므로 '싱글턴 패턴(singleton pattern)'을 적용하였다. 이것을 실제로 구현하기 위해서 필자는 자카르타의 커먼스(commons)의 다이제스터(digester)를 이용하여 구현했다.

사용자 삽입 이미지
<그림 14> 비즈니스 델리게이트 부분의 시퀀스 다이어그램


외부 시스템과 연동 부분
웹 서비스의 SOAP을 이용한 통신을 하기 위해서는 웹 서비스 RMI 리모트 인터페이스를 상속한 인터페이스를 상속한 스텁(stub)을 통해 비즈니스 컴포넌트를 수행하게 된다. 이 부분은 위에서 설명한 비즈니스 델리게이트 부분과 아주 관련이 깊은데 일반 자바 비즈니스 컴포넌트의 경우 같은 머신의 동일 컨텍스트에 존재하므로 스트럿츠 액션(Struts Action)에서 비즈니스 델리게이트를 통해 바로 부르면 비즈니스 델리게이트는 그저 리플렉션을 통해 해당 비즈니스 컴포넌트를 실행하면 된다.

하지만 웹 서비스 비즈니스 컴포넌트인 경우는 다른 머신에 존재하는 컴포넌트이므로 원격 호출에 대한 부분 동일한 방법으로 서비스의 위치를 찾아낼 수 있도록 J2EE 패턴 중에 '서비스 로케이터 패턴(service locator pattern)'을 이용하였다. 이 부분 역시 약간의 변형이 가해졌는데 다이내믹 바인딩 시간이 비교적 길기 때문에 서버에서 받아온 스텁을 웹 애플리케이션 서버 쪽에 풀(pool)을 하나 만들어 스텁을 한번 가져온 이후 풀에 넣어놓고 다음 호출부터는 풀에서 꺼내어 쓰도록 설계하였다. 필자는 이런 설계를 구현하기 위해 자카르타 커먼스에 있는 풀(pool)을 이용하였다. EJB의 경우도 이와 거의 유사하다. <그림 15, 16>은 웹 서비스 부분의 클래스 다이어그램과 시퀀스 다이어그램이다.

사용자 삽입 이미지
<그림 15> 웹 서비스 부분의 클래스 다이어그램


사용자 삽입 이미지
<그림 16> 웹 서비스 부분의 시퀀스 다이어그램


데이터 처리 부분
필자가 이 부분을 설계하고 구현해 놓고 보니 사실 메커니즘이라기보다는 일종의 유틸리티성의 헬퍼 클래스 성격이 짙었다. 주요 특징 중에 하나는 SQL 쿼리를 소스코드에 직접 넣지 않고 XML 형식의 파일로 뽑아내었다는 것이다. 데이터베이스를 통해 데이터를 주고받아야 하는 비즈니스 컴포넌트 입장에서는 쿼리 아이디와 Object 배열에 담긴 파라미터를 QueryHelper에 넘겨주면 쿼리를 실행하고 결과를 넘겨준다.

결과는 여러 형태로 받을 수 있는데 종류로는 Map 형태, Map의 리스트 형태, 특정 Bean 형태, Bean의 List 형태로 Object 객체에 담아 받아 올 수 있다. 필자는 이런 설계를 구현하기 위해 자카르타 커먼스에 있는 디비유틸(DBUtil)을 이용하였다. <그림 17, 18>은 데이터 처리 부분의 클래스 다이어그램과 시퀀스 다이어그램이다.

사용자 삽입 이미지
<그림 17> 데이터 처리 부분의 클래스 다이어그램


사용자 삽입 이미지
<그림 18> 데이터 처리 부분의 시퀀스 다이어그램


컴포넌트 모델링
컴포넌트 모델링의 과정은 컴포넌트를 식별하고 그것의 인터페이스를 정의하고 컴포넌트의 내부는 어떻게 작동하며 구현을 어떻게 할 건지에 대한 종합적인 과정이 필요하다. CBD(Component Based Development)에는 많은 이견들이 있지만 이 글에서는 현존하는 기법을 통해 컴포넌트 식별 방법을 아주 간략하게 설명하고 컴포넌트 모델링과정이 어떻게 진행되는지 궁금해 하는 독자들을 위해 각종 다이어그램을 보면서 살펴보기로 한다.


Catalysis :타입과 조인트 액션을 중심으로 상호작용을 분석하여 네트워크 다이어그램을 만들고, 결합력과 응집력을 고려한 메트릭을 만들어 컴포넌트 식별한다.

마르미III :유스케이스/클래스 연관 메트릭을 사용하여 각 유스케이스와 관련 있는 클래스를 클러스터링 하여 컴포넌트 후보로 등록한 다음 다른 유스케이스도 분석하여 이전에 후보로 등록되었던 컴포넌트가 쓰이면 나머지 유스케이스도 활용할 수 있도록 인터페이스를 공개한다. 유스케이스/클래스 연관 메트릭을 분석하기가 좀 어려운 것 같다. 실무에서 활용 가능할지 의문시 된다.

UML Components :비즈니스 타입 모델에서 타입을 식별하고 이 타입을 관리할 책임이 있는 인터페이스를 정의한다. 식별된 인터페이스의 상호작용을 분석함으로써 서로간의 의존관계를 파악/정제하여 컴포넌트를 제안한다. 분석가의 경험에 많이 의존하는 경향이 있다.

RUP :분석/설계가 상당히 진행된 후 각 클래스를 종횡으로 묶는 방식을 취한다. 초기 컴포넌트 식별은 불가능 하다.


컴포넌트 인터페이스 정의
어찌됐던 간에 컴포넌트를 식별했으면 인터페이스를 정의한다. 이 단계에서 정의되는 컴포넌트 인터페이스는 Business Facade의 성격으로 각 인터페이스를 명세화 한다.

사용자 삽입 이미지
<그림 19> 컴포넌트 인터페이스


컴포넌트 내부 설계
컴포넌트 내부 설계는 앞에서 정의한 인터페이스를 구현하기 위한 설계를 일컫는다.

사용자 삽입 이미지
<그림 20> 컴포넌트 내부 설계 클래스 다이어그램


EJB 컴포넌트 설계
EJB 컴포넌트 자체에 관한 설계로 <그림 21>은 Customer 비즈니스 컴포넌트의 워크플로우를 관리하고 클라이언트 요청에 대해 Facade 역할을 수행하는 Stateless Session Bean 에 대한 클래스 다이어그램이다.

사용자 삽입 이미지
<그림 21> EJB 컴포넌트 설계 클래스 다이어그램


유능한 모델러로 거듭나기
지금까지 개발 프로세스 측면에서 바라본 모델링과 자바 웹 애플리케이션을 위한 모델을 보았다. 사실 아주 많은 내용을 한정된 페이지에 집어넣으려고 하다 보니 주마간산 격이 되어버렸는지도 모르겠다. 모델링이라는 것이 개인적인 주관과 경험에 많은 영향을 받는 것은 사실이다.

필자는 지금까지 모델링과 관련된 프로젝트와 교육을 여러 번 해보았지만 아직까지 잘된 모델링은 바로 이런 것이라고 꼭 집어 이야기하기 힘들다. 다만 어떤 모델은 보면 왠지 푸근하고 어떤 모델은 왠지 어색하다는 느낌이 든다. 그 느낌이 뭐라는 것도 아직 정확히 모르겠지만 말이다. 모델링을 잘 하기 위해 어떻게 트레이닝을 해야 할까라고 고민하던 중에 필자가 겪었던 짧은 경험이 떠올랐다.

올해 여름에 비슷한 일을 하는 사람들과 함께 어느 업체에 방문했던 적이 있었다. 날씨는 아주 더웠지만 차 안은 에어컨을 켜서 시원했다. 문제는 주차장에 차를 세워놓고 몇 시간 동안 뜨거운 여름 뙤약볕 아래 차를 세워놔야 하므로 일을 마치고 돌아올 시점에는 차 안이 불가마 찜질방 수준으로 될 거라는 것은 충분히 예상할 수 있는 상황이었다. 그때 누군가 “그늘 아래 세워놔야 할 텐데”라고 하자 어떤 사람이 “그늘 오리엔티드(Oriented)구먼”이라고 응수했다. 그러자 또 누군가 “오리엔티드는 아니지, 오리엔티드는 왠지 그늘 자체가 되어야 하는 듯한 느낌을 준다고, 그늘 드리븐(Driven)이 맞지 않을까? 드리븐은 목표를 향해 돌진하는 느낌을 주자나? 결국 우리는 지금 그늘을 찾아가고 있는 거고”라고 했다. 이때 필자는 “음~ 정확히 말하자면 그늘 베이스드(Based)가 어울릴 것 같은데? 우리는 그늘을 베이스로 깔고 앉아야 하잖아?”라고 주장하여 모두들 웃으며 짧은 말장난을 했던 기억이 있다.

예로 든 이야기에서 그 상황에 오리엔티드(Oriented)나 드리븐(Driven), 베이스드(Based)라는 용어의 의미에 정확하게 맞았는지는 일단 논외로 하겠지만 실제 모델링을 하는 상황에서는 이와 같은 일들이 자주 일어난다. 모델링을 하는 사람들은 그 상황에 맞는 의미를 정확히 파악하여 모델을 만들기 위한 노력을 끊임없이 해야 하고 특히 용어, 단어의 의미, 그리고 단어간의 관계에 대하여 고민해보고 정확하게 짚고 넘어가는 버릇을 들여야 하지 않을까 싶다.

우리가 지금 주제로 이야기하는 UML을 이용한 모델링이라는 것이 결국 모호성이 아주 높은 자연 언어를 몇 개의 모델링 요소로 표현하는 작업이기 때문에 소프트웨어 모델링을 할 때만 모델에 대하여 생각하는 것이 아니라 실생활 속에서 패러다임에 맞게 사고하는 지속적인 훈련을 해야만 한다.

앞에서 MDA에 관하여 짧게 언급 했지만 아마 앞으로 소프트웨어 개발에 있어서 모델은 점점 더 중요한 요소로 부각될 것이다. 필자도 그렇고 이 글을 읽는 독자 여러분도 지속적인 수련을 통해 더욱 유능한 모델러로 거듭나리라 믿는다.@

* 이 기사는 ZDNet Korea의 제휴매체인마이크로소프트웨어에 게재된 내용입니다.

 

고재현

2005/03/26

 

[UML 제대로 알기] ① 가능성·확장성 품고 등장한 UML 2.0

 

연재순서
1회.가능성·확장성 품고 등장한 UML 2.0
2회.초보자를 위해 다각도로 살펴본 UML
3회.바로 알고 제대로 쓰는 UML 실전 모델링
4회.닷넷 환경에서 UML 툴 활용 가이드
5회.표준을 넘나드는 UML의 적절한 사용

 

UML을 중심으로 소프트웨어 업계에서 벌어지는 경제적, 사회적 현상들을 알아보고 UML 2.0 발표 이후 소프트웨어 업계에 불어 닥칠파장에 대해 알아본다. 또한 UML 2.0에서 개발자들이 주목해야 하는 세부 내용도 간단히 검토해 보자.

UML 2.0의 실로 엄청난 중요성을 미리 알고 대비할 것인지, 뒷짐 지고 좀 더 지켜볼지는 이번 글을 보고 판단해 주기를 바란다.

필자는 지난 2004년 마이크로소프트웨어 8월호에 MDA 관련 글을 기고하던 당시부터 지금까지 필자의 소속 회사가 지난 10여 년간 전문적으로 개발해 오던 인적 자원 관리(HRM) 시스템에 대한 획기적인(?) 개선 방안으로 MDA 기반의 시스템 개발을 추진하고 있다. 필자가 본격적으로 UML 2.0을 검토하기 시작한 것도 8월을 전후해서였다.

그러나 회사에서 표준으로 사용하는 모델링 도구 제작 업체에서는 4개월 전만 해도 UML 2.0을 지원하지 않았고, MDA 패러다임을 표방하면서도 아쉽게도 그 요체인 UML 2.0은 그저 각종 문서나 자료들을 통해서만 접할 수 있었다. 인사 비즈니스 프로세스 개선 작업(BPI)과 같은 초기 설계 작업은 UML 1.4 기반으로 추진해야 했고, 올 연말로 예정됐던 도구 공급사의 차기 버전을 기대해야 하는 상황이었다.

그러던 얼마 전, 필자는 해당 업체로부터 UML 2.0을 충실히 지원하게 된 새 버전의 케이스 도구를 입수했다. 비록 필자가 이미 여러 책이나 자료들을 통해 UML 2.0을 검토했었음에도, 막상 본격적으로 UML 2.0 지원 모델링 도구를 설치하고 작업을 착수하려던 그 순간의 첫 느낌을 말로 하자면 막막함 그 자체였다.

그 모델링 도구의 새로운 버전이 완전히 개편된 새로운 사용자 인터페이스로 구성됐으며 내부적으로도 상당한 기술적인 패러다임 전환이 있었던 것도 한 원인이었겠지만, 무엇보다도 근본적으로 UML 2.0이 내포한 그 가능성과 확장성에 대한 놀라움과 설렘이 교차하면서 만들어낸 미묘한 흥분과 두려움이었다는 것이 적절한 것 같다. 1620년 메이플라워호를 타고 미지의 땅 아메리카에 첫 발을 내디뎠던 이주민들의 마음이 이렇지 않았을까?

UML의 사회적 파장
UML 2.0 발표와 더불어 개발자들이 주목해야 하는 세부 내용을 살펴보기 전에 우선, UML을 중심으로 소프트웨어 업계에서 벌어지는 경제적, 사회적 현상들을 통해 향후 UML 2.0 발표 이후 소프트웨어 업계에 불어 닥칠 파장에 대해 미리 가늠해 보는 시간을 가져 보기로 하겠다.

IT 시장 변화에 주목하자
이 시대 소프트웨어 산업에 종사하는 사람이, 딴 세상에 사는 사람(beings in heaven)이 아닌 이상, 자본주의 시대를 살아가는 현대인으로서 공급과 수요를 결정하는 시장 논리로부터 자유로울 수는 없다.

우리는 종종 뛰어난 기술력을 갖추고 있음에도 망하는 반면, 특별한 기술력을 가지고 있지 않음에도 번창하는 사람이나 기업을 종종 목격하곤 한다. 즉, 기술력이 곧 성공을 의미하지는 않는다. 마찬가지 논리로, UML 2.0이 아니라 그 어떤 뛰어난 기술이 존재한다 하더라도 IT 시장에서 그 기술력을 필요로 하지 않거나 수용할 수 없다면, 그 기술력의 시장 가치는 무의미할 수밖에 없다.

2000년을 전후해서 전세계적으로 Y2K 문제가 사회적 문제로 부각되고 시스템의 대공황 사태가 예고되던 시절, 아이러니컬하게도 당시 소프트웨어 산업에서는 사양길로 접어들었던 프로그래밍 언어의 전문가들이 국내의 IMF 사태와 맞물려 고액 연봉으로 대접 받으면서 해외로 진출했던 일이 기억난다. 역시 기술의 가치(technology value)는 시장 원리(market behavior)에 의해 결정될 수밖에 없음을 인정하지 않을 수 없다.

그런 관점에서 UML 2.0이 공식적으로 공표되는 전후의 소프트웨어 산업계 판도를 살펴보는 것은 의의가 있다. 세계적으로 이미 프로그램 개발 도구 시장은 그 성장세가 둔화됐고, 모델링 도구는 빠른 속도로 보편화되어 가고 있다. 지난 몇 년간 일어났던 IT 업계의 큰 사건들을 살펴보면 그러한 사실을 쉽게 확인할 수 있다.

이를테면 예전에는 비싸게 판매하던 개발 도구를 점차 저렴하게 행사 가격으로 판매한다거나, 개발자 저변 확산이라는 명목 하에 학교나 학원을 중심으로 무료로 배포하고 있다. 심지어는 이클립스 등과 같은 막강한 개발 도구를 오픈소스로서 인터넷을 통해 무료로 배포하고 있다.

몇 년 전 세계적인 소프트웨어 업체인 MS에서는 비지오(Visio)라는 2D 전용 도구 개발 업체를 인수했고, IBM은 세계적인 모델링 도구 전문 개발 업체인 래쇼날을 인수합병했으며, 연이어 볼랜드에서는 투게더를 사들였다. 한편, 국내외 UML 관련 포럼이나 협회들에서는 앞다퉈 UML 관련 인증 제도를 만들어 발표하면서 그 인지도를 넓혀 가기 위한 대대적인 작업을 벌이고 있다.

UML 인증 제도의 필요성이라든지, 인증 제도 자체의 신빙성이나 효용성에 대해 논하기 이전에, 어떠한 사상이나 개념이 제도화 되는 과정을 거치고 있다는 사실은 그 사상이나 개념이 해당 분야에서 도입기(intro)와 성장기(growth)를 거쳐 성숙기(mature)에 진입하고 있음을 암시하는 것이다.

표준화의 숨은 뜻
UML을 논하면서 표준화(standardization)라는 키워드를 빼놓을 수 없다. UML이 발표되기 전에 국방이나
MIS분야 엔지니어들에게 친숙한 IDEF라든지 DFD, ER 혹은 Petri nets 등과 같은 정형 기법(formal method)으로 통칭되는 수많은 표기법(notation)과 지원 케이스 도구들이 존재했음에도 불구하고(참고자료:[1]번혹은[2]번등), UML은 가장 단기간 동안 소프트웨어 공학 분야에서만큼은 빠른 속도로 사실상의 표준(de-facto)의 위치를 확보했다. 언뜻 생각해 보면 UML이 여타 표기법들을 교통정리해 준 안도감(?)이 들 수도 있겠지만, 겉으로 잘 드러나지 않는 그 내막에는 무서운 음모(?)가 도사리고 있다.

표준화 작업에 주도적인 역할을 수행하는 업체들이 왜 그토록 천문학적인 자본을 투자하면서 공개적인 표준화 작업에 동참하는 것일까? 여러 가지 복합적인 이유들이 있을 수 있겠지만, 결론적으로 표준화 경쟁이다.

유명한 예로, 1970년대부터 시작됐던 빅터(Victor)의 VHS 방식과 소니의 베타 방식으로 대표되는 비디오 표준 전쟁을 들 수 있고, 최근에는 유럽과 미국을 중심으로 벌어지고 있는 위성방송 표준화 전쟁을 들 수 있다. 표준화 전쟁에서의 승패는 곧 기업의 운명을 좌우하는 것이다.

표준화의 이면에는 높은 진입 장벽을 통해 허가 받지 않은 침입자(intruder)를 봉쇄하려는 무서운 저의가 자리 잡고 있다. 시야를 좀 더 넓혀 보면, 의사나 판사, 회계사 등. 통속적인 표현으로 소위 ‘사’자로 끝나는 직업들에 대한 사회적 가치관을 살펴보면 쉽게 이해할 수 있다.

사람 몸을 열어서 칼질하고, 같은 인간으로서 다른 인간을 판단하고, 숫자 가지고 씨름하는 직업이 산업혁명 이전에는 별볼일 없는 직업이었다. 인류의 보편적인 가치관으로 판단하더라도 결코 즐거운 일이 될 수 없음에도 불구하고 전세계적으로 공히 가장 선호하는 직업이자 사회적으로도 가장 대접받는 직업이 된 현실에 미루어 짐작해 보면, 왜 그토록 세계적인 소프트웨어 업체들이 표준화를 통해 높은 진입 장벽을 구축하고 제도화에 전념하는지 그 이유를 충분히 이해할 수 있다.

어려운 시험을 통과하지 않고 누구라도 일정한 요건만 갖추면 수행할 수 있는 일반적인 직종 중의 하나라면 그렇게들 동경하는 직종이 됐겠는가? UML 2.0이 경제적으로나 사회적으로 주목 받는 이유 중의 하나는 바로 그러한 맥락에서 비전문인과 전문가를 구별하는 높은 장벽(?)을 쌓을 수 있는 재료(material)를 확보하고 토대를 마련했다는 점에서 의의가 있는 것이다.

주목해야 할 UML 2.0의 핵심 메커니즘
1997년 11월 UML 1.1로 시작된
OMG의 표준화 노력은 2001년 5월 UML 1.4 발표와 더불어 부분적인 개정 작업(minor version upgrade)의 막을 내리고, 대대적인 수술 작업을 거쳐 2004년 연말을 전후로 드디어 그 실체를 드러내었다.

그 동안 쟁쟁한 세계적인 소프트웨어 벤더들간의 보이지 않는 이해 관계(?)에 얽혀 2002년 말로 예정됐던 최종 발표 시한을 2년여를 연장하면서 이제서야 그 대단원의 막이 마무리되고 있다. 향후 UML 2.0의 일정은 명실상부한 국제 표준(de jure)으로 자리매김하기 위해 ISO 설계 표준으로 추진 중인 것으로 알려져 있다.

UML 2.0이 주목 받는 가장 중요한 이유는 무엇일까? 처음 세상에 나오고 나서는 여기저기서 수많은 비판을 받았지만, 그것은 UML이 어떠한 플랫폼이나 도메인에도 의존하지 않고 소프트웨어 개발의 전 공정(SDLC)을 지원하는 방향으로 지향해왔다는 데에 그 원인을 찾을 수 있다. 즉, 요구사항 획득으로부터 마지막 테스트까지 모두 지원하는 표기법으로서 진화해 왔다는 것이다.

그리고 점진적으로 UML 2.0부터는 실행 모델(executable UML)이라는 기법을 수용함으로써, 소프트웨어 공학에서 궁극적으로 염원하던 분석 설계(analysis & design)와 실제 구현(implementation) 간의 차이(chasm)를 극복하는 성과를 보였기 때문이다.

OMG의 UML 2.0에 대한 제안요청서(RFP)의 주제이자 현재 채택된 명세서 초안은 크게 4가지의 영역으로 분류된다. CASE 도구 벤더들간의 모델 호환성 문제를 다루고 있는 다이어그램 호환(Diagram Interchange) 영역과 모델 수준에서의 요소(elements) 제어 및 제약 문제를 다루고 있는 OCL(Object Constraint Language) 영역, UML뿐만 아니라 OMG가 주관하는 각종 표준의 통합과 정의에 활용되는 메타 모델 수준의 기본 구조체(constructs)를 명시하고 있는 하부구조(Infrastructure), 그리고 메타 모델을 기반으로 사용자 수준에서 모델을 활용하여 시스템의 구조(structure)와 행위(behavior)를 정의하고 있는 14개의 다이어그램을 정의하고 있는 상부구조(Superstructure)로 분류할 수 있다.

UML 2.0의 본질을 제대로 이해하려면 핵심인 하부구조로부터 차근차근 살펴보는 것이 순서이겠지만, 지면과 주제를 고려할 때, 일반인들이나 설계자들이 UML 2.0을 처음 대면하는 경우 가장 먼저 관심을 가지게 되는 UML 구조체(user-level constructs)인 상부구조로부터 이야기를 풀어가는 방식을 택하기로 하겠다.

사용자 삽입 이미지
<그림 1> UML 2.0 표준 다이어그램

*빨간 밑줄: 새롭게 추가된 다이어그램, 녹색 밑줄: 명칭이 변경된 다이어그램

상부 구조는 크게 6개의 다이어그램으로 구성된 구조형 다이어그램(Structural Diagram)군과 7~8개의 다이어그램으로 구성된 행위형 다이어그램(Behavioral Diagram) 군으로 분류할 수 있는데, 각 군의 대표적인 복합 구조 다이어그램(Composite Structure Diagram)과 순차도(Sequence Diagram)를 중심으로 그 특징과 의의를 살펴보도록 하겠다.

이어서 UML 2.0의 기반을 설명하고 있는 하부구조의 의미는 무엇인지, 그리고 실제 설계 작업에서 하부구조의 접근법은 어떠한 방식으로 활용하게 될 것인지 논의하기로 하겠다.

상부구조 - 구조형 다이어그램
일명 아키텍처 다이어그램(architectural diagram)이라고도 불리는 복합 구조 다이어그램(composite structure diagram)은 UML의 핵심 다이어그램인 클래스 다이어그램의 변형된 형태이다. 이는 시스템 구조 설계에 있어 또 다른 핵심 축으로 평가 받고 있으며 가장 주목 받는 다이어그램 중의 하나이다.

복합 구조 다이어그램은 기본적으로 시스템 혹은 컴포넌트의 내부 구조(internal structure)를 명시적으로 중첩시켜 표현하고 있으며, 시스템 아키텍처의 보다 섬세한 분석과 설계 사상을 담을 수 있게 된 점이 가장 큰 매력으로 꼽을 수 있다.

그렇다면 왜 복합 구조 다이어그램이 주목받는지, 그리고 복합 구조 다이어그램은 왜 탄생하게 되었으며, 향후 어떠한 용도로 활용하게 될까? 보는 시각에 따라 의견을 달리 할 수 있겠지만, UML 1.x은 근본적으로 OOAD 수준의 설계 사상을 표현하기에 최적화된 표기법으로 평가되어 왔다.

UML 1.x에도 비록 컴포넌트 다이어그램이라는 것이 있기는 했지만, 실제 너무 빈약한 문맥(semantics)으로 인해 별로 활용되지 못했으며, 강경한 컴포넌트 신봉자들이나 대용량 시스템 혹은 전체 시스템을 통합적으로 표현하기 원했던 아키텍처 전문가 진영 개발자들에게는, 그저 객체 옹호론자들이 제시하는 옹색한 명분(?)에 지나지 않았다. 사실 UML 1.x 자체에도 명시하고 있듯이, 컴포넌트 다이어그램은 몇몇 다이어그램들과 더불어 클래스 다이어그램에 일종의 간단한 확장 메커니즘을 통한 단순한 관점(view) 변경 수준에 지나지 않았다.

비즈니스 컴포넌트에 관심이 많았던 컴포넌트 신봉자들의 경우, UML 1.x의 스테레오타입(stereotype)등의 확장 메커니즘을 통해 그럭저럭 UML 1.x과의 관계를 유지하면서도 BPM이라는 포괄적이고 확장된 별도의 비즈니스 컴포넌트 표기법을 병행하며 UML 1.x의 미비한 부분을 채워 나갔다.

아키텍처 전문가 진영에서는 상황이 조금 달랐는데, 대다수의 아키텍처 전문가 진영에서 관심을 가지고 있던 임베디드 혹은 리얼타임 도메인에서는 단순히 UML 1.x 정도의 확장 메커니즘으로는 그들이 필요로 하는 아키텍처를 통한 시뮬레이션 등과 같은 시스템의 섬세한 분석 및 설계라는 목적 달성이 거의 불가능했고, 그러한 목적 달성을 위해 UML의 확장 메커니즘을 활용한다는 것은 차라리 자신들만의 특정 영역에 필요한 표기법을 자체 정의하여 사용하는 것이 훨씬 경제적이었다는 것이다.

왜냐하면 이미 아키텍처 전문가 진영에서는 UML 1.x가 발표되기 이전에 광범위하게 수많은 ADL(Architectural Description Language)과 관련 시뮬레이션 도구들이 개발되어 활용되고 있었으며, 굳이 UML에 순응하는(compliant) 방안을 모색하기 위해 UML을 연구하고 고민할 시간적 여유나 명분이 없었던 것이다.

그러나 그러한 두 진영에서 근본적으로 해결하지 못한 결정적인 문제는 자신들이 독자적으로 발전시켰던 표기법 중에 어떠한 것도 명실상부한 사실 표준(de-facto)으로 합의하지 못했다는 것이다. 가령, 아키텍처 전문가 진영에서 필요로 하는 시스템 시뮬레이션 기능을 구현하는 데 사용하는 정형 기법의 경우 동일한 도메인에서조차 연구소나 익숙한 기법에 따라 서로 달리 정의하고 필요한 시뮬레이션 도구를 개발해야 했다.

국제적인 공동 작업은 말할 것도 없이 국내에서 서로 다른 연구기관이 공동 작업을 수행하기 위해서도 사전에 일정한 표준 정형 기법을 합의하고 정립한 후 과제를 수행해야 했으며, 최종적으로 통합하는 과정에서는 결국에 모델 수준에서의 통합을 포기하고 구현 수준에서 테스트를 통해 통합하는 방식을 따라야 하는 문제점을 내포하고 있었다.

덧붙여 두 진영에서 해결하지 못한 결정적인 문제 중의 하나는 실제 구현(code)에 필요한 낮은 추상화 수준의 설계에 대해서만큼은 어설픈 UML 1.x의 메커니즘만한 수준의 방안을 제시하지 못했다는 것이다.

UML 2.0에서 새롭게 등장한 복합 구조 다이어그램은 바로 지금까지 앞서 살펴 본 아키텍처 전문가 진영으로 대표되는 임베디드 혹은 리얼타임 도메인의 핵심 개념이자 도구였던 SDL(Specification Description Language)을 수용하여 탄생한 다이어그램이다.

사용자 삽입 이미지
<그림 2> UML 2.0 복합 구조 다이어그램 예


UML을 잠시라도 살펴 본 경험이 있는 개발자들이라면, 복합 구조 다이어그램의 개략적인 형태만을 보고서도 쉽게 그 특징을 이해할 수 있을 것이다. 즉, 복합 구조 다이어그램은 매우 직관적인 형태를 취하고 있으며, 기존의 UML 1.x에서 단순한 패키지 개념의 서브시스템 내부를 구성하고 있는 클래스 다이어그램으로만 표현이 가능하던 시스템 내부 구조를 보다 섬세하게 설계할 수 있게 됐다.

그렇다고 <그림 2>와 같이 대부분의 UML 2.0을 기반으로 한 샘플들처럼 임베디드나 리얼타임 도메인과 같이 상대적으로 소프트웨어의 비중이 작은 단위 시스템이나, 특정 MIS 분야의 단위 서브시스템의 내부 설계에만 국한되어 복합 구조 다이어그램을 활용하겠다고 생각한다면, UML 2.0의 본질을 제대로 이해하지 못하고 있는 것이다.

복합 구조 다이어그램의 형태는 앞서 언급한 아키텍처 전문가 진영에서 아키텍처를 표기하는데 가장 많이 활용하는 아키텍처 스타일인 C&C(Component & Connector) 뷰 타입(view type)과도 일맥상통하는데, 복합 구조 다이어그램을 활용하고자 하는 모델의 추상 수준을 높이면 대규모 시스템의 아키텍처도 매우 유용하게 설계할 수 있게 된다.

<그림 2>에서 벤딩머신(VendingMachine)으로 되어 있는 부분을 인사시스템이라 정의하고 내부 부분(parts)들을 그것을 구성하고 있는 단위 시스템으로 정의하게 되면, 외부 인터페이스를 통해 회계시스템(AS)이나 고객관리시스템(CRM) 등과 주고받아야 할 데이터나 정보를 명시적으로 설계에 반영할 수 있을 것이다.

바로 설계자가 의도하는 어떠한 추상화 수준의 모델이라도 UML 2.0의 복합 구조 다이어그램은 보다 섬세하게 설계할 수 있도록 일관된 문맥(context)과 의미(semantics)를 제공하고 있는 것이다.

상부구조 - 행위형 다이어그램
UML 2.0 상부구조 중 구조형 다이어그램은 말 그대로 구조적인 혁명을 꾀했다면, 행위형 다이어그램 군에서는 시스템의 동적 설계를 제대로 반영하기 위해 기존의 행위형 다이어그램 군 소속 다이어그램의 의미(semantics)를 보강하고 정제함으로써, 진화 방식을 선택했다는 표현이 적절할 것 같다.

그 근거로서 앞서 복합 구조 다이어그램으로 대표되는 구조형 다이어그램에서 수용한 SDL의 경우와는 다르게 UML 1.x에서 이미 수용하던 MSC(Message Sequence Chart) 개념을 UML 2.0에 와서는 전폭적으로 수용하여 순차도(Sequence Diagram)를 중심으로 행위형 다이어그램들의 유기적 결합 통로를 확보함으로써 시스템의 모델 수준에서의 논리적인 실행을 그대로 설계에 반영할 수 있는 발판을 마련했다.

사용자 삽입 이미지
<그림 3> UML 2.0 순차도의 예


<그림 3>에서 보는 바와 같이 UML 2.0 순차도의 가장 두드러진 특징은, 기존의 UML 1.x에서 지원하지 못했던 시스템의 분기, 참조, 병렬 실행 등과 같은 세세한 부분들까지도 지원이 가능하도록 중첩된(nested) 표기법 체계를 설계 기법으로 도입했다는 사실이다.

MSC와 같은 기법에 익숙한 개발자들에게는 언뜻 보기에 별로 특이할 것이 없어 보일지 모르지만, 중요한 사실은 UML 2.0을 표준 표기법으로 수용함으로써 어떠한 비즈니스 도메인이나 기술 영역에서도 <그림 3>의 순차도 뿐만 아니라 UML 2.0의 다른 다이어그램들과 유기적인 연결고리를 가지고 활용함으로써 거의 무한대에 가까운 표현 수단을 확보할 수 있다는 사실이다.

UML 2.0 상부구조 중 행위형 다이어그램의 갱신에 대해 많은 관심을 가지는 사람은 임베디드 혹은 리얼타임 진영에 종사하고 있는 개발자들이겠지만, 기존의 비즈니스 프로세스 모델링 분야에서 종사하던 개발자 진영도 깊은 관심과 기대를 가지고 있다.

필자 또한 비즈니스 프로세스 모델링과 관련하여 행위 형 다이어그램의 특성과 최적 방안을 모색하고 있는데, 동일 비즈니스 도메인에서조차 개별 기업마다 그 특성과 비즈니스 프로세스 처리 방식이 천차만별인 문제를 해결하고자 등장했던 워크플로우 엔진 혹은 설계 시스템(workflow engine or system)과 같은 전문적인 도구의 기능을 충분히 대치할 방안이 마련된 것으로 평가되고 있다.

하부구조 - 메타 모델
소프트웨어 공학 분야에서는 이런 속설이 있다. 자신의 분야에서 메타 모델 기반의 접근을 하게 되면 하나의 논문이 된다. 매일 고객들과 씨름하면서 현장에서 일하는 개발자들에게는 먼 나라 이야기처럼 들리고, 현실적으로는 일정 규모의 연구소 혹은 학교에서나 다루어질 만한 주제로 치부됐던 것이 사실이다.

UML 2.0 하부구조(Infrastructure)는 일반적으로 UML 2.0을 지칭할 때 생각하는 UML 2.0 상부구조뿐만 아니라 OMG의 또 다른 메타 모델 집합인 MOF, CWM 뿐만 아니라 미래의 새로운 표준을 정의하기 위해 심혈을 기울여 정의한 메타 모델이다.

OMG에서 처음 메타 모델 4계층 개념을 발표했을 때에는 그저 개념적인 내용으로만 인식하지 못했지만, UML 2.0의 실체가 드러나고 그것을 지원하는 케이스 도구들의 기능들이 메타 모델 기반 설계 방식을 지원함으로써, 이제는 메타 모델이라는 주제가 현장에서조차 피해갈 수 없는 현실 문제로 다가올 것이다. 그러므로 이제는 메타 모델 4계층 개념을 충분히 이해하고 응용하는 노력을 기울일 필요가 있다.

사용자 삽입 이미지
<그림 4> OMG 4계층 메타 모델 예


글의 주제와 지면 관계상 메타 모델에 대한 깊이 있는 논의를 하지는 못하지만, <그림 4>의 예로 간단히 살펴보자. 시스템 분석가나 설계자들이 일반적인 모델링 케이스 도구를 통해 특정 도메인 시스템을 설계한다고 했을 때의 메타 모델 수준(level)이 바로 사용자 모델을 도식하게 되는 M1 수준이다.

M2 수준은 그러한 UML 기반의 설계를 가능케 하는 어트리뷰트, 클래스, 인스턴스 등과 같은 모델 요소를 정의하는 메타 모델이며, UML 2.0의 하부구조는 바로 위 4계층 메타 모델 관점에서 M2 수준의 UML 메타 모델이 된다. M3 수준에 위치한 MOF(Meta Object Facility)는 M2 수준에 속한 메타 모델을 정의하는 메타메타 모델이 된다.

참고로 CWM(Common Warehouse Metamodel)은 M2 레벨이며, MOF의 내부 구조는 추상화된 UML 하부구조와 동일한 방식으로 정의하고 있다. 자세한 사항은 OMG UML 2.0 Infrastructure, 7. Language Architecture를 참조한다.

앞에서 살펴 본 바와 같이 OMG에서 UML 2.0 관련 제안요청서(RFP)를 제기한 목적은 단순히 UML 2.0을 체계적으로 정리하고자 한 것이 아니라, OMG의 또 다른 표준인 MOF와 CWM 및 미래의 새로운 표준을 체계적으로 정의하기 위한 용도로 제기됐던 것이다. 여기서 우리가 주목해야 할 사항은 UML 2.0 하부구조에 대한 제안요청서를 통해 제기한 또 다른 목적이다.

그것은 바로 지금까지 M1 수준에서 UML을 활용하던 사용자들이 보다 수월하게 M2 수준에서 UML을 커스터마이징하여 활용할 수 있는 메커니즘을 제공하는, 즉 이원화된 메커니즘을 제공하여 사용자들이 유연하게 특정 기술 도메인이나 비즈니스 도메인에 최적화된 방식으로 설계를 수행할 수 있도록 하자는 데 그 취지가 있었다.

그 핵심이 바로 UML 프로파일(UML Profiles)이다. 지금 UML 2.0 작업과 동시에 진행되고 있는 대표적인 기술 도메인 프로파일로는 우리들에게 친숙한 EJB 프로파일(Profile for EJB), 닷넷 프로파일(Profile for .Net)을 들 수 있다. 프로파일을 간단히 설명하면, 일종의 특정 기술이나 비즈니스에 적절한 커스터마이징된 확장 메커니즘을 사전 정의해 놓고, 추상화 수준이 서로 다른 모델들간의 전환(transformation)을 자동화시키는 핵심 메커니즘이다.

플랫폼 독립 모델(PIM: Platform Independent Model)로부터 특정 플랫폼 종속 모델(PSM: Platform Specific Model)로의 자동화된 전환이라는 MDA의 사상이 바로 대표적인 일례라고 볼 수 있다. UML 프로파일은 향후 MDA를 통해서 달성하려고 하는, 아니 궁극적으로 UML 2.0을 통해 달성하게 될 소프트웨어 공학의 핵심 화두인 소프트웨어 개발 생산성 향상의 핵심 메커니즘으로 평가 받고 있다.

만약 이 글을 읽는 개발자가 속한 관련 분야에 MIS 분산 시스템 개발의 사실 표준으로 통용되는 J2EE나 닷넷 등과 같은 개발 기술 표준 프레임워크가 존재한다면 다행스러운 일이다. 모델링 도구 벤더에서 제공하는 EJB 프로파일이나 닷넷 프로파일과 같은 기술 메타 모델은 그대로 활용하고, 관심 비즈니스 영역에 해당하는 표준 도메인 프로파일을 활용하거나, 독자적으로 정의해 설계 작업을 추진해 나갈 수 있기 때문이다.

하지만 최악의 경우 관련 분야에 기술이나 도메인 프로파일이 존재하지 않고, 더욱이 활용할 만한 케이스 도구조차 존재하지 않는다면 난감하다. 하지만 UML 2.0을 충분히 지원하는 범용 혹은 상용 케이스 도구를 통해 구현된 방식이나 기능을 살펴보면 놀랄 만큼 간결하다. 문제는 UML 2.0의 프로파일 방식과 같은 메커니즘을 이해하는 것이 아니라, 그 동안 개발자들이 간과해 왔던 문제, 가령 “해당 비즈니스 도메인을 제대로 이해하고 있었는가?” 등과 같은 근본적인 문제를 되돌아보는 계기가 될 것으로 생각된다.

어떻게 대처할 것인가
지금까지 UML 2.0 출시를 전후해서 전개되어 왔던 소프트웨어 산업계의 전반적인 흐름과 사회적 파장, 그리고 UML 2.0의 상부 및 하부구조의 핵심 메커니즘을 중심으로 간단히 살펴보았다. 그렇다면 과연 어디서부터 어떻게 UML 2.0을 시작할 것인가?

기본 원칙에 충실하자
우선 스스로에게 UML 1.4는 제대로 이해하고 활용해 왔는가라는 질문을 던져 보아야 한다. 필자의 경우 하는 일이 하는 일인만큼 UML 2.0이 발표되기 이전에도 자바나 비주얼 베이직 등과 같은 프로그래밍 용어나 주제에 비해 상대적으로 UML(1.x), OOAD, CBD, 방법론 등이라는 용어가 훨씬 낯설지 않았다.

당연히 주변에는 상대적으로 코딩보다는 현장에서 분석(analysis)이나 설계(design)를 전문으로 하거나, 학교나 학원 등에서 학생들을 가르치는 사람들이 많았지만 그 중에 UML 1.x 관련된 OMG 무료 명세를 제대로 살펴보았거나, 가까이 두면서 참조하는 사람은 찾아보기 어려웠다.

필자 가까이에 ‘UML 1.4 사용자 지침서’를 한글로 번역했던 분을 통해 확인해 보아도, 국내 출판사에서 출간한 책 부수로 미루어 UML 원문은 차치하고서라도 핵심 내용만을 추려서 발간한 그 UML 사용자 지침서마저 꼼꼼히 살펴 본 사람은 별로 보지 못한 것 같다. 필자도 예외는 아닌데, 돈이 없어서 혹은 원서이기 때문에라는 것은 이유가 되지 않았던 것이다.

그런데 UML 2.0이 공식 발표되는 이 시점에도 상황은 예전이나 별반 다르지 않은 것 같다. UML 2.0으로 공식 공표되기 전에 이미 오래 전부터 OMG에는 UML 관련 명세를 1.5의 형태로 인터넷에 배포하고 있었지만, 살펴본 사람은 찾기 어려웠다. UML 1.1이 처음 발표되던 시점에는 표기법으로서의 표준화 경쟁에서 판정승이 나지 않았던 때여서 그랬다고 하더라도, UML 2.0이 공표되는 이 시점에는 이미 국내외 많은 대학의 컴퓨터 관련학과에서 필수 과목으로 개설되었을 만큼 그 중요도와 필요성이 검증된 마당에 애써 그 사실을 외면하는 것은 더 이상 이유가 될 수 없다.

물론 지금까지의 현실은 그렇지 못했던 것이 사실이다. UML 전문가들마저도 UML 1.x의 설계 도구로서의 완성도가 받쳐주지 못했고, 무엇보다도 고객들도 유기적으로 논리적인 설계 모델을 기대하지 않았기 때문에 UML이라는 포장지를 가지고 피상적이고 개념적으로 대충 구색 맞추기식 설계 산출물을 만들어 주면 그만이었다.

그러나 앞으로의 상황은 그렇지 못할 것이다. 당장은 아니겠지만 UML 2.0 표기법이 소프트웨어 산업 시장에서 보편적으로 활용되고 국내외에서 하나 둘 그 무한한 잠재력과 가능성이 증명되어 그 시장 가치가 확연히 드러나기 시작하는 시점에는 우리 주변의 고객들 또한 단순히 보기 좋은 산출물 정도의 설계를 요구하지는 않을 것이다.

그렇다면 어디서부터 어떻게 준비해야 할 것인가? 그 실마리는 처음 접하면 이해하기 어렵고 복잡한 UML 2.0 관련 명세나 두꺼운 책에서 찾을 것이 아니고, 누구나 알고 있으면서도 충실하지 못했던 가장 기본적이고 원칙적인 원리를 고민하는 것부터 시작해야 한다.

원칙 하나, 도메인을 철저하게 분석하자
시스템을 설계한다고 했을 때, UML과 같은 설계 기법을 동원하여 작업하는 시스템 분석 및 설계자 그룹 외에 매우 중요한 역할을 수행하는 집단이나 개인을 가리켜 도메인 전문가 혹은 비즈니스 분석가라고 한다. 가장 이상적인 시스템 설계자는 두 가지 능력 즉, 해당 도메인에 대한 공인된 전문적인 지식을 가지고 있으면서 동시에 설계 능력을 고루 갖춘 인재일 것이다.

그러나 현장에서 그런 핵심 인재를 찾기는 어려운 것이 사실이다. IT 업계로만 보더라도 시스템 설계자와 개발자 간에 차이가 좀처럼 좁혀지지 않는데, 전혀 그 분야와 전공이 다른 비즈니스 전문가와 시스템 전문가 간에 느끼는 갈등은 말할 필요도 없다. 시스템을 설계해 본 사람은 누구라도 공감하겠지만, 시스템을 제대로 설계하려면 해당 도메인을 충분히 이해하고 철저하게 분석해야 한다. 그렇지 않으면 제대로 된 시스템을 설계할 수 없다.

시스템 설계자 입장에서 문제는 해당 도메인을 제대로 이해하기 위한 충분한 시간도 주어지지 않고, 나름대로 시스템 설계자가 충분히 이해한 것을 객관적으로 검증해 줄 만한 기준도 마련되어 있지 않다는 것이다. 설사 객관적 기준이 있더라도 그것은 현실적으로 거의 불가능하다는 것이다.

가령 회계 시스템을 설계하려면 회계사 자격증을 갖춰야 하는가? 물론 아니다. 그런데 우리는 주변에서 타의든 자의든 특정 도메인 시스템을 반복해서 설계하는 설계자의 경우 점점 해당 도메인에 대한 이해력이 높아지고, 회계사와 같은 공인된 자격증은 취득하지 못하더라도 나름대로 그 전문성을 인정받아 시장에서 높이 평가되는 경우를 보곤 한다.

비단 시스템 설계자에게만 해당되는 문제는 아니다. 조각조각 할당된 부분만 열심히 해야 하는 개발자에게도 비슷한 현상은 쉽게 찾아 볼 수 있다.

설계하고자 하는 해당 도메인에 대한 철저한 분석 없이는 일정한 추상화 수준을 유지한 유기적인 모델을 만들어 낼 수가 없다. 몇몇 책이나 발표 자료에서 설계 팁으로 이야기 하듯이 해당 도메인에서 반복적으로 등장하는 명사(nouns)를 클래스명으로 명명한다는 식으로 설계를 진행하다 보면 점점 헤어나지 못하는 미궁으로 빠져들게 된다. 결국에는 UML 2.0이라는 강력한 설계 도구를 가지고도 설계 따로, 코딩 따로라는 늪에서 벗어날 수 없다.

UML 표준화를 주도하는 OMG에 대해서 많은 사람들은 단순히 CORBA, ORB 등과 관련한 국제적인 기술 표준화 단체 정도로만 인식하고 있다. 하지만 앞서 주장한 도메인 지식 혹은 도메인 표준에 대한 중요성에 대해서는, 그러한 기술 표준화 단체로 출범한 OMG에서 2002부터 발족하여 추진하고 있는 DTF(Domain Task Forces) 위원회의 활동을 살펴보면 쉽게 이해할 수 있다.

이미 전략전술 통제(C4I), 재무(finance), 의료(healthcare), 제조(manufacturing), 우주항공(space), 통신(telecommunications), 운송(transportation) 등의 도메인을 필두로 그 표준화 작업을 진행 중에 있으며, 여러 표준화 단체들과 연합하여 다른 도메인으로까지 표준화 작업을 확장 중에 있다.

물론 아직까지 그 시도는 기술적인 관점에서의 접근이라는 한계를 크게 뛰어 넘고 있지는 못하지만 인터넷, 즉 IT 기술을 배제한 고전적 의미의 비즈니스는 점차 그 경쟁력을 잃어 가고 있는 현실을 생각할 때 OMG의 영향력은 쉽게 무시할 수 없는 것이 될 것이다.

원칙 둘, 모델의 추상 수준
사전적 의미로도 알 수 있듯이 모델은 본질적으로 어떤 특정 사물이나 현상에 비해 상대적으로 추상화되어 있는 무엇이기 때문에 똑같은 실체에 대한 서로 다른 모델은 서로 다른 추상화 수준(level of abstraction)을 가질 수밖에 없다.

사용자 삽입 이미지
<그림 5> 모델의 서로 다른 추상화 수준


<그림 5>를 보면 똑같은 자동차를 모델로 만든 것이지만, 상단의 자동차 그림(혹은 모델)은 추상화 수준이 높고 하단의 자동차는 추상화 수준이 낮다. 여기서 중요한 것은 추상화 수준의 높고 낮음은 상대적이라는 것이다. 우리가 UML에서 제시하는 여러 다이어그램을 가지고 모델을 제작한다는 것은 결국 목표하는 자동차나 건물 등과 마찬가지의 실체 즉, 특정 시스템 하나를 완성하기 위한 노력인 것이다.

즉, 설계 작업을 수행한다는 UML 1.4의 표기법을 동원하든 UML 2.0의 표기법을 동원하든 아니면 제3의 표기법을 활용하든 목표하는 시스템을 완성하기 위한 과정이지 다이어그램 혹은 표기법 자체가 목적이 되지는 않는다는 것이다. 이러한 똑같은 모델의 원리를 UML의 다이어그램을 가지고 설명할 수 있다. <그림 5>는 UML 1.4에서 제시하는 9개의 표준 다이어그램의 추상화 수준을 계량화하는 방안으로 방사형의 표로 도식해 본 것이다.

사용자 삽입 이미지
<그림 6> UML 1.4 다이어그램 추상화 분포


<그림 6>의 중앙에 위치한 지점을 설계자가 목적하는 목표 시스템의 코드 혹은 운영(run-time) 시스템이라고 한다면, 유스케이스 축에서 0.8으로 표시된 지점 정도의 추상화 수준으로 유스케이스를 작성한 것을 비즈니스 유스케이스라 할 수 있겠고, 0.4 정도의 지점 추상화 수준으로 작성한 것을 시스템 유스케이스라고 할 수 있을 것이다. 그렇게 가정해 본다면, 중앙에 가까운 지점의 추상화 수준으로 낮게 모델을 작성한다면 설계자가 목적하는 시스템은 보다 세세하게(detailed) 보이게 될 것이다.

유럽의 모든 길이 로마로 향하듯이, 어떠한 길(다이어그램)을 선택하더라도 종국에는 목적지(목표 시스템)에 도달할 수 있다. 하지만 각 다이어그램은 각자 목표하는 시스템으로 접근할 수 있는 추상화 수준의 한계를 가지고 있다.

가령, 유스케이스 다이어그램만을 가지고 시스템 설계를 완성할 수는 없는 것이다. 반면에, 클래스 다이어그램만 가지고 시스템 설계에 접근하다 보면 나무는 보고 숲을 보지 못하는 우를 범할 수 있다. 그러한 이유로 소프트웨어 설계에서 UML을 활용하여 목표 시스템을 설계할 때는 하나 이상의 다이어그램을 활용하게 된다.

대표적으로 많이 활용되는 다이어그램으로는 유스케이스, 클래스, 시퀀스 등을 들 수 있을 것이다. 문제는 여기서부터 시작 된다. 시스템 설계에 대표적인 3개의 다이어그램을 활용하든 아니면 9개의 다이어그램을 모두 활용하든 활용하는 다이어그램들이 각자 따로 존재하게 되는 것이다.

유스케이스 다이어그램 따로 클래스 다이어그램 따로 심지어는 동일한 시스템에 대한 유스케이스 다이어그램을 그리더라도 그리는 사람에 따라 서로 다른 추상화 수준(level of abstraction) 혹은 입도(granularity)의 유스케이스가 작성된다는 것이다. 이건 비즈니스 유스케이스니 이건 시스템 유스케이스니 하면서 무의미한 논쟁으로 치닫게 된다.

이러한 문제를 본질적으로 해결책하기 위해서는 그것이 UML 1.4이든 UML 2.0이든 각 다이어그램의 주된 용도(usage)와 목적(objectives), 그리고 그 한계를 충분히 이해하고, 각 다이어그램이 그러한 용도와 목적을 충족시키기 위해 제시하는 특성 표기법의 명확한 의미와 용도를 숙지해야 한다. 그 후에 활용하려는 다이어그램의 핵심 표기들 간의 추상화 수준에 대해 일관된 원칙(principle)을 우선 정립하고 설계 작업을 수행해야 한다.

가령 이러한 원칙 수립이 가능하다. 유스케이스 다이어그램을 통해 작성한 하나의 유스케이스를 하나의 활동도(Activity Diagram)로 도식하기로 했다면, 활동도의 활동(Activity)은 유스케이스 시나리오로 작성하는 사건 흐름(flow of event) 상의 단일 스텝(step)이라는 원칙을 설정하게 되면 일관된 설계 작업을 수행할 수 있다. 그러한 설계 전략을 위 <그림 6> 위에 상징적으로 표현해 보면, <그림 7>과 같이 도식할 수 있을 것이다.

사용자 삽입 이미지
<그림 7> 다이어그램 간의 추상화 수준 조정


지금까지 UML 1.4를 중심으로 모델의 추상 수준이라는 원리에 대해 살펴보았다. 그러한 모델의 추상 수준이라는 핵심 메커니즘은 본질적으로 UML 2.0이라고 해서 다르지 않다. 앞선 <그림 1>과 <그림 7>을 언뜻 비교해 보아도 UML 2.0에서는 표준 다이어그램의 개수로도 UML 1.4에 비해 수적으로 많이 늘어났으며(<그림 4>에서 빨간색으로 표시된 다이어그램), 이전부터 있었던 몇몇 다이어그램들은 명칭이 변경됐고(<그림 4>에서 초록색으로 표시된 다이어그램), 무엇보다도 전반적으로 모든 다이어그램들이 보다 섬세한 설계자의 의도를 반영할 수 있도록 세부적인 표기들이 많이 추가되고 세분화됐다. 즉, 사용할 수 있는 다이어그램 선택의 폭(width)이 넓어졌고, 설계자의 의도를 보다 정밀하게 반영할 수 있는 깊이(depth)도 깊어졌다.

원칙 셋, 모델 자체의 완성도를 높이자
앞서 소프트웨어 업계에서 최근 발생하고 있는 현상들을 통해 잠시 언급했지만, UML 관련 국내외 포럼이나 협회들을 중심으로 UML 자체 혹은 설계 능력 인증 제도가 점차 많아지고 있다. 필자가 인증 제도의 본질적인 목적이나 그 가치 자체를 부정하는 것은 아니지만, 올해 사회적으로 충격을 던져 주었던 대입 수능 시험에서의 대량 부정 사태라든지, 얼마 전부터 공공연하게 제기됐던 영어 관련 인증 제도 등에서 발생하고 있는 문제점 등에 비추어 UML 인증 제도에서도 충분히 발생할 수 있는 그 변별력 문제에 대해 우려를 감출 수 없다.

그러나 다행히도 UML 2.0이 가지고 있는 그 강력한 표현력(semantic expressiveness)과 섬세함(elements precision) 그리고 다이어그램들간의 유기적 연결성 지원(support for diagram interchange) 능력으로 인해 인증서를 가지고 있다고 들먹이지 않아도 모델 결과물 자체로 그 완성도를 검증(self verification)할 수 있다. 즉, 모델 결과물만으로도 충분히 설계자의모델링 역량을 충분히 증명할 수 있는기반을 제공하고 있는 것이다.

UML 2.0이 공식으로 발표되기 이전 특정 케이스 도구들을 중심으로 시도됐지만 UML 1.4의 제약으로 그 실효성(efficiency)을 의심받았던 코드 자동 생성(automatic code generation) 기능은 케이스 도구들이UML 2.0 엔진으로 교체함으로써 그 완성도를 높일 수 있게 됐다. 더 나아가 UML 2.0이 내포한 그 풍부한 표현력과 정교함은, 특정 플랫폼에 종속적인 코드를 생성해 내기 이전에 케이스 도구의 도움을 통해 모델들만을 가지고 사전에 시뮬레이션마저도 어려운 문제가 되지 않는다.

앞으로의 전망
지금까지 개발자들은 새로운 기술이나 제품이 출시되면, 여기저기서 화려한 수식어와 찬사로 밝은 미래를 전망하는 이야기에 너무나도 익숙해져 있다. 1997년 UML 1.1이 처음 세상에 나왔을 때도 마찬가지였다. 그런 맥락에서 단순히 UML 2.0이라는 새로운 패러다임에 무조건 주목하자고 주장하고 싶지는 않다. 실리에 밝은 국내외 소프트웨어 업체들과 협회들의 행보와 여러 가지 상황을 종합해 보아도 UML 2.0이 소프트웨어 산업계에 미칠 파장의 크기는 실로 엄청날 것으로 예상된다.

그것이 더 이상 거스를 수 없는 현실이라면 그러한 도전에 수동적으로 대처할 것인가, 아니면 능동적으로 대처할 것인가의 문제는 독자 스스로 선택할 문제이다. 혹시 이솝 우화에 나오는 거짓말하는 늑대 이야기에서처럼 중요하다는 말을 너무 자주 들어 개발자들이 UML의 중요성을 공허한 메아리 정도로만 치부하고 지나칠까 걱정될 뿐이다.@

* 이 기사는 ZDNet Korea의 제휴매체인마이크로소프트웨어에 게재된 내용입니다.

 

사용자 삽입 이미지

 

원문 :http://www.zdnet.co.kr/techupdate/lecture/etc/0,39024989,39134178,00.htm

 

원문 :http://www.zdnet.co.kr/techupdate/lecture/etc/0,39024989,39134557,00.htm

  Comments,     Trackbacks
[UML 제대로 알기] ② 초보자를 위해 다각도로 살펴본 UML

[UML 제대로 알기] ② 초보자를 위해 다각도로 살펴본 UML

 

연재순서
1회.가능성·확장성 품고 등장한 UML 2.0
2회.초보자를 위해 다각도로 살펴본 UML
3회.바로 알고 제대로 쓰는 UML 실전 모델링
4회.닷넷 환경에서 UML 툴 활용 가이드
5회.표준을 넘나드는 UML의 적절한 사용

 

7년 전 필자는 UML이라는 단어조차 들어본 적 없었다. 국내에서는 그래도 꽤 잘하는 비주얼 베이직 프로그래머라고 자부했는데 당시 봇물같이 쏟아지던 약어들에 질려 UML이라는 알파벳 세 글자로 이루어진 '신규어'에 별 신경을 쓰지 않았다.

몇 년이 지난 후, 필자도 객체지향이라는 무림 강호에 몸을 던지지 않을 수 없는 시점에 이르러서, 그 몇 년 전에 들었던 UML이라는 것이 무림에 출사표를 던지기 위한 필수 무공이었다는 사실을 깨달았다. 그리고 그 이름도 원망스러운 디자인 패턴!

비주얼 베이직이라는 한물간 초식에서는 ‘꽤’ 강자라고 생각했던 필자는 객체지향이라는 드넓은 무림에 발을 들여서는 초고수가 되어야 되겠다는 결심을 했고, 높은 내공을 쌓기 위한 필수 비급이라는 UML과 디자인 패턴을 익히기 시작했다. 그러면서 필자가 느낀 것은? ‘초고수는 아무나 하는 것이 아니구나’하는 것이었다.

필자는 디자인 패턴에 한이 맺힌 사람이다. 디자인 패턴을 며칠 밤씩 새워 가면서 공부할 때 느낀 고통은 이루 말할 수 없다. 가끔씩 감동을 느낄 때도 있었지만 대부분의 경우가 이해하기 힘들고 패턴에 따라 프로그램을 작성하기는 더 힘든 경우가 많았다.

결국은 객체지향에 대한 기초 지식이 부족하기 때문이라는 사부님의 조언을 듣고는 HTDP와 SICP 등의 패러다임 입문서, 리스코프나 메이어 등의 객체지향 이론서 등을 짧은 영어 실력에 열심히 번역하며 읽었다. 객체지향 디자인을 제대로 이해하기 위해서는 UML은 필수사항이었고, UML에 관련된 책도 열심히 사서 읽었다. 그때부터 필자의 머릿속에는 이상한 고정 관념이 생기기 시작했다.


"디자인 패턴도 모르는 개발자가 무슨 개발을..."
"UML은 자유롭게 쓸 수 있어야 개발을 한다고 할 수 있지..."


결국은 내공이 좀 쌓이고, 디자인 패턴과 UML을 어렵지 않게 응용해서 프로그램을 짤 수 있는 수준이 되었을 무렵에, 필자는 병적으로 디자인 패턴과 UML에 집착하기 시작했다. 래쇼날 로즈 등의 케이스 툴을 사용해 설계를 하고 있으면, 화면에 보여 지는 여러 예쁜 아이콘들을 보면서 ‘아, 나는 살아 있구나’하는 존재의 가치를 느끼곤 했다.

그렇게 열심히 익힌 기술들을 이용해서 프로그램을 열심히 개발하던 어느 날 밤, 필자는 어떤 의문을 가지게 되었다. 왜 내가 동작하는 코드를 개발하지 않고 그림을 그리고 있을까? 프로그램을 작성하는 목적이 잘 동작하는 프로그램을 작성하는 것이지 출력해서 벽에 걸어놓을 미술 작품을 만들고자 하는 것이 아니지 않은가?

필자는 플라톤의 동굴의 비유에 비견될 만한 엄청난 진리를 깨달았다. UML이든, 디자인 패턴이든 꼭 필요한 부분에만 사용하면 되는 것이고, 프로그램을 작성하기 전 개념을 잡거나 최종적으로 정리하는데 유용한 도구, 특히 UML은 개발자들 간의 상호 커뮤니케이션에 아주 유용한 도구가 될 수 있다는 것을 알게 되었다.

필자는 UML 케이스 툴을 만드는 업체에 근무하는 개발자 몇 명을 잘 알고 있다. 대학원에서 꽤 실력을 쌓아 어렵게 취업한 후배들인데, 업체에 근무한지 3개월쯤 되면 이런 말을 한다.


"UML에 이렇게 많은 것들이 있는 줄 몰랐어요. 무척 힘드네요"


1년쯤 근무하면 이런 말들을 한다.


"개발자라면 UML은 반드시 알아야죠. UML의 구석구석을 모르고 어떻게 제대로 된 프로그램을 작성할 수 있습니까?"


3년쯤 근무한 후배는 이런 말을 한다.


"UML요? 꼭 쓸데만 쓰면 되지 오버해서 쓰면 나중에 감당 못하죠"


악순환의 반복이랄지, 디자인 패턴과 UML이 남긴 폐해랄지, 이런 현상은 매년 계속된다.

아키텍트 입장에서 UML
필자가 조선 업계에서 근무할 때, 새로운 시리즈를 시작할 경우(배는 하나의 설계로 여러 척을 찍어낸다) 먼저 모형을 만들어서 테스트를 하는 것을 본 적이 있다. 모형을 만들어 수영장 같은 곳에서 테스트를 해 보고 실제로 배가 목표한 만큼의 성능을 낼 수 있는지 테스트 한다. 또한, 배를 설계할 때 거대한 캐드 시스템으로 설계한 후 파도와 바람 등에 견딜 수 있는지를 테스트한다.

배를 만들 때는 엄청난 비용과 시간이 소모되기 때문에 모형을 만들거나 컴퓨터상에서 수치로 테스트한다. 컴퓨터로 만들건, 정말 모형을 만들건, 그렇게 만들어진 것을 모델이라고 하고, 대부분의 경우 모형을 만드는 비용이 실제 배를 만드는 것보다 비용이 훨씬 적게 소모되므로 모델 테스트를 한다. 이런 모델을 만들어 테스트 해보는 과정을 ‘모델링’이라고 부른다.

배를 지을 때도 선실의 세부 구조나 엔진의 동작들은 모델링하지 않는다. 모델링이라는 것은 어떤 것이 실제로 잘 동작하는지를 알아보려고 만드는 것이다. 실제 크기대로 배를 지어 바다에서 항해해 가며 파도와 바람의 영향을 최소화하거나 풍랑에 버틸 수 있을지를 테스트 해 본다는 것은 비용이 너무 많이 드는 일이다. 모델을 만드는 이유는 모델을 만드는 비용이 실제 물건을 만드는 것보다 훨씬 적은 비용으로 설계가 제대로 되었는지 알고 싶어서이다.

소프트웨어를 만들 때도 이와 같은 이치가 적용된다. 하지만 소프트웨어를 설계할 때 사용하는 이 UML이라는 것은 조선 엔지니어나 토목 엔지니어들이 모델링을 하기 위해 사용하는 미니어처나 캐드 모델과 비교해 볼 때 훨씬 비효율적이고 테스트하기 곤란하다. UML 다이어그램에는 다른 공학 모델과 비교해 보았을 때 확고한 시험 기준을 세우기도 곤란하고 평가를 내릴 때도 주관적인 관점이 상당부분 차지할 수 밖에 없다.

조선이나 건축에서 모델을 만드는 것은 실제 배나 건물을 짓는 것과 비교할 때 비교도 할 수 없을 만큼의 적은 비용이 들지만, 소프트웨어를 설계하는 입장에서 실제 프로그램을 작성하는 것과 UML을 사용한 설계를 비교했을 때 비용적인 측면에서나 생산성적인 측면에서나 그렇게 차이 나지 않는다.

사실, UML을 사용해서 테스트하는 것보다 소스코드를 직접 수정하는 것이 비용이 훨씬 적게 들고 손쉬운 경우도 있다. 개발자의 입장에서는 더욱 그러하다. 하지만 UML을 사용해야 하는 이유는 무엇일까? 잘 사용하면 비용 절감의 효과를 가져 올 수 있고, 포괄적인 설계가 가능하다는 것이다.

UML 다이어그램이라는 것은 앞서 이야기 했듯이 다른 공학에 비해 모델을 사용했을 때 실제 건축물(소프트웨어에서는 실제 동작하는 코드)을 작성하는 것보다 비용이 명확하게 절약되는지가 명확하지 않다. 필자는 실제 프로그램을 작성하는 것보다 UML 다이어그램을 작성하는 것이 훨씬 시간이 많이 드는 경우를 허다하게 봤다(사실 그렇게 하지 않으면 제대로 된 프로그램이 나오지 않는 경우가 대부분이다).

UML 다이어그램은 세부적인 설계를 하기 보다는 포괄적인 설계를 구성하였을 때 그 전체적인 비용의 절감 효과를 가져 올 수 있다. 세부적인 그림을 UML 다이어그램으로 표시하기 보다는 전체적인 그림을 UML 다이어그램으로 표시하고 세부적인 표현은 코드로 작성하는 등의 탄력성 있는 설계 운영이 전체를 UML로 설계하는 것보다 훨씬 나은 효율을 가져올 수 있다는 것이다.

실제로 아키텍트들의 설계는 이러해야 한다. 아키텍트들은 UML 다이어그램을 세부적으로 표현하기 보다는 전체적인 그림을 그리고, 그린 그림이 실제 소프트웨어로 동작했을 때 바르게 동작할 수 있을 것인지를 개발자들과 토론하고 설계를 수정한다.

필자는 프로젝트를 시작할 때 전체 소프트웨어의 요구사항을 격자 형태로 나누고 각 부분을 개개의 개발자들에게 할당하는 경우를 본 적이 있다. 큰 부분으로 나뉜(이 큰 부분으로 나누는 것조차 PM급의 아키텍트가 하지 않는다. 그러한 큰 부분은 대 부분의 기업형 응용 프로그램이라면 부서별 또는 업무별로 자연스럽게 할당되어 있기 마련이다) 업무 분할대로 각 개발자가 ER-Diagram부터 클래스 다이어그램, 컴포넌트 다이어그램까지 작성하는 경우를 실제로 본 적이 있다.

큰 수정 없이 프로젝트가 진행되어 다행이었지만, 한 부분이라도 어긋난 부분이 있었다면 엄청난 비용이 소모되었을 것이다(사실 그렇게 작성된 프로그램은 전체적인 소프트웨어의 부품이 유기적으로 동작하는 소프트웨어가 아니고 각 부품이 각기 따로 동작하는 작은 프로그램들의 집합일 수밖에 없고, 실제로도 그러했다).

개발자 입장에서 UML
자, 이제 개발자 입장에서 UML을 생각해 보자. 실제로 개발자가 UML 다이어그램의 모든 부분을 다 알아야 하는가? 개발자가 프로그램을 작성하기 위해서 UML의 메타 모델을 모조리 이해하고 각 프로젝트와 다른 케이스 도구들에서 쓰이는 스테레오 타입들을 다 알아야 한다는 것이다.

필자는 여기에 반대한다. 필자는 주로 닷넷 기술들을 가지고 소프트웨어를 작성하고 강의하고 컨설팅을 수행하는데, 사실 닷넷 기술은 너무 빠른 속도로 변화하고 있다. 곧 출시될 비주얼 스튜디오 2005와 MS-SQL 서버 2005는 닷넷 프레임워크 2.0을 기반으로 하는데, 닷넷 프레임워크 2.0은 1.1 버전과는 상당히 다른 모습을 보여준다.

C#이나 비주얼 베이직 닷넷 같은 언어적인 측면에서만 봐도, 겉으로 보기에도 제네릭(Generic)이 포함되는 등 상당히 많은 부분이 변하였다(필자는 이 부분에서 상당히 불만이 많다. MS는 이런 부분을 발표만 하고는 다른 이야기가 없다.

여러 잡지에 소개되는 글들을 봐도 이런 기능들이 추가되었다. 이런 내용만 있지 실제적으로 테스트 해 볼 수 있는 코드를 제시하거나 근본적인 변화를 이야기하는 경우는 드물다). ASP.NET 2.0만 해도 ASP.NET 프레임워크가 전체적으로 변화한 부분도 몇 군데 있을 뿐더러 사용자 정의 컨트롤이 상당히 많이 추가되고 변화함으로 인해서 새로 익혀야 할 부분이 늘어났다.

사용자 삽입 이미지



ADO.NET도 마찬가지다. 개발자의 부담은 가중되고 실제적으로 필드에서 사용되어야 할 코드와 컨트롤들의 사용법을 익히는 것과 UML의 전체적인 내용을 학습하는 것 사이에서 갈등하게 된다.

디자인 패턴도 이럴 때 부담이 된다. 개발자 누구나가 디자인 패턴과 UML을 사용할 수 있어야 하고 열심히 학습해야 한다는 것은 알고 있지만, 현실적으로 당장 사용하여야 할 요소 기술과 끝이 보이지 않는 기반 기술을 사이에 두고 갈등하다 보면 당연히 당장 사용하게 되는 요소 기술 쪽으로 치우칠 수밖에 없다.

이럴 때 누군가에게 "UML을 조금 알아야 되겠는데 어떤 책을 봐야 되겠습니까?"라고 물어보면 그 누군가는 책을 산더미처럼 던져주고(보통 이런 경우에 이유 없이 원서를 권하는 경우가 많다. 안 그래도 바빠 죽겠는데 원서가 포함된 책 뭉텅이를 받은 개발자의 입에서는 욕 빼고는 나올 것이 없다) 이 책의 내용들을 거의 다 숙지해야 제대로 쓸 수 있다는 교과서의 화신 같은 이야기를 하게 된다. 사실, 이 말은 격무에 시달리는 개발자들에게 UML을 공부하지 말라는 이야기와 동일하게 밖에는 안 들린다.

개발자들은 프로젝트에 투입될 때 UML의 어떤 부분을 알아야 하는가? 사실 UP의 모든 부분을 다 안다는 것은 업무 형태와 업무량으로 볼 때 거의 불가능 하다고 볼 수 있다. 그렇다고 UML을 전혀 모르는 상태에서 개발에 투입되었다면 그 개발자의 앞길은 십자가를 지고 골고다 언덕을 오르는 예수님의 모습처럼 보일 것이 뻔하다. UML을 효과적으로 사용하기 위한 효과적인 길을 알아보자.

의사소통 수단으로서 UML
초보 개발자라면, 우선 UML의 표기법에 익숙해져야 한다. 이렇게 생긴 아이콘은 클래스고, 이렇게 생긴 화살표는 실제화고(물론 실제화를 이해하기 위해서는 객체지향을 이해하여야 한다는 원론적인 이야기를 피하기는 힘들다. 산 너머 산이다) 이렇게 생긴 화살표는 집단화이고 등의 표기법(Notation)을 익히는 것이 중요하다. 개발은 혼자 하는 것이 아니기 때문이다. UML은 개발자들끼리 설계 개념에 대한 의견을 주고받을 때 굉장히 편리한 도구로 사용될 수 있다. UML의 표기는 매우 명확한 의미를 전달해 줄 수 있다.

개발 경로로서의 UML
UML은 기업 형 소프트웨어를 작성할 때 구조의 개발 경로를 작성할 때 유용하다. PM이 이렇게 개발해라 하는 지시를 내리면 사실 그 지시라는 것은 추상화 된 개념이라서 바로 프로그램으로 옮기기가 곤란한 경우가 대부분이다. 이런 경우, 어떤 객체를 먼저 작성하여야 하고 어떤 객체는 어떤 객체에 의존하고 하는 식의 로드맵이 필요한데, UML은 이런 도구로서도 훌륭하다.

개발 경로로서 UML 다이어그램을 활용하려 한다면, 클래스 다이어그램, 객체 다이어그램, 시퀀스 다이어그램, 협력 다이어그램을 읽을 수 있고 작도할 수 있어야 한다. UML 표기법을 완벽하게 익힐 필요까지는 없을 테고, 적당히 다른 사람과 상호 통신할 수 있을 정도의 수준이면 충분하다.

스테레오 타입 등은 잘 알아야 하지 않느냐고? 처음엔 잘 몰라도 된다. "<<", ">>"가 붙은 기호는 스테레오 타입이라고만 아는 것으로 충분하다. UML이라는 것은 쓰다보면 이해가게 되어있는 아주 신기한 물건이다.

언제 다이어그램을 그려야 하는가?
UML은 도구일 뿐 그 자체가 목적이 되어서는 안된다. UML이 목적이 되는 경우도 물론 있긴 하다(대부분의 경우 UML이 목적이 되는 경우는 작성된 소프트웨어가 클라이언트 또는 감리에 의해 검수 받을 때뿐이다). UML을 남용하는 것은 소프트웨어 개발에 큰 걸림돌이 될 수 있다. 하지만 남용하지 말고 아껴서 사용한다면 큰 도움을 줄 수 있다. 예전의 ‘약 좋다고 남용 말고..."라는 표어는 UML에서 그대로 통한다.

다이어그램을 그려야 하는 경우 어떤 지침을 따르는 것이 좋을까? 모든 개발자들이 설계에서 특정한 부분의 구조를 이해해야 할 경우 다이어그램을 그리는 것이 좋다. 그림이 완벽할 필요는 없다. 모든 개발자들이 이해했다고 생각되면 그만 그리면 된다.

개발자들 간에 구조에 대한 분쟁이 일어날 경우 그림을 그리고 그림을 판독할 수 있는 중재자를 구할 때. UML 다이어그램은 아주 명확한 의미를 전달 할 수 있기 때문에 같은 생각이지만 다른 말을 통일시켜주는 역할을 할 수 있다. 새로운 아이디어를 떠올리고 그 아이디어를 주위 개발자 또는 상급자에게 칭찬받고 싶을 때 UML 다이어그램을 작성한다. 말로 떠드는 것보다 한번 보여주는 것이 200%의 효과를 발휘한다.

“백문이 불여일견”일 필요가 있을 때 UML 다이어그램을 작성한다. 그리고 마지막으로 클라이언트에게 ‘있어 보이는’ 문서를 보여줘야 할 필요가 있을 때 작성한다. 부차적인 설명이 없이도 다들 이해하리라 믿는다.@

* 이 기사는 ZDNet Korea의 제휴매체인마이크로소프트웨어에 게재된 내용입니다.

 

김상훈 (동명정보대학 정보기술원 연구원)

2005/03/22

 

사용자 삽입 이미지

 

원문 :http://www.zdnet.co.kr/techupdate/lecture/etc/0,39024989,39134386,00.htm

  Comments,     Trackbacks
[메타 사이트 만들기] ② RSS 수집 로봇 구현·분석

[메타 사이트 만들기] ② RSS 수집 로봇 구현·분석

 

연재순서
1회. 블로거들의 집합소「메타 사이트 구현」
2회. RSS 수집 로봇 구현과 문제점 분석

 

이번 글은 지난번에 이은 메타 사이트 만들기 강좌 마지막 편으로 XML 파일을 이용하여 RSS 주소들의 목록을 관리하는 클래스의 제작, RSS 파일들로부터 읽은 정보들을 데이터베이스에 저장하는 방법에 대해 알아보겠습니다. 그리고 그를 구현하는 테이블, 저장 프로시저, 클래스들을 제작하고, 간단한 RSS 수집 로봇 프로그램을 제작해 보도록 하겠습니다.

자동차는 수많은 부품들을 각각 생산하여 설계도에 맞게 각각을 연결하고 조립하는 과정을 통해 만들어집니다. 우리가 만들고자 하는 메타 사이트도 핵심 부품들을 하나하나 만들고 마지막에 그러한 각각의 부품들을 조립하여 우리가 원하는 하나의 기능을 수행하는 프로그램을 완성하는 단계로 진행되고 있습니다. 지난 글을 통해 우리는 다음과 같은 내용을 진행하였습니다.


[1] 메타 사이트는 RSS 파일로부터 블로그의 정보를 얻는다는 사실을 이해한다.
[2] RSS 파일의 구조에 대해서 공부한다.
[3] RSS 파일의 내용을 저장할 클래스를 제작한다.
[4] RSS 파일로부터 내용을 읽어오는 RssReader 클래스를 제작한다.


이번 글은 지난 시간에 이은 메타 사이트의 부품 만들기 강좌 마지막 편으로 RSS 주소들을 저장하는 클래스와, XML 파일을 이용하여 RSS 주소들의 목록을 관리하는 클래스의 제작, RSS 파일들로부터 읽은 정보들을 데이터베이스에 저장하는 방법과 그를 구현하는 테이블, 저장프로시저, 클래스들을 제작하고 간단한 RSS 수집 로봇 프로그램을 만들어 보도록 하겠습니다.

RSS 파일들의 주소들을 관리하자
지난 호를 통해 한 개의 파일 또는 주소로부터 RSS 정보를 읽을 수 있는 RssReader 클래스가 완성되었습니다. 남은 문제는 여러 RSS 주소들을 관리하는 작업입니다. 이러한 작업은 데이터베이스를 이용하면 손쉽게 제작할 수 있지만, 데이터베이스를 이용하는 방법은 이후 RSS 파일의 내용들을 기록할 때 접할 예정이니, 우선은 XML 파일을 이용하여 저장하는 방법으로 RSS 주소들의 리스트를 관리해 보도록 하겠습니다.

RSS 주소들을 관리하기 위해서는 RSS 주소와 더불어 사이트에 대한 간략한 설명과 부가적인 자료들이 포함되면 됩니다. 예를 들어 블로그의 이름 또는 블로그의 종류 등 RSS 주소를 보고 이해하기 쉽도록 추가할 수 있습니다. 지면상 가장 간단하게 RSS 파일의 경로와 블로그의 제목 정도만 가지고 있는 클래스를 만들어 보도록 하겠습니다.

Public Class RssAddress
    Public RssURL As String
    Public BlogName As String

    Public Sub New()
    End Sub

    Public Sub New(ByVal RssURL As String, ByVal BlogName As String)
        Me.New()
        Me.RssURL = RssURL
        Me.BlogName = BlogName
    End Sub
End Class

아무런 작업을 하지 않는 기본 생성자와 데이터를 입력하며 객체를 생성하기 편리하게 하기 위해 RSS 파일의 주소와 블로그의 이름을 인자로 받는 생성자가 있습니다. 여기서는 아무런 작업도 하지 않는 기본 생성자를 굳이 선언한 이유가 있습니다.

우리는 RSS 정보들을 저장하기 위해서 XML 파일을 사용하며 아주 간편하게 XML 파일로 만들기 위해 직렬화(serialization)를 사용하려고 합니다. 이를 위해 닷넷 프레임워크에서 직렬화를 지원하는 System.Xml.Serialization.XmlSerializer 클래스를 이용하려고 하는데, 어떤 객체를 직렬화하기 위한 조건 중 하나가 객체는 반드시 기본 생성자를 가지고 있어야 한다는 것입니다. 일반 생성자에 Optional을 사용하여 기본 값을 지정해 주는 생성자를 만들어도 직렬화는 되지 않습니다.

이렇게 한 개의 RSS 파일의 정보를 가지고 있는 RssAddress 클래스가 완성되었습니다. 이제 다수의 RssAddress들을 저장할 컬렉션 클래스를 만들어야 합니다. CollectionBase 클래스를 상속받고, 인덱서와 메쏘드 등을 구현하여 컬렉션 클래스를 만드는 방법은 지난 호에서 RssItemCollection 클래스를 통해 소개했습니다. 그와 같은 방법으로 RssAddressCollection 클래스를 만들어줍니다. 그리고 여기에 XML 파일로부터 손쉽게 데이터를 불러오고, XML 파일로 손쉽게 저장할 수 있는 2개의 메쏘드를 추가하려고 합니다.

 <리스트 1> RssAddressCollection 클래스
사용자 삽입 이미지

Imports System.IO
Imports System.Xml.Serialization

Public Class RssAddressCollection
    Inherits CollectionBase

    Public Shared Function LoadFromXml(ByVal XmlFileName As String) As RssAddressCollection

        Dim serializer As New XmlSerializer(GetType(RssAddressCollection))
        Dim rssAddrs As RssAddressCollection
        Dim sr As New StreamReader(XmlFileName)
        rssAddrs = serializer.Deserialize(sr)
        sr.Close()

        Return rssAddrs

    End Function

    Public Shared Sub SaveToXml(ByVal XmlFileName As String, ByVal RssAddrs As RssAddressCollection)

        Dim serializer As New XmlSerializer(GetType(RssAddressCollection))
        Dim sw As New StreamWriter(XmlFileName)
        serializer.Serialize(sw, RssAddrs)
sw.Close()

    End Sub
    ...
    Collection 구현 관련 내용은 생략
    ...
End Class
사용자 삽입 이미지

추가한 메쏘드들은 Shared 키워드를 이용하여 객체를 생성하지 않아도 사용할 수 있도록 선언하고 있습니다. SaveToXml 메쏘드는 인자로 파일명과 RssAddressCollection을 받아 이를 해당 파일로 클래스의 직렬화 결과를 저장합니다. 그리고 LoadFromXml 메쏘드는 인자로 받은 파일로부터 역직렬화된 RssAddressCollection 클래스를 반환해 줍니다.

이들을 이용해서 손쉽게 객체를 XML 파일로 만들거나, 이미 저장되어 있는 XML 파일로부터 객체를 생성할 수 있습니다. 이렇게 만들어진 클래스들은 다음과 같은 방법으로 사용해볼 수 있습니다.


' RSS 주소들을 추가하고, XML 파일로 저장
Dim rssaddrs As New RssAddressCollection
rssaddrs.Add(New RssAddress("http://php.chol.com/~ppk314/tt/index.xml", "하늘이네 블로그"))
rssaddrs.Add(New RssAddress("http://namida.pe.kr/tt/index.xml", "나미다님의 블로그"))
RssAddressCollection.SaveToXml("MyRssAddressCollection.xml", rssaddrs)

' XML 파일로부터 객체를 생성
Dim loadedRssAddrs As RssAddressCollection = RssAddressCollection.LoadFromXml("MyRssAddressCollection.xml")


이제 RssReader 클래스를 함께 이용하여 RSS 주소들로부터 내용을 읽어와서 콘솔에 표시하는 간단한 프로그램을 제작해 보도록 하겠습니다. 테스트에 사용할 RSS 주소들은 앞의 RSS 주소들을 XML 파일로 저장하는 예제에서 생성한 MyRssAddressCollection.xml을 이용하도록 하겠습니다.

 <리스트 2> RSS 파일들로부터 내용을 읽어 표시하는 프로그램
사용자 삽입 이미지

Dim rssAddrs As RssAddressCollection = RssAddressCollection.LoadFromXml("MyRssAddressCollection.xml")

Dim rssReader As New RSSReader
For addrIndex As Integer = 0 To rssAddrs.Count - 1
    Console.WriteLine(rssAddrs(addrIndex).BlogName + " 블로그의 글 목록입니다.")
    rssReader.XmlAddress = rssAddrs(addrIndex).RssURL
    rssReader.readItems()

    For itemIndex As Integer = 0 To rssReader.Items.Count - 1
        Console.WriteLine(rssReader.Items(itemIndex).PubDate.ToString("[MM:dd HH:mm] ") + rssReader.Items(itemIndex).Title)
    Next
Next
사용자 삽입 이미지

<리스트 2>를 실행하면 각각의 주소들로부터 RSS 파일을 불러와서 다음과 같이 결과를 표시해 주게 됩니다.


하늘이네 블로그 블로그의 글 목록입니다.
[11:09 11:25] 생각만으론 바뀌지 않는다.
... 생략 ...
나미다님의 블로그 블로그의 글 목록입니다.
[11:09 15:14] BRIDGET JONES: THE EDGE OF REASON
... 생략 ...


여기까지의 과정을 통해서 우리는 RSS 파일 주소들로부터 모든 정보를 얻어오는 과정까지 완성하게 되었습니다. RSS 수집 로봇 제작에 있어서 가장 바탕이 되는 처리 부분을 완성한 것입니다.

RSS의 내용을 정리하자
RSS 파일들로부터 블로그의 모든 내용들을 가져오는 과정까지 완성하게 되었습니다. 이제 이러한 블로그의 내용들을 하나로 정리하는 작업만을 남겨두고 있습니다.

정리한다는 것의 의미는 이렇게 볼 수 있습니다. 내용들 중에서 새롭게 업데이트된 내용과 이전의 내용들을 분류해내고, 각각의 데이터들을 각각 다른 기준으로 저장하는 것과 많은 블로그들의 각 글들의 남다른 기준은 무엇일까요? 그 글만이 가지는 유일한 정보 말입니다. 날짜나 제목도 있을 수 있겠지만 그것들은 다른 글이라고 하더라도 같을 수 있는 가능성이 있습니다. 하지만 웹에서 그 글을 표시하는 주소는 단 1개뿐이겠지요?

그리고 혹시라도 RSS 주소들의 리스트에 같은 RSS 파일이 여러 개가 저장되는 문제가 생기더라도 주소를 기준으로 저장한다면 같은 글이 2개로 저장되는 문제는 발생하지 않게 됩니다. 이러한 내용들을 바탕으로 RSS 파일의 내용들을 저장할 데이터베이스 테이블을 만들어보도록 하겠습니다.

사용자 삽입 이미지
<표 1> RSS 내용을 저장할 Rss_Datas 테이블


테이블의 구조는 RssItem과 비슷한 모양을 가지고 있습니다. 여기에 Link와 PubDate에 인덱스를 걸어주도록 하겠습니다. 차후에 주소를 기준으로 데이터를 자주 불러오고, 날짜순으로 정렬을 많이 시도할 예정이기 때문입니다. 여기에 차후 부가적인 내용들을 추가하면 되지만 이 시간에는 가장 기본적인 내용들을 기준으로 만들어 보았습니다.

이제 이렇게 만들어진 테이블에 간편히 데이터를 동기화할 수 있는 저장 프로시저 한 개를 만들어 보도록 하겠습니다. 이 저장프로시저는 인자 값으로 RssItem의 내용을 주면 데이터베이스와 동기화하게 됩니다. 즉 데이터베이스에 이미 존재하는 경우 내용을 업데이트하고, 존재하지 않는 경우 새로운 글을 추가하게 됩니다. 차후 동기화에 따른 몇 가지 조건들을 추가하고자 할 때에도 이 저장 프로시저를 통해 만들면 됩니다. 우선은 가장 기본적인 동기화 프로시저를 만들어보도록 합시다.

 <리스트 3> RSS 정보를 데이터베이스와 동기화하는 저장 프로시저
사용자 삽입 이미지

CREATE PROCEDURE sp_Rss_DataSync
@Link varchar(200),
@PubDate smalldatetime,
@Title varchar(200),

@Author varchar(50),
@Description text
AS
    DECLARE @OldLink varchar(200)
    SELECT @OldLink = Link FROM Rss_Datas
    WHERE Link = @Link

    IF @OldLink IS NULL
        BEGIN
            INSERT INTO Rss_Datas(Link, GroupIdx, PubDate, Title, Author, Description)
            VALUES (@Link, @GroupIdx, @PubDate, @Title, @Author, @Description)
        END
    ELSE
        BEGIN
            UPDATE Rss_Datas SET
                PubDate = @PubDate,
                Title = @Title,
                Author = @Author,
                Description = @Description
            WHERE Link = @Link
        END
GO
사용자 삽입 이미지

해당 링크와 같은 글이 있는지를 체크하고 결과에 따라서 글을 저장하거나, 업데이트하는 간단한 쿼리 문장들을 사용한 저장 프로시저입니다. 차후에 동기화에 대한 여러 가지 기능들을 추가하고자 할 때 이 저장 프로시저만을 수정하면 됩니다.
간단한 예를 들면, 블로그에는 글을 쓰고 삭제하는 경우가 있습니다. 같은 내용인데 다시 정리해서 새롭게 쓰고자 하는 경우이지요.

이런 경우 같은 도메인이나 같은 블로그 주소이지만, 링크가 약간 달라집니다. 이런 경우 제목과 주소의 일부가 같은 경우 기존 글의 주소를 업데이트한다거나, 또는 시간대별로 동기화를 제한하는 기능 등을 들 수 있습니다. 이제 이렇게 만든 저장 프로시저를 쉽게 사용할 수 있는 RssItemSync 클래스를 만들어보도록 하겠습니다.

 <리스트 4> RssItemSync 클래스
사용자 삽입 이미지

Imports System.Data.SqlClient

Public Class RssItemSync
    Private sqlCon As SqlConnection

    Public Sub New(ByVal ConnectionObject As SqlConnection)
        sqlCon = ConnectionObject
    End Sub

    Public Sub ItemSync(ByVal Item As RSSItem)
        Dim isClosed As Boolean = False

        If sqlCon.State = ConnectionState.Closed Then
            isClosed = True
            sqlCon.Open()
        End If

        Dim sqlCmd As New SqlCommand("sp_Rss_DataSync", sqlCon)
        With sqlCmd
            .CommandType = CommandType.StoredProcedure
            .CommandTimeout = 180
            .Parameters.Add(New SqlParameter("@Link", SqlDbType.VarChar)).Value = Item.Link
            .Parameters.Add(New SqlParameter("@PubDate", SqlDbType.SmallDateTime)).Value = Item.PubDate
            .Parameters.Add(New SqlParameter("@Title", SqlDbType.VarChar)).Value = Item.Title
            .Parameters.Add(New SqlParameter("@Author", SqlDbType.VarChar)).Value = Item.Author
            .Parameters.Add(New SqlParameter("@Description", SqlDbType.Text)).Value = Item.Description
        End With
        sqlCmd.ExecuteNonQuery()

        If isClosed Then
            sqlCon.Close()
        End If
    End Sub
End Class
사용자 삽입 이미지

우선 이 클래스는 생성자로 SqlConnection을 받습니다. 그리고 ItemSync 메쏘드에서는 연결 객체가 닫혀 있는 경우 열고 작업을 하고 다시 닫아주고, 열려 있다면 열린 상태로 유지하도록 코드를 만들었습니다. 이는 이 메쏘드가 데이터 동화에서 여러 번 반복 사용되므로 연결?닫기의 작업을 반복하지 않게 하기 위해서 간단하게 구현해 보았습니다.

이제 여기까지의 완성된 각각의 클래스들을 이용하여 RSS 파일들로부터 데이터베이스와 동기화하는 프로그램을 간단히 만들어 보도록 하겠습니다.

 <리스트 5> RSS 정보를 읽어 데이터베이스와 동기화하는 RSS 수집 로봇
사용자 삽입 이미지

Dim rssAddrs As RssAddressCollection = RssAddressCollection.LoadFromXml("MyRssAddressCollection.xml")
Dim rssReader As New RSSReader
Dim sqlcon As New SqlClient.SqlConnection("[데이터베이스 연결 문자열]")
Dim ris As New RssItemSync(sqlcon)

Console.WriteLine(rssAddrs.Count + "개의 블로그의 싱크를 시작합니다.")
sqlcon.Open()
For addrIndex As Integer = 0 To rssAddrs.Count - 1
    Console.WriteLine(rssAddrs(addrIndex).BlogName + " 블로그를 싱크 시작")
    rssReader.XmlAddress = rssAddrs(addrIndex).RssURL
    rssReader.readItems()

For itemIndex As Integer = 0 To rssReader.Items.Count - 1
ris.ItemSync(rssReader.Items(itemIndex))
    Next
    Console.WriteLine(rssAddrs(addrIndex).BlogName + " 블로그 싱크 완료!")
Next
sqlcon.Close()
Console.WriteLine("전체 싱크가 완료되었습니다.")
사용자 삽입 이미지

여기에 시간대별로 반복해서 작업을 수행하게 하거나, MyRssAddressCollection.xml 파일을 메모장이 아닌 좀 더 쉽게 수정할 수 있는 방법만 만들어주고, 표현 계층을 멋지게 꾸미는 건 여러분들에게 맡기도록 하겠습니다. 멋진 RSS 수집 로봇을 완성해 주세요.

RSS 수집 로봇의 문제점
이번 강좌를 통해서 만들어본 RSS 수집 로봇은 RSS 파일을 읽고 관리하는 최소한의 기능들을 비교적 쉽게 구현하기 위해서 만들어진 프로그램입니다. 덕분에(?) 이 RSS 수집 로봇을 만들면서 여러 문제점들을 발견할 수 있었을 것입니다. 바로 RSS 파일을 일정 시간 간격으로 계속해서 읽는다면 네트워크 트래픽과 그것을 데이터베이스에 저장하는 과정에서 데이터베이스 처리량이 상당히 증가한다는 점인데요.

이러한 문제점들을 해결하기 위해서는 RSS 파일을 지금과 같이 RssTextReader 클래스를 이용하지 않고, HttpRequest, HttpResponse 클래스를 이용해서 RSS 파일을 읽는 방법을 사용하면 됩니다. 이 경우 파일을 요청할 때 HTTP 프로토콜에 있는 If-Modified-Since 필드를 사용하면 변경되지 않은 파일의 경우 데이터의 내용 대신에 헤더의 값만 넘어오게 되므로 트래픽은 물론 처리해야 할 데이터도 줄어들게 됩니다.

사용자 삽입 이미지
<그림1> RSS 내용을 저장할 Rss 수집로봇의 원리


그리고 RSS 파일의 주소가 몇 개 안 되는 지금 상태에서는 상관이 없지만, 100개가 넘어가는 경우 전체 RSS 파일을 싱크하는 시간은 점점 길어지게 됩니다. 하지만 자세히 살펴보면 데이터베이스를 처리하는 시간보다는 네트워크에서 파일을 불러오는 것에 상당한 시간이 소요되는 것을 볼 수 있습니다. 이 부분은 쓰레드를 이용하여 처리하면 더욱 빠른 속도로 싱크 작업을 할 수 있는 RSS 수집 로봇을 만들 수 있을 것으로 생각됩니다.

이밖에도 일정 시간 간격으로 올라오는, 흔히 ‘도배’라고 불리는 글들에 대해서는 싱크하지 않게 하는 방법 등 여러 가지 기능들에 대해서 생각해 보기 바랍니다. 여기까지 완성되었다면 ASP.NET을 이용하여 메타 사이트의 모습을 만드는 마지막 과정은 여러분에게 맡겨도 되겠지요?


메타 사이트 완성을 위해서 앞으로 해야 할 일들
[1] RSS 파일을 읽어오는 부분의 보완
[2] 싱크 기능을 멀티 쓰레드를 이용하여 처리하기
[3] 데이터베이스 싱크 기능의 강화(도배 방지 등의 기능)
[4] ASP.NET으로 웹 사이트 제작하기


더 멋진 메타 사이트를 꿈꾸다
아쉽게도 국내 3개 메타 사이트들의 기능은 모두 비슷합니다. RSS 파일을 읽고 그것을 표시해 주는 기본적인 기능들이죠. 메타 사이트의 등장은 오래 되었지만 아직도 메타 사이트는 걸음마 수준이라고 말하고 싶습니다. 이 말은 아직도 이 부분은 많은 실험과 도전 정신을 테스트해 볼 수 있는 미개척지란 말입니다.

이 강좌를 통해 메타 사이트를 만들기 위한 아주 기본적인 기술들을 익혔다면 이제 그것을 활용하여 지금까지 없었던 새로운 메타 사이트를 설계해 보는 것은 어떨까요? 저는 인터넷 강국 대한민국이 블로그에서도 강국이 되기를 바라며 오늘도 더 멋진 메타 사이트를 꿈꾸고 있습니다. 이제 여러분의 상상력을 보여주세요.@

* 이 기사는 ZDNet Korea의 제휴매체인마이크로소프트웨어에 게재된 내용입니다

 

박영욱 (Allblog.net 운영자)

2005/03/21

 

사용자 삽입 이미지

 

원문 :http://www.zdnet.co.kr/techupdate/lecture/dotnet/0,39024986,39134054,00.htm

  Comments,     Trackbacks
[UML 제대로 알기] ① 가능성·확장성 품고 등장한 UML 2.0

[UML 제대로 알기] ① 가능성·확장성 품고 등장한 UML 2.0

 

연재순서
1회.가능성·확장성 품고 등장한 UML 2.0
2회.초보자를 위해 다각도로 살펴본 UML
3회.바로 알고 제대로 쓰는 UML 실전 모델링
4회.닷넷 환경에서 UML 툴 활용 가이드
5회.표준을 넘나드는 UML의 적절한 사용

 

UML을 중심으로 소프트웨어 업계에서 벌어지는 경제적, 사회적 현상들을 알아보고 UML 2.0 발표 이후 소프트웨어 업계에 불어 닥칠파장에 대해 알아본다. 또한 UML 2.0에서 개발자들이 주목해야 하는 세부 내용도 간단히 검토해 보자.

UML 2.0의 실로 엄청난 중요성을 미리 알고 대비할 것인지, 뒷짐 지고 좀 더 지켜볼지는 이번 글을 보고 판단해 주기를 바란다.

필자는 지난 2004년 마이크로소프트웨어 8월호에 MDA 관련 글을 기고하던 당시부터 지금까지 필자의 소속 회사가 지난 10여 년간 전문적으로 개발해 오던 인적 자원 관리(HRM) 시스템에 대한 획기적인(?) 개선 방안으로 MDA 기반의 시스템 개발을 추진하고 있다. 필자가 본격적으로 UML 2.0을 검토하기 시작한 것도 8월을 전후해서였다.

그러나 회사에서 표준으로 사용하는 모델링 도구 제작 업체에서는 4개월 전만 해도 UML 2.0을 지원하지 않았고, MDA 패러다임을 표방하면서도 아쉽게도 그 요체인 UML 2.0은 그저 각종 문서나 자료들을 통해서만 접할 수 있었다. 인사 비즈니스 프로세스 개선 작업(BPI)과 같은 초기 설계 작업은 UML 1.4 기반으로 추진해야 했고, 올 연말로 예정됐던 도구 공급사의 차기 버전을 기대해야 하는 상황이었다.

그러던 얼마 전, 필자는 해당 업체로부터 UML 2.0을 충실히 지원하게 된 새 버전의 케이스 도구를 입수했다. 비록 필자가 이미 여러 책이나 자료들을 통해 UML 2.0을 검토했었음에도, 막상 본격적으로 UML 2.0 지원 모델링 도구를 설치하고 작업을 착수하려던 그 순간의 첫 느낌을 말로 하자면 막막함 그 자체였다.

그 모델링 도구의 새로운 버전이 완전히 개편된 새로운 사용자 인터페이스로 구성됐으며 내부적으로도 상당한 기술적인 패러다임 전환이 있었던 것도 한 원인이었겠지만, 무엇보다도 근본적으로 UML 2.0이 내포한 그 가능성과 확장성에 대한 놀라움과 설렘이 교차하면서 만들어낸 미묘한 흥분과 두려움이었다는 것이 적절한 것 같다. 1620년 메이플라워호를 타고 미지의 땅 아메리카에 첫 발을 내디뎠던 이주민들의 마음이 이렇지 않았을까?

UML의 사회적 파장
UML 2.0 발표와 더불어 개발자들이 주목해야 하는 세부 내용을 살펴보기 전에 우선, UML을 중심으로 소프트웨어 업계에서 벌어지는 경제적, 사회적 현상들을 통해 향후 UML 2.0 발표 이후 소프트웨어 업계에 불어 닥칠 파장에 대해 미리 가늠해 보는 시간을 가져 보기로 하겠다.

IT 시장 변화에 주목하자
이 시대 소프트웨어 산업에 종사하는 사람이, 딴 세상에 사는 사람(beings in heaven)이 아닌 이상, 자본주의 시대를 살아가는 현대인으로서 공급과 수요를 결정하는 시장 논리로부터 자유로울 수는 없다.

우리는 종종 뛰어난 기술력을 갖추고 있음에도 망하는 반면, 특별한 기술력을 가지고 있지 않음에도 번창하는 사람이나 기업을 종종 목격하곤 한다. 즉, 기술력이 곧 성공을 의미하지는 않는다. 마찬가지 논리로, UML 2.0이 아니라 그 어떤 뛰어난 기술이 존재한다 하더라도 IT 시장에서 그 기술력을 필요로 하지 않거나 수용할 수 없다면, 그 기술력의 시장 가치는 무의미할 수밖에 없다.

2000년을 전후해서 전세계적으로 Y2K 문제가 사회적 문제로 부각되고 시스템의 대공황 사태가 예고되던 시절, 아이러니컬하게도 당시 소프트웨어 산업에서는 사양길로 접어들었던 프로그래밍 언어의 전문가들이 국내의 IMF 사태와 맞물려 고액 연봉으로 대접 받으면서 해외로 진출했던 일이 기억난다. 역시 기술의 가치(technology value)는 시장 원리(market behavior)에 의해 결정될 수밖에 없음을 인정하지 않을 수 없다.

그런 관점에서 UML 2.0이 공식적으로 공표되는 전후의 소프트웨어 산업계 판도를 살펴보는 것은 의의가 있다. 세계적으로 이미 프로그램 개발 도구 시장은 그 성장세가 둔화됐고, 모델링 도구는 빠른 속도로 보편화되어 가고 있다. 지난 몇 년간 일어났던 IT 업계의 큰 사건들을 살펴보면 그러한 사실을 쉽게 확인할 수 있다.

이를테면 예전에는 비싸게 판매하던 개발 도구를 점차 저렴하게 행사 가격으로 판매한다거나, 개발자 저변 확산이라는 명목 하에 학교나 학원을 중심으로 무료로 배포하고 있다. 심지어는 이클립스 등과 같은 막강한 개발 도구를 오픈소스로서 인터넷을 통해 무료로 배포하고 있다.

몇 년 전 세계적인 소프트웨어 업체인 MS에서는 비지오(Visio)라는 2D 전용 도구 개발 업체를 인수했고, IBM은 세계적인 모델링 도구 전문 개발 업체인 래쇼날을 인수합병했으며, 연이어 볼랜드에서는 투게더를 사들였다. 한편, 국내외 UML 관련 포럼이나 협회들에서는 앞다퉈 UML 관련 인증 제도를 만들어 발표하면서 그 인지도를 넓혀 가기 위한 대대적인 작업을 벌이고 있다.

UML 인증 제도의 필요성이라든지, 인증 제도 자체의 신빙성이나 효용성에 대해 논하기 이전에, 어떠한 사상이나 개념이 제도화 되는 과정을 거치고 있다는 사실은 그 사상이나 개념이 해당 분야에서 도입기(intro)와 성장기(growth)를 거쳐 성숙기(mature)에 진입하고 있음을 암시하는 것이다.

표준화의 숨은 뜻
UML을 논하면서 표준화(standardization)라는 키워드를 빼놓을 수 없다. UML이 발표되기 전에 국방이나
MIS분야 엔지니어들에게 친숙한 IDEF라든지 DFD, ER 혹은 Petri nets 등과 같은 정형 기법(formal method)으로 통칭되는 수많은 표기법(notation)과 지원 케이스 도구들이 존재했음에도 불구하고(참고자료:[1]번혹은[2]번등), UML은 가장 단기간 동안 소프트웨어 공학 분야에서만큼은 빠른 속도로 사실상의 표준(de-facto)의 위치를 확보했다. 언뜻 생각해 보면 UML이 여타 표기법들을 교통정리해 준 안도감(?)이 들 수도 있겠지만, 겉으로 잘 드러나지 않는 그 내막에는 무서운 음모(?)가 도사리고 있다.

표준화 작업에 주도적인 역할을 수행하는 업체들이 왜 그토록 천문학적인 자본을 투자하면서 공개적인 표준화 작업에 동참하는 것일까? 여러 가지 복합적인 이유들이 있을 수 있겠지만, 결론적으로 표준화 경쟁이다.

유명한 예로, 1970년대부터 시작됐던 빅터(Victor)의 VHS 방식과 소니의 베타 방식으로 대표되는 비디오 표준 전쟁을 들 수 있고, 최근에는 유럽과 미국을 중심으로 벌어지고 있는 위성방송 표준화 전쟁을 들 수 있다. 표준화 전쟁에서의 승패는 곧 기업의 운명을 좌우하는 것이다.

표준화의 이면에는 높은 진입 장벽을 통해 허가 받지 않은 침입자(intruder)를 봉쇄하려는 무서운 저의가 자리 잡고 있다. 시야를 좀 더 넓혀 보면, 의사나 판사, 회계사 등. 통속적인 표현으로 소위 ‘사’자로 끝나는 직업들에 대한 사회적 가치관을 살펴보면 쉽게 이해할 수 있다.

사람 몸을 열어서 칼질하고, 같은 인간으로서 다른 인간을 판단하고, 숫자 가지고 씨름하는 직업이 산업혁명 이전에는 별볼일 없는 직업이었다. 인류의 보편적인 가치관으로 판단하더라도 결코 즐거운 일이 될 수 없음에도 불구하고 전세계적으로 공히 가장 선호하는 직업이자 사회적으로도 가장 대접받는 직업이 된 현실에 미루어 짐작해 보면, 왜 그토록 세계적인 소프트웨어 업체들이 표준화를 통해 높은 진입 장벽을 구축하고 제도화에 전념하는지 그 이유를 충분히 이해할 수 있다.

어려운 시험을 통과하지 않고 누구라도 일정한 요건만 갖추면 수행할 수 있는 일반적인 직종 중의 하나라면 그렇게들 동경하는 직종이 됐겠는가? UML 2.0이 경제적으로나 사회적으로 주목 받는 이유 중의 하나는 바로 그러한 맥락에서 비전문인과 전문가를 구별하는 높은 장벽(?)을 쌓을 수 있는 재료(material)를 확보하고 토대를 마련했다는 점에서 의의가 있는 것이다.

주목해야 할 UML 2.0의 핵심 메커니즘
1997년 11월 UML 1.1로 시작된
OMG의 표준화 노력은 2001년 5월 UML 1.4 발표와 더불어 부분적인 개정 작업(minor version upgrade)의 막을 내리고, 대대적인 수술 작업을 거쳐 2004년 연말을 전후로 드디어 그 실체를 드러내었다.

그 동안 쟁쟁한 세계적인 소프트웨어 벤더들간의 보이지 않는 이해 관계(?)에 얽혀 2002년 말로 예정됐던 최종 발표 시한을 2년여를 연장하면서 이제서야 그 대단원의 막이 마무리되고 있다. 향후 UML 2.0의 일정은 명실상부한 국제 표준(de jure)으로 자리매김하기 위해 ISO 설계 표준으로 추진 중인 것으로 알려져 있다.

UML 2.0이 주목 받는 가장 중요한 이유는 무엇일까? 처음 세상에 나오고 나서는 여기저기서 수많은 비판을 받았지만, 그것은 UML이 어떠한 플랫폼이나 도메인에도 의존하지 않고 소프트웨어 개발의 전 공정(SDLC)을 지원하는 방향으로 지향해왔다는 데에 그 원인을 찾을 수 있다. 즉, 요구사항 획득으로부터 마지막 테스트까지 모두 지원하는 표기법으로서 진화해 왔다는 것이다.

그리고 점진적으로 UML 2.0부터는 실행 모델(executable UML)이라는 기법을 수용함으로써, 소프트웨어 공학에서 궁극적으로 염원하던 분석 설계(analysis & design)와 실제 구현(implementation) 간의 차이(chasm)를 극복하는 성과를 보였기 때문이다.

OMG의 UML 2.0에 대한 제안요청서(RFP)의 주제이자 현재 채택된 명세서 초안은 크게 4가지의 영역으로 분류된다. CASE 도구 벤더들간의 모델 호환성 문제를 다루고 있는 다이어그램 호환(Diagram Interchange) 영역과 모델 수준에서의 요소(elements) 제어 및 제약 문제를 다루고 있는 OCL(Object Constraint Language) 영역, UML뿐만 아니라 OMG가 주관하는 각종 표준의 통합과 정의에 활용되는 메타 모델 수준의 기본 구조체(constructs)를 명시하고 있는 하부구조(Infrastructure), 그리고 메타 모델을 기반으로 사용자 수준에서 모델을 활용하여 시스템의 구조(structure)와 행위(behavior)를 정의하고 있는 14개의 다이어그램을 정의하고 있는 상부구조(Superstructure)로 분류할 수 있다.

UML 2.0의 본질을 제대로 이해하려면 핵심인 하부구조로부터 차근차근 살펴보는 것이 순서이겠지만, 지면과 주제를 고려할 때, 일반인들이나 설계자들이 UML 2.0을 처음 대면하는 경우 가장 먼저 관심을 가지게 되는 UML 구조체(user-level constructs)인 상부구조로부터 이야기를 풀어가는 방식을 택하기로 하겠다.

사용자 삽입 이미지
<그림 1> UML 2.0 표준 다이어그램

*빨간 밑줄: 새롭게 추가된 다이어그램, 녹색 밑줄: 명칭이 변경된 다이어그램

상부 구조는 크게 6개의 다이어그램으로 구성된 구조형 다이어그램(Structural Diagram)군과 7~8개의 다이어그램으로 구성된 행위형 다이어그램(Behavioral Diagram) 군으로 분류할 수 있는데, 각 군의 대표적인 복합 구조 다이어그램(Composite Structure Diagram)과 순차도(Sequence Diagram)를 중심으로 그 특징과 의의를 살펴보도록 하겠다.

이어서 UML 2.0의 기반을 설명하고 있는 하부구조의 의미는 무엇인지, 그리고 실제 설계 작업에서 하부구조의 접근법은 어떠한 방식으로 활용하게 될 것인지 논의하기로 하겠다.

상부구조 - 구조형 다이어그램
일명 아키텍처 다이어그램(architectural diagram)이라고도 불리는 복합 구조 다이어그램(composite structure diagram)은 UML의 핵심 다이어그램인 클래스 다이어그램의 변형된 형태이다. 이는 시스템 구조 설계에 있어 또 다른 핵심 축으로 평가 받고 있으며 가장 주목 받는 다이어그램 중의 하나이다.

복합 구조 다이어그램은 기본적으로 시스템 혹은 컴포넌트의 내부 구조(internal structure)를 명시적으로 중첩시켜 표현하고 있으며, 시스템 아키텍처의 보다 섬세한 분석과 설계 사상을 담을 수 있게 된 점이 가장 큰 매력으로 꼽을 수 있다.

그렇다면 왜 복합 구조 다이어그램이 주목받는지, 그리고 복합 구조 다이어그램은 왜 탄생하게 되었으며, 향후 어떠한 용도로 활용하게 될까? 보는 시각에 따라 의견을 달리 할 수 있겠지만, UML 1.x은 근본적으로 OOAD 수준의 설계 사상을 표현하기에 최적화된 표기법으로 평가되어 왔다.

UML 1.x에도 비록 컴포넌트 다이어그램이라는 것이 있기는 했지만, 실제 너무 빈약한 문맥(semantics)으로 인해 별로 활용되지 못했으며, 강경한 컴포넌트 신봉자들이나 대용량 시스템 혹은 전체 시스템을 통합적으로 표현하기 원했던 아키텍처 전문가 진영 개발자들에게는, 그저 객체 옹호론자들이 제시하는 옹색한 명분(?)에 지나지 않았다. 사실 UML 1.x 자체에도 명시하고 있듯이, 컴포넌트 다이어그램은 몇몇 다이어그램들과 더불어 클래스 다이어그램에 일종의 간단한 확장 메커니즘을 통한 단순한 관점(view) 변경 수준에 지나지 않았다.

비즈니스 컴포넌트에 관심이 많았던 컴포넌트 신봉자들의 경우, UML 1.x의 스테레오타입(stereotype)등의 확장 메커니즘을 통해 그럭저럭 UML 1.x과의 관계를 유지하면서도 BPM이라는 포괄적이고 확장된 별도의 비즈니스 컴포넌트 표기법을 병행하며 UML 1.x의 미비한 부분을 채워 나갔다.

아키텍처 전문가 진영에서는 상황이 조금 달랐는데, 대다수의 아키텍처 전문가 진영에서 관심을 가지고 있던 임베디드 혹은 리얼타임 도메인에서는 단순히 UML 1.x 정도의 확장 메커니즘으로는 그들이 필요로 하는 아키텍처를 통한 시뮬레이션 등과 같은 시스템의 섬세한 분석 및 설계라는 목적 달성이 거의 불가능했고, 그러한 목적 달성을 위해 UML의 확장 메커니즘을 활용한다는 것은 차라리 자신들만의 특정 영역에 필요한 표기법을 자체 정의하여 사용하는 것이 훨씬 경제적이었다는 것이다.

왜냐하면 이미 아키텍처 전문가 진영에서는 UML 1.x가 발표되기 이전에 광범위하게 수많은 ADL(Architectural Description Language)과 관련 시뮬레이션 도구들이 개발되어 활용되고 있었으며, 굳이 UML에 순응하는(compliant) 방안을 모색하기 위해 UML을 연구하고 고민할 시간적 여유나 명분이 없었던 것이다.

그러나 그러한 두 진영에서 근본적으로 해결하지 못한 결정적인 문제는 자신들이 독자적으로 발전시켰던 표기법 중에 어떠한 것도 명실상부한 사실 표준(de-facto)으로 합의하지 못했다는 것이다. 가령, 아키텍처 전문가 진영에서 필요로 하는 시스템 시뮬레이션 기능을 구현하는 데 사용하는 정형 기법의 경우 동일한 도메인에서조차 연구소나 익숙한 기법에 따라 서로 달리 정의하고 필요한 시뮬레이션 도구를 개발해야 했다.

국제적인 공동 작업은 말할 것도 없이 국내에서 서로 다른 연구기관이 공동 작업을 수행하기 위해서도 사전에 일정한 표준 정형 기법을 합의하고 정립한 후 과제를 수행해야 했으며, 최종적으로 통합하는 과정에서는 결국에 모델 수준에서의 통합을 포기하고 구현 수준에서 테스트를 통해 통합하는 방식을 따라야 하는 문제점을 내포하고 있었다.

덧붙여 두 진영에서 해결하지 못한 결정적인 문제 중의 하나는 실제 구현(code)에 필요한 낮은 추상화 수준의 설계에 대해서만큼은 어설픈 UML 1.x의 메커니즘만한 수준의 방안을 제시하지 못했다는 것이다.

UML 2.0에서 새롭게 등장한 복합 구조 다이어그램은 바로 지금까지 앞서 살펴 본 아키텍처 전문가 진영으로 대표되는 임베디드 혹은 리얼타임 도메인의 핵심 개념이자 도구였던 SDL(Specification Description Language)을 수용하여 탄생한 다이어그램이다.

사용자 삽입 이미지
<그림 2> UML 2.0 복합 구조 다이어그램 예


UML을 잠시라도 살펴 본 경험이 있는 개발자들이라면, 복합 구조 다이어그램의 개략적인 형태만을 보고서도 쉽게 그 특징을 이해할 수 있을 것이다. 즉, 복합 구조 다이어그램은 매우 직관적인 형태를 취하고 있으며, 기존의 UML 1.x에서 단순한 패키지 개념의 서브시스템 내부를 구성하고 있는 클래스 다이어그램으로만 표현이 가능하던 시스템 내부 구조를 보다 섬세하게 설계할 수 있게 됐다.

그렇다고 <그림 2>와 같이 대부분의 UML 2.0을 기반으로 한 샘플들처럼 임베디드나 리얼타임 도메인과 같이 상대적으로 소프트웨어의 비중이 작은 단위 시스템이나, 특정 MIS 분야의 단위 서브시스템의 내부 설계에만 국한되어 복합 구조 다이어그램을 활용하겠다고 생각한다면, UML 2.0의 본질을 제대로 이해하지 못하고 있는 것이다.

복합 구조 다이어그램의 형태는 앞서 언급한 아키텍처 전문가 진영에서 아키텍처를 표기하는데 가장 많이 활용하는 아키텍처 스타일인 C&C(Component & Connector) 뷰 타입(view type)과도 일맥상통하는데, 복합 구조 다이어그램을 활용하고자 하는 모델의 추상 수준을 높이면 대규모 시스템의 아키텍처도 매우 유용하게 설계할 수 있게 된다.

<그림 2>에서 벤딩머신(VendingMachine)으로 되어 있는 부분을 인사시스템이라 정의하고 내부 부분(parts)들을 그것을 구성하고 있는 단위 시스템으로 정의하게 되면, 외부 인터페이스를 통해 회계시스템(AS)이나 고객관리시스템(CRM) 등과 주고받아야 할 데이터나 정보를 명시적으로 설계에 반영할 수 있을 것이다.

바로 설계자가 의도하는 어떠한 추상화 수준의 모델이라도 UML 2.0의 복합 구조 다이어그램은 보다 섬세하게 설계할 수 있도록 일관된 문맥(context)과 의미(semantics)를 제공하고 있는 것이다.

상부구조 - 행위형 다이어그램
UML 2.0 상부구조 중 구조형 다이어그램은 말 그대로 구조적인 혁명을 꾀했다면, 행위형 다이어그램 군에서는 시스템의 동적 설계를 제대로 반영하기 위해 기존의 행위형 다이어그램 군 소속 다이어그램의 의미(semantics)를 보강하고 정제함으로써, 진화 방식을 선택했다는 표현이 적절할 것 같다.

그 근거로서 앞서 복합 구조 다이어그램으로 대표되는 구조형 다이어그램에서 수용한 SDL의 경우와는 다르게 UML 1.x에서 이미 수용하던 MSC(Message Sequence Chart) 개념을 UML 2.0에 와서는 전폭적으로 수용하여 순차도(Sequence Diagram)를 중심으로 행위형 다이어그램들의 유기적 결합 통로를 확보함으로써 시스템의 모델 수준에서의 논리적인 실행을 그대로 설계에 반영할 수 있는 발판을 마련했다.

사용자 삽입 이미지
<그림 3> UML 2.0 순차도의 예


<그림 3>에서 보는 바와 같이 UML 2.0 순차도의 가장 두드러진 특징은, 기존의 UML 1.x에서 지원하지 못했던 시스템의 분기, 참조, 병렬 실행 등과 같은 세세한 부분들까지도 지원이 가능하도록 중첩된(nested) 표기법 체계를 설계 기법으로 도입했다는 사실이다.

MSC와 같은 기법에 익숙한 개발자들에게는 언뜻 보기에 별로 특이할 것이 없어 보일지 모르지만, 중요한 사실은 UML 2.0을 표준 표기법으로 수용함으로써 어떠한 비즈니스 도메인이나 기술 영역에서도 <그림 3>의 순차도 뿐만 아니라 UML 2.0의 다른 다이어그램들과 유기적인 연결고리를 가지고 활용함으로써 거의 무한대에 가까운 표현 수단을 확보할 수 있다는 사실이다.

UML 2.0 상부구조 중 행위형 다이어그램의 갱신에 대해 많은 관심을 가지는 사람은 임베디드 혹은 리얼타임 진영에 종사하고 있는 개발자들이겠지만, 기존의 비즈니스 프로세스 모델링 분야에서 종사하던 개발자 진영도 깊은 관심과 기대를 가지고 있다.

필자 또한 비즈니스 프로세스 모델링과 관련하여 행위 형 다이어그램의 특성과 최적 방안을 모색하고 있는데, 동일 비즈니스 도메인에서조차 개별 기업마다 그 특성과 비즈니스 프로세스 처리 방식이 천차만별인 문제를 해결하고자 등장했던 워크플로우 엔진 혹은 설계 시스템(workflow engine or system)과 같은 전문적인 도구의 기능을 충분히 대치할 방안이 마련된 것으로 평가되고 있다.

하부구조 - 메타 모델
소프트웨어 공학 분야에서는 이런 속설이 있다. 자신의 분야에서 메타 모델 기반의 접근을 하게 되면 하나의 논문이 된다. 매일 고객들과 씨름하면서 현장에서 일하는 개발자들에게는 먼 나라 이야기처럼 들리고, 현실적으로는 일정 규모의 연구소 혹은 학교에서나 다루어질 만한 주제로 치부됐던 것이 사실이다.

UML 2.0 하부구조(Infrastructure)는 일반적으로 UML 2.0을 지칭할 때 생각하는 UML 2.0 상부구조뿐만 아니라 OMG의 또 다른 메타 모델 집합인 MOF, CWM 뿐만 아니라 미래의 새로운 표준을 정의하기 위해 심혈을 기울여 정의한 메타 모델이다.

OMG에서 처음 메타 모델 4계층 개념을 발표했을 때에는 그저 개념적인 내용으로만 인식하지 못했지만, UML 2.0의 실체가 드러나고 그것을 지원하는 케이스 도구들의 기능들이 메타 모델 기반 설계 방식을 지원함으로써, 이제는 메타 모델이라는 주제가 현장에서조차 피해갈 수 없는 현실 문제로 다가올 것이다. 그러므로 이제는 메타 모델 4계층 개념을 충분히 이해하고 응용하는 노력을 기울일 필요가 있다.

사용자 삽입 이미지
<그림 4> OMG 4계층 메타 모델 예


글의 주제와 지면 관계상 메타 모델에 대한 깊이 있는 논의를 하지는 못하지만, <그림 4>의 예로 간단히 살펴보자. 시스템 분석가나 설계자들이 일반적인 모델링 케이스 도구를 통해 특정 도메인 시스템을 설계한다고 했을 때의 메타 모델 수준(level)이 바로 사용자 모델을 도식하게 되는 M1 수준이다.

M2 수준은 그러한 UML 기반의 설계를 가능케 하는 어트리뷰트, 클래스, 인스턴스 등과 같은 모델 요소를 정의하는 메타 모델이며, UML 2.0의 하부구조는 바로 위 4계층 메타 모델 관점에서 M2 수준의 UML 메타 모델이 된다. M3 수준에 위치한 MOF(Meta Object Facility)는 M2 수준에 속한 메타 모델을 정의하는 메타메타 모델이 된다.

참고로 CWM(Common Warehouse Metamodel)은 M2 레벨이며, MOF의 내부 구조는 추상화된 UML 하부구조와 동일한 방식으로 정의하고 있다. 자세한 사항은 OMG UML 2.0 Infrastructure, 7. Language Architecture를 참조한다.

앞에서 살펴 본 바와 같이 OMG에서 UML 2.0 관련 제안요청서(RFP)를 제기한 목적은 단순히 UML 2.0을 체계적으로 정리하고자 한 것이 아니라, OMG의 또 다른 표준인 MOF와 CWM 및 미래의 새로운 표준을 체계적으로 정의하기 위한 용도로 제기됐던 것이다. 여기서 우리가 주목해야 할 사항은 UML 2.0 하부구조에 대한 제안요청서를 통해 제기한 또 다른 목적이다.

그것은 바로 지금까지 M1 수준에서 UML을 활용하던 사용자들이 보다 수월하게 M2 수준에서 UML을 커스터마이징하여 활용할 수 있는 메커니즘을 제공하는, 즉 이원화된 메커니즘을 제공하여 사용자들이 유연하게 특정 기술 도메인이나 비즈니스 도메인에 최적화된 방식으로 설계를 수행할 수 있도록 하자는 데 그 취지가 있었다.

그 핵심이 바로 UML 프로파일(UML Profiles)이다. 지금 UML 2.0 작업과 동시에 진행되고 있는 대표적인 기술 도메인 프로파일로는 우리들에게 친숙한 EJB 프로파일(Profile for EJB), 닷넷 프로파일(Profile for .Net)을 들 수 있다. 프로파일을 간단히 설명하면, 일종의 특정 기술이나 비즈니스에 적절한 커스터마이징된 확장 메커니즘을 사전 정의해 놓고, 추상화 수준이 서로 다른 모델들간의 전환(transformation)을 자동화시키는 핵심 메커니즘이다.

플랫폼 독립 모델(PIM: Platform Independent Model)로부터 특정 플랫폼 종속 모델(PSM: Platform Specific Model)로의 자동화된 전환이라는 MDA의 사상이 바로 대표적인 일례라고 볼 수 있다. UML 프로파일은 향후 MDA를 통해서 달성하려고 하는, 아니 궁극적으로 UML 2.0을 통해 달성하게 될 소프트웨어 공학의 핵심 화두인 소프트웨어 개발 생산성 향상의 핵심 메커니즘으로 평가 받고 있다.

만약 이 글을 읽는 개발자가 속한 관련 분야에 MIS 분산 시스템 개발의 사실 표준으로 통용되는 J2EE나 닷넷 등과 같은 개발 기술 표준 프레임워크가 존재한다면 다행스러운 일이다. 모델링 도구 벤더에서 제공하는 EJB 프로파일이나 닷넷 프로파일과 같은 기술 메타 모델은 그대로 활용하고, 관심 비즈니스 영역에 해당하는 표준 도메인 프로파일을 활용하거나, 독자적으로 정의해 설계 작업을 추진해 나갈 수 있기 때문이다.

하지만 최악의 경우 관련 분야에 기술이나 도메인 프로파일이 존재하지 않고, 더욱이 활용할 만한 케이스 도구조차 존재하지 않는다면 난감하다. 하지만 UML 2.0을 충분히 지원하는 범용 혹은 상용 케이스 도구를 통해 구현된 방식이나 기능을 살펴보면 놀랄 만큼 간결하다. 문제는 UML 2.0의 프로파일 방식과 같은 메커니즘을 이해하는 것이 아니라, 그 동안 개발자들이 간과해 왔던 문제, 가령 “해당 비즈니스 도메인을 제대로 이해하고 있었는가?” 등과 같은 근본적인 문제를 되돌아보는 계기가 될 것으로 생각된다.

어떻게 대처할 것인가
지금까지 UML 2.0 출시를 전후해서 전개되어 왔던 소프트웨어 산업계의 전반적인 흐름과 사회적 파장, 그리고 UML 2.0의 상부 및 하부구조의 핵심 메커니즘을 중심으로 간단히 살펴보았다. 그렇다면 과연 어디서부터 어떻게 UML 2.0을 시작할 것인가?

기본 원칙에 충실하자
우선 스스로에게 UML 1.4는 제대로 이해하고 활용해 왔는가라는 질문을 던져 보아야 한다. 필자의 경우 하는 일이 하는 일인만큼 UML 2.0이 발표되기 이전에도 자바나 비주얼 베이직 등과 같은 프로그래밍 용어나 주제에 비해 상대적으로 UML(1.x), OOAD, CBD, 방법론 등이라는 용어가 훨씬 낯설지 않았다.

당연히 주변에는 상대적으로 코딩보다는 현장에서 분석(analysis)이나 설계(design)를 전문으로 하거나, 학교나 학원 등에서 학생들을 가르치는 사람들이 많았지만 그 중에 UML 1.x 관련된 OMG 무료 명세를 제대로 살펴보았거나, 가까이 두면서 참조하는 사람은 찾아보기 어려웠다.

필자 가까이에 ‘UML 1.4 사용자 지침서’를 한글로 번역했던 분을 통해 확인해 보아도, 국내 출판사에서 출간한 책 부수로 미루어 UML 원문은 차치하고서라도 핵심 내용만을 추려서 발간한 그 UML 사용자 지침서마저 꼼꼼히 살펴 본 사람은 별로 보지 못한 것 같다. 필자도 예외는 아닌데, 돈이 없어서 혹은 원서이기 때문에라는 것은 이유가 되지 않았던 것이다.

그런데 UML 2.0이 공식 발표되는 이 시점에도 상황은 예전이나 별반 다르지 않은 것 같다. UML 2.0으로 공식 공표되기 전에 이미 오래 전부터 OMG에는 UML 관련 명세를 1.5의 형태로 인터넷에 배포하고 있었지만, 살펴본 사람은 찾기 어려웠다. UML 1.1이 처음 발표되던 시점에는 표기법으로서의 표준화 경쟁에서 판정승이 나지 않았던 때여서 그랬다고 하더라도, UML 2.0이 공표되는 이 시점에는 이미 국내외 많은 대학의 컴퓨터 관련학과에서 필수 과목으로 개설되었을 만큼 그 중요도와 필요성이 검증된 마당에 애써 그 사실을 외면하는 것은 더 이상 이유가 될 수 없다.

물론 지금까지의 현실은 그렇지 못했던 것이 사실이다. UML 전문가들마저도 UML 1.x의 설계 도구로서의 완성도가 받쳐주지 못했고, 무엇보다도 고객들도 유기적으로 논리적인 설계 모델을 기대하지 않았기 때문에 UML이라는 포장지를 가지고 피상적이고 개념적으로 대충 구색 맞추기식 설계 산출물을 만들어 주면 그만이었다.

그러나 앞으로의 상황은 그렇지 못할 것이다. 당장은 아니겠지만 UML 2.0 표기법이 소프트웨어 산업 시장에서 보편적으로 활용되고 국내외에서 하나 둘 그 무한한 잠재력과 가능성이 증명되어 그 시장 가치가 확연히 드러나기 시작하는 시점에는 우리 주변의 고객들 또한 단순히 보기 좋은 산출물 정도의 설계를 요구하지는 않을 것이다.

그렇다면 어디서부터 어떻게 준비해야 할 것인가? 그 실마리는 처음 접하면 이해하기 어렵고 복잡한 UML 2.0 관련 명세나 두꺼운 책에서 찾을 것이 아니고, 누구나 알고 있으면서도 충실하지 못했던 가장 기본적이고 원칙적인 원리를 고민하는 것부터 시작해야 한다.

원칙 하나, 도메인을 철저하게 분석하자
시스템을 설계한다고 했을 때, UML과 같은 설계 기법을 동원하여 작업하는 시스템 분석 및 설계자 그룹 외에 매우 중요한 역할을 수행하는 집단이나 개인을 가리켜 도메인 전문가 혹은 비즈니스 분석가라고 한다. 가장 이상적인 시스템 설계자는 두 가지 능력 즉, 해당 도메인에 대한 공인된 전문적인 지식을 가지고 있으면서 동시에 설계 능력을 고루 갖춘 인재일 것이다.

그러나 현장에서 그런 핵심 인재를 찾기는 어려운 것이 사실이다. IT 업계로만 보더라도 시스템 설계자와 개발자 간에 차이가 좀처럼 좁혀지지 않는데, 전혀 그 분야와 전공이 다른 비즈니스 전문가와 시스템 전문가 간에 느끼는 갈등은 말할 필요도 없다. 시스템을 설계해 본 사람은 누구라도 공감하겠지만, 시스템을 제대로 설계하려면 해당 도메인을 충분히 이해하고 철저하게 분석해야 한다. 그렇지 않으면 제대로 된 시스템을 설계할 수 없다.

시스템 설계자 입장에서 문제는 해당 도메인을 제대로 이해하기 위한 충분한 시간도 주어지지 않고, 나름대로 시스템 설계자가 충분히 이해한 것을 객관적으로 검증해 줄 만한 기준도 마련되어 있지 않다는 것이다. 설사 객관적 기준이 있더라도 그것은 현실적으로 거의 불가능하다는 것이다.

가령 회계 시스템을 설계하려면 회계사 자격증을 갖춰야 하는가? 물론 아니다. 그런데 우리는 주변에서 타의든 자의든 특정 도메인 시스템을 반복해서 설계하는 설계자의 경우 점점 해당 도메인에 대한 이해력이 높아지고, 회계사와 같은 공인된 자격증은 취득하지 못하더라도 나름대로 그 전문성을 인정받아 시장에서 높이 평가되는 경우를 보곤 한다.

비단 시스템 설계자에게만 해당되는 문제는 아니다. 조각조각 할당된 부분만 열심히 해야 하는 개발자에게도 비슷한 현상은 쉽게 찾아 볼 수 있다.

설계하고자 하는 해당 도메인에 대한 철저한 분석 없이는 일정한 추상화 수준을 유지한 유기적인 모델을 만들어 낼 수가 없다. 몇몇 책이나 발표 자료에서 설계 팁으로 이야기 하듯이 해당 도메인에서 반복적으로 등장하는 명사(nouns)를 클래스명으로 명명한다는 식으로 설계를 진행하다 보면 점점 헤어나지 못하는 미궁으로 빠져들게 된다. 결국에는 UML 2.0이라는 강력한 설계 도구를 가지고도 설계 따로, 코딩 따로라는 늪에서 벗어날 수 없다.

UML 표준화를 주도하는 OMG에 대해서 많은 사람들은 단순히 CORBA, ORB 등과 관련한 국제적인 기술 표준화 단체 정도로만 인식하고 있다. 하지만 앞서 주장한 도메인 지식 혹은 도메인 표준에 대한 중요성에 대해서는, 그러한 기술 표준화 단체로 출범한 OMG에서 2002부터 발족하여 추진하고 있는 DTF(Domain Task Forces) 위원회의 활동을 살펴보면 쉽게 이해할 수 있다.

이미 전략전술 통제(C4I), 재무(finance), 의료(healthcare), 제조(manufacturing), 우주항공(space), 통신(telecommunications), 운송(transportation) 등의 도메인을 필두로 그 표준화 작업을 진행 중에 있으며, 여러 표준화 단체들과 연합하여 다른 도메인으로까지 표준화 작업을 확장 중에 있다.

물론 아직까지 그 시도는 기술적인 관점에서의 접근이라는 한계를 크게 뛰어 넘고 있지는 못하지만 인터넷, 즉 IT 기술을 배제한 고전적 의미의 비즈니스는 점차 그 경쟁력을 잃어 가고 있는 현실을 생각할 때 OMG의 영향력은 쉽게 무시할 수 없는 것이 될 것이다.

원칙 둘, 모델의 추상 수준
사전적 의미로도 알 수 있듯이 모델은 본질적으로 어떤 특정 사물이나 현상에 비해 상대적으로 추상화되어 있는 무엇이기 때문에 똑같은 실체에 대한 서로 다른 모델은 서로 다른 추상화 수준(level of abstraction)을 가질 수밖에 없다.

사용자 삽입 이미지
<그림 5> 모델의 서로 다른 추상화 수준


<그림 5>를 보면 똑같은 자동차를 모델로 만든 것이지만, 상단의 자동차 그림(혹은 모델)은 추상화 수준이 높고 하단의 자동차는 추상화 수준이 낮다. 여기서 중요한 것은 추상화 수준의 높고 낮음은 상대적이라는 것이다. 우리가 UML에서 제시하는 여러 다이어그램을 가지고 모델을 제작한다는 것은 결국 목표하는 자동차나 건물 등과 마찬가지의 실체 즉, 특정 시스템 하나를 완성하기 위한 노력인 것이다.

즉, 설계 작업을 수행한다는 UML 1.4의 표기법을 동원하든 UML 2.0의 표기법을 동원하든 아니면 제3의 표기법을 활용하든 목표하는 시스템을 완성하기 위한 과정이지 다이어그램 혹은 표기법 자체가 목적이 되지는 않는다는 것이다. 이러한 똑같은 모델의 원리를 UML의 다이어그램을 가지고 설명할 수 있다. <그림 5>는 UML 1.4에서 제시하는 9개의 표준 다이어그램의 추상화 수준을 계량화하는 방안으로 방사형의 표로 도식해 본 것이다.

사용자 삽입 이미지
<그림 6> UML 1.4 다이어그램 추상화 분포


<그림 6>의 중앙에 위치한 지점을 설계자가 목적하는 목표 시스템의 코드 혹은 운영(run-time) 시스템이라고 한다면, 유스케이스 축에서 0.8으로 표시된 지점 정도의 추상화 수준으로 유스케이스를 작성한 것을 비즈니스 유스케이스라 할 수 있겠고, 0.4 정도의 지점 추상화 수준으로 작성한 것을 시스템 유스케이스라고 할 수 있을 것이다. 그렇게 가정해 본다면, 중앙에 가까운 지점의 추상화 수준으로 낮게 모델을 작성한다면 설계자가 목적하는 시스템은 보다 세세하게(detailed) 보이게 될 것이다.

유럽의 모든 길이 로마로 향하듯이, 어떠한 길(다이어그램)을 선택하더라도 종국에는 목적지(목표 시스템)에 도달할 수 있다. 하지만 각 다이어그램은 각자 목표하는 시스템으로 접근할 수 있는 추상화 수준의 한계를 가지고 있다.

가령, 유스케이스 다이어그램만을 가지고 시스템 설계를 완성할 수는 없는 것이다. 반면에, 클래스 다이어그램만 가지고 시스템 설계에 접근하다 보면 나무는 보고 숲을 보지 못하는 우를 범할 수 있다. 그러한 이유로 소프트웨어 설계에서 UML을 활용하여 목표 시스템을 설계할 때는 하나 이상의 다이어그램을 활용하게 된다.

대표적으로 많이 활용되는 다이어그램으로는 유스케이스, 클래스, 시퀀스 등을 들 수 있을 것이다. 문제는 여기서부터 시작 된다. 시스템 설계에 대표적인 3개의 다이어그램을 활용하든 아니면 9개의 다이어그램을 모두 활용하든 활용하는 다이어그램들이 각자 따로 존재하게 되는 것이다.

유스케이스 다이어그램 따로 클래스 다이어그램 따로 심지어는 동일한 시스템에 대한 유스케이스 다이어그램을 그리더라도 그리는 사람에 따라 서로 다른 추상화 수준(level of abstraction) 혹은 입도(granularity)의 유스케이스가 작성된다는 것이다. 이건 비즈니스 유스케이스니 이건 시스템 유스케이스니 하면서 무의미한 논쟁으로 치닫게 된다.

이러한 문제를 본질적으로 해결책하기 위해서는 그것이 UML 1.4이든 UML 2.0이든 각 다이어그램의 주된 용도(usage)와 목적(objectives), 그리고 그 한계를 충분히 이해하고, 각 다이어그램이 그러한 용도와 목적을 충족시키기 위해 제시하는 특성 표기법의 명확한 의미와 용도를 숙지해야 한다. 그 후에 활용하려는 다이어그램의 핵심 표기들 간의 추상화 수준에 대해 일관된 원칙(principle)을 우선 정립하고 설계 작업을 수행해야 한다.

가령 이러한 원칙 수립이 가능하다. 유스케이스 다이어그램을 통해 작성한 하나의 유스케이스를 하나의 활동도(Activity Diagram)로 도식하기로 했다면, 활동도의 활동(Activity)은 유스케이스 시나리오로 작성하는 사건 흐름(flow of event) 상의 단일 스텝(step)이라는 원칙을 설정하게 되면 일관된 설계 작업을 수행할 수 있다. 그러한 설계 전략을 위 <그림 6> 위에 상징적으로 표현해 보면, <그림 7>과 같이 도식할 수 있을 것이다.

사용자 삽입 이미지
<그림 7> 다이어그램 간의 추상화 수준 조정


지금까지 UML 1.4를 중심으로 모델의 추상 수준이라는 원리에 대해 살펴보았다. 그러한 모델의 추상 수준이라는 핵심 메커니즘은 본질적으로 UML 2.0이라고 해서 다르지 않다. 앞선 <그림 1>과 <그림 7>을 언뜻 비교해 보아도 UML 2.0에서는 표준 다이어그램의 개수로도 UML 1.4에 비해 수적으로 많이 늘어났으며(<그림 4>에서 빨간색으로 표시된 다이어그램), 이전부터 있었던 몇몇 다이어그램들은 명칭이 변경됐고(<그림 4>에서 초록색으로 표시된 다이어그램), 무엇보다도 전반적으로 모든 다이어그램들이 보다 섬세한 설계자의 의도를 반영할 수 있도록 세부적인 표기들이 많이 추가되고 세분화됐다. 즉, 사용할 수 있는 다이어그램 선택의 폭(width)이 넓어졌고, 설계자의 의도를 보다 정밀하게 반영할 수 있는 깊이(depth)도 깊어졌다.

원칙 셋, 모델 자체의 완성도를 높이자
앞서 소프트웨어 업계에서 최근 발생하고 있는 현상들을 통해 잠시 언급했지만, UML 관련 국내외 포럼이나 협회들을 중심으로 UML 자체 혹은 설계 능력 인증 제도가 점차 많아지고 있다. 필자가 인증 제도의 본질적인 목적이나 그 가치 자체를 부정하는 것은 아니지만, 올해 사회적으로 충격을 던져 주었던 대입 수능 시험에서의 대량 부정 사태라든지, 얼마 전부터 공공연하게 제기됐던 영어 관련 인증 제도 등에서 발생하고 있는 문제점 등에 비추어 UML 인증 제도에서도 충분히 발생할 수 있는 그 변별력 문제에 대해 우려를 감출 수 없다.

그러나 다행히도 UML 2.0이 가지고 있는 그 강력한 표현력(semantic expressiveness)과 섬세함(elements precision) 그리고 다이어그램들간의 유기적 연결성 지원(support for diagram interchange) 능력으로 인해 인증서를 가지고 있다고 들먹이지 않아도 모델 결과물 자체로 그 완성도를 검증(self verification)할 수 있다. 즉, 모델 결과물만으로도 충분히 설계자의모델링 역량을 충분히 증명할 수 있는기반을 제공하고 있는 것이다.

UML 2.0이 공식으로 발표되기 이전 특정 케이스 도구들을 중심으로 시도됐지만 UML 1.4의 제약으로 그 실효성(efficiency)을 의심받았던 코드 자동 생성(automatic code generation) 기능은 케이스 도구들이UML 2.0 엔진으로 교체함으로써 그 완성도를 높일 수 있게 됐다. 더 나아가 UML 2.0이 내포한 그 풍부한 표현력과 정교함은, 특정 플랫폼에 종속적인 코드를 생성해 내기 이전에 케이스 도구의 도움을 통해 모델들만을 가지고 사전에 시뮬레이션마저도 어려운 문제가 되지 않는다.

앞으로의 전망
지금까지 개발자들은 새로운 기술이나 제품이 출시되면, 여기저기서 화려한 수식어와 찬사로 밝은 미래를 전망하는 이야기에 너무나도 익숙해져 있다. 1997년 UML 1.1이 처음 세상에 나왔을 때도 마찬가지였다. 그런 맥락에서 단순히 UML 2.0이라는 새로운 패러다임에 무조건 주목하자고 주장하고 싶지는 않다. 실리에 밝은 국내외 소프트웨어 업체들과 협회들의 행보와 여러 가지 상황을 종합해 보아도 UML 2.0이 소프트웨어 산업계에 미칠 파장의 크기는 실로 엄청날 것으로 예상된다.

그것이 더 이상 거스를 수 없는 현실이라면 그러한 도전에 수동적으로 대처할 것인가, 아니면 능동적으로 대처할 것인가의 문제는 독자 스스로 선택할 문제이다. 혹시 이솝 우화에 나오는 거짓말하는 늑대 이야기에서처럼 중요하다는 말을 너무 자주 들어 개발자들이 UML의 중요성을 공허한 메아리 정도로만 치부하고 지나칠까 걱정될 뿐이다.@

* 이 기사는 ZDNet Korea의 제휴매체인마이크로소프트웨어에 게재된 내용입니다.

 

사용자 삽입 이미지

 

원문 :http://www.zdnet.co.kr/techupdate/lecture/etc/0,39024989,39134178,00.htm

  Comments,     Trackbacks
MS 소프트웨어 사업 특명「RFID 잡아라!」

MS 소프트웨어 사업 특명「RFID 잡아라!」

 

RFID기술에 대해 막대한 투자를 해온 MS가 드디어 RFID 소프트웨어 패키지의 첫 메이저 제품을 출시할 예정이다. 기업들은 RFID 소프트웨어 패키지를 사용해 제품 태그 기술을 관리하는 데 도움을 받을 수 있다.

MS는 내년 초 RFID 서비스 플랫폼을 출시할 계획이며, 이 플랫폼은 RFID 신호를 모니터하는 하드웨어와 RFID 정보를 인식하는 비즈니스 소프트웨어를 연결하는미들웨어제품인 것으로 알려졌다.

이 제품은 RFID를 자사 시스템에 통합하기를 바라는 기업들뿐 아니라, MS 기술에 기반을 두고 제품을 만들려고 하는 소프트웨어 기업들을 대상으로 설계된 것이다.

MS의 RFID 프로그램 부장 알렉스 렌즈는 지난 8일 CNET 뉴스닷컴과의 인터뷰에서 "RFID 제품은 MS 닷넷 개발 플랫폼 위에서 만들어지고 2개의 프로세서를 지닌 서버에서 구동될 것"이라고 말했다. RFID 제품에는 또한 정보를 저장하기 위해 MS SQL 데이터베이스 소프트웨어를 통합할 것으로 보인다.

저렴함을 무기로 승부
렌즈는 제품의 가격 정책을 털어놓지는 않았지만, 제품 가격이 전반적으로 떨어지고 있는 시장 상황에서 MS 제품이 낮은 비용으로 구매할 수 있는 제품으로 자리 잡기를 원한다고 강조했다. 그는 "우리는 이 제품이 턱없이 비싸지 않을 것이라는 점을 확신시킬 것이다"라고 말했다.

RFID는 벤처 기업들뿐 아니라 기술 분야의 많은 대기업들도 관심을 가지고 있는 분야다. IBM과 오라클은 이 영역에 매우 깊게 관련된 기업들이다.

흔히 전자 바코드라 불리는 RFID 태그는 제품에 대한 기본적인 식별 정보를 공유하는 신호를 보낸다. 이 태그는 제조부터 유통 그리고 소매점까지 제품을 추적하는 데 활용될 수 있다.

MS는 RFID를 자사의 광범위한 '더 현명한 소매 전략(Smarter Retail Initiative)’의 핵심 요소로 만들어왔다. MS는 또한 윈도우 XP의 임베디드 버전에서 태그 기술을 지원할 계획이라고 발표했다. 이는 특별히 소매업자들을 대상으로 한 계획이라고 한다.

이와 대조적으로 대부분의 고객들은 핵심 비즈니스 파트너가 태그를 제품에 추가하도록 강요하고 있기 때문에 마지못해 RFID를 받아들이고 있을 뿐이다.

렌즈는 '컨버전스 2005' 컨퍼런스에서 프레젠테이션을 통해 "제조업자들은 비즈니스 사례를 발견하기 위해 고군분투하고 있다"라고 말했다.

많은 경우에 있어, 제품 제조업자들은 월마트와 같은 소매업자로부터 강요를 받고 있다. 소매 분야의 거인인 월마트는 이미 대규모 납품업자들에게 특정 물류센터로 보내는 화물에 태그를 붙이도록 요구하고 있으며, 중소 납품업체들도 오는 2007년까지 같은 작업을 하도록 요구할 계획이다.

눈에 띄는 효과가 없는 것이 딜레마
대부분의 경우, 월마트 공급업자들은 제조 단계의 마지막에 태그를 달아서 월마트의 요구사항을 만족시키고는 있지만 비용 절감 또는 효율성 증가 등의 효과는 전혀 보지 못하고 있다.

MS는 더 많은 기업이 자사의 저비용 RFID 옵션을 통해 RFID를 공급망에 더 일찍 통합하기를 바라고 있다. SAP는 지난 2일, 인터멕과 협력 관계를 맺어 중소기업들이 파트너의 요구사항을 만족시킬 수 있도록 하겠다고 발표했다.

렌즈는 MS가 내년에 출시할 예정인 RFID 소프트웨어의 주요 장점 중 하나는 이 솔루션이 시장에 보급되는 다양한 RFID 하드웨어에 대응할 수 있는 점이라고 말했다.

RFID 미들웨어를 단독으로 공급하는 것 외에도 렌즈는 "MS가 내년에 나올 세 가지 비즈니스 애플리케이션에 미들웨어를 포함시킬 것"이라고 말했다. RFID 기술을 내장할 첫 번째 제품은 아삽타(Axapta) 4.0으로 내년 전반기 출시될 예정이다. 2개의 다른 제품, 네비전(Navision) 5.0과 그레이트 플레인(Great Plains) 9.0은 내년 하반기에 나올 예정이며, 이 두 제품에도 RFID 기술을 추가할 계획이다.

MS는 또한 글로브레인저와 커넥테라가 MS의 핵심 기술을 이들의 제품에 활용하는 계약을 체결했다고 발표했다. MS는 현재 육포 제조업체인 잭 링크 스낵을 포함한 2개의 초기 고객들을 보유하고 있다.

피할 수 없다면 맞이하라
렌즈는 RFID 투자가 성과를 거두게 되면 잭 링크와 같은 소규모 기업들은 실질적으로 혜택을 본다고 자신했다. 대규모 기업들은 제품 추적을 위해 바코드 분야에 이미 막대한 투자를 한 상태이기 때문에 RFID로 인한 부가적인 인력 비용 절약이나 효율성 증대는 미미한 실정이다. 그렇지만 RFID는 전반적으로 볼 때 바코드 시스템이 없는 기업에서 더욱 극적인 효과를 거둘 수 있다.

그는 "이들에게는 바코드 시대를 받아들여서 혁신을 위해 도약할 수 있는 기회가 있는 셈"이라고 말했다. @

 

Ina Fried (CNET News.com)

2005/03/10
원문보기

 

사용자 삽입 이미지

 

원문 :http://www.zdnet.co.kr/news/enterprise/0,39024412,39134402,00.htm

  Comments,     Trackbacks
웹 애플리케이션 개발의 진화「ASP.NET 2.0」

웹 애플리케이션 개발의 진화「ASP.NET 2.0」

ASP.NET 2.0, 웹 애플리케이션 개발의 진화

 

연재순서
1회.
닷넷 개발의 새로운 변화, 비주얼 스튜디오 2005 맛보기
2회.닷넷 프레임워크 2.0과 개발 언어의 변화
3회. 웹 애플리케이션 개발의 진화, ASP.NET 2.0

 

액티브 서버 페이지(ASP) 1.0이 세상에 처음 모습을 드러냈을 때, 개발자들의 반응은 냉담했었다. ASP라는 기술은 그다지 주목받지 못했으며, 그 기술이 훗날 전세계에서 가장 폭넓게 사용되는 웹 개발 기술이 될 것이라고는 누구도 예상하지 못했다.

그리고 얼마간의 시간이 흐른 뒤, 웹 프로그래밍 계에 한 획을 긋게 될 ASP 2.0이 세상에 그 모습을 드러냈다. 그 시기는 인터넷이라는 것이 서서히 일상의 문화로서 한 자리를 찾아가는 시기이기도 했다. 전자상거래가 화두로 떠오르면서 전세계의 웹 개발자들은 기존 버전과는 달리 막강하게 변모한 ASP 2라는 기술에 관심을 보이기 시작했고, 눈 깜짝할 사이에 ASP는 세계에서 가장 효과적인 웹 애플리케이션 개발 기술로서 인정받게 되었다.

그리고 기술은 계속 진화하여 ASP 3까지 발전하였으며, 종국에는 ASP와 닷넷 기술이 결합하여 ASP.NET까지 등장하게 되었다.

ASP.NET 2.0 또 한 번의 놀라운 진화
ASP.NET 1.0이 처음 ASP 개발자들에게 그 모습을 드러냈을 때, 사실 평가는 그다지 좋은 편이 아니었다. 그만큼 기대가 컸기 때문일까? 획기적인 개발 편의성을 기대했던 개발자들에게 ASP.NET은 단지 이벤트 지향 프로그래밍 방식으로 코드를 작성할 수 있다는 부분 이외에는 크게 눈길을 끄는 부분이 없어 보였다. 게다가 포스트백(Postback)이라는 새로운 페이지 처리 방식과 다소 복잡하게 느껴지는 코드 비하인드 모델에 몇몇 개발자들은 오히려 혼란스러움을 느끼기도 하였다.

이는 대부분의 국내 웹 개발자들이 OOP 언어와 함께 프로그래밍을 시작하기 보다는 스크립트 언어와 함께 프로그래밍을 배웠기에 일어나게 된, 어쩌면 자연스러운 불만일 수 있다. 사실 객체지향적인 프로그래밍 방식에 대한 이해와 웹 프로그래밍의 처리 방식에 대한 이해를 모두 가져야만 제대로 이해할 수 있는 것이 ASP.NET이다. 둘 중 하나라도 지식이 부족하면 이 기술은 단지 쉬운 기술을 복잡하게 꼬아놓은 것으로 밖에 보이지 않을 수 있다. 그렇기에 ASP.NET이 인정을 받기 시작하는 데에는 그만한 시간이 필요했다.

개발자들이 ASP.NET을 더 이상 ASP와 비교하지 않게 되자 제대로 된 ASP.NET의 모습을 이해할 수 있게 되었고, ASP.NET은 서서히 주변에 쓸만한 기술이라는 입소문을 내게 되었다. 하지만 기술 자체는 획기적이었지만 아무래도 1.0 버전의 새내기 기술은 기존 웹 개발자들이 기대한 만큼의 만족은 주지 못했던 것이 사실이다.

버전 1.0이 나온 이후 4년. 상당히 오랜 기간이 흘러왔다. 그리고 아직 의견은 분분하지만 개발자들의 은근한 기대 속에서(다음 버전에 대한 기대) 그 사이 ASP.NET도 어느 정도 자신만의 자리를 차지하기 시작했다. 그리고 이러한 상황을 아는지 모르는지 ASP.NET 2.0이 드디어 그 모습을 드러내고 있다. 기대 반, 우려 반 속에서 말이다.

ASP.NET 2.0, 날씨로 표현하면 ‘해 뜸’
ASP.NET 2.0 알파, 베타 1 버전을 만나보고 난 필자의 느낌을 날씨로 이야기하라면 ‘해 뜸’이라고 표현하고 싶다. 대부분의 ASP.NET 개발자들이 서운해 했던 부분들에 대한 보완과 개선이 상당 부분 이루어져 있었기 때문이다(이번 버전을 준비하면서 아마도 MS 본사의 ASP.NET 팀은 웹 개발자들의 목소리에 귀를 상당히 많이 기울인 것 같다). 그리고 각 기능에 대한 구체적인 내용들을 살펴보면서는 다소 흥분되기 시작했다. “이건 뭐야? 개발자들을 다 없애버릴 작정인 건가?”라는 말이 나올 정도였으니 말이다.

데이터베이스와 연동되는 그리드(일종의 게시판)를 작성하고, 사용자 로그인/로그아웃을 처리하고, 비밀번호 복구 및 사용자 추가/관리 기능, 사이트 탐색 메뉴 기능과 입력 값의 유효성 검사, 사이트의 테마와 스킨 등 기본적인 웹 사이트에서 필요한 공통 기능들을 프로그래밍 코드 한 줄 작성할 필요 없이 이룰 수 있다면, 여러분은 그런 생각이 들지 않겠는가?

ASP.NET 2.0이 제공하는 새로운 기능들이 놀랍게도 바로 그러하다. ASP.NET 2.0이 새롭게 제시하는 프로바이더 디자인 모델 패턴(Provider Design Model Pattern)과 그와 관련된API들, 그리고 기존의 두 배가 넘는 서버 컨트롤들의 지원은 웹 개발 플랫폼의 또 한번의 진화라는 말이 무색하지 않을 정도로 획기적이라 할 수 있다. 더욱 놀라운 것은 그 기능적인 발전이 ‘기존 ASP에서 ASP.NET으로의 진화’에 필적할만한 수준임에도 불구하고, 학습하기에 그리 많은 비용(시간과 노력)을 요구하지 않는다는 점이다.

ASP.NET 2.0은 그러한 혁신적인 기능들을 익히기 위해서 개발자에게 많은 시간을 요구하지 않는다(이는 다소 주관적인 판단일 수 있음을 밝힌다). 특정 기술의 새로운 버전이 나올 때마다 수많은 새로운 것들을 익혀야 한다는 압박 속에서 힘겨워했던 개발자들 입장에서 보면 이는 매우 기쁜 소식일 것이다.

ASP.NET 2.0과 처음 인사를 나누게 되면 개발자들은 그 대단한 기능들에 감탄함과 동시에 그 간결한 사용법에 대해서도 감탄을 하게 된다. ASP.NET 2.0의 개발 코드 중 하나가 Codeless(코드가 필요 없는 개발)라는 것을 안다면, MS의 ASP.NET팀이 얼마나 개발자 편리성에 중점을 두어 ASP.NET 2.0을 준비하고 있는지를 간접적으로나마 느낄 수 있을 것이다.

본론을 시작하기에 앞서 다소 안타까운 부분은 이번 글에서 ASP.NET 2.0의 모든 기능들을 세세하게 들여다보기는 어려울 것 같다는 것이다. 지면의 압박이 있기에 그렇기도 하지만 ASP.NET 2.0은 현재 기준 베타 1 버전이어서 차후 일부 변경될 소지도 있기에 그러하다.

그래서 이번 컬럼에서는 개별적이고 세세한 기능적인 부분에 대한 논의보다는 전반적인 ASP.NET 2.0의 모습을 살펴보는 쪽으로 진행하도록 하겠다. ASP.NET 개발자 입장에서 보았을 때, 눈길을 크게 끄는 기능들을 중심으로 해서 말이다(ASP.NET 2.0에서 제공하는 새로운 기술들을 더욱 구체적으로 알아보고 싶다면이 웹페이지를 참고해 보기 바란다. 이는 ASP.NET 2.0의 새로운 기능들을 일목요연하게 정리해 놓은 MSDN의 컬럼 구역이다. <화면 1> 참조)

사용자 삽입 이미지
<화면 1> MSDN의 ASP.NET 2.0 컬럼들


ASP.NET 2.0의 새로운 기능들
ASP.NET 2.0 버전은 모든 기능 측면에 있어서 비약적인 발전과 강화가 있었다. 웹 페이지 개발 측면에서 바라보면 ASP.NET 2.0은 기능적으로 강화된 새로운 컨트롤들을 제공하고 있어서, 기존에 반복적으로 작성해야 했던 로직 및 기능들을 반복해서 작성할 필요 없이 매우 간단하게 ASP.NET 페이지에 그러한 기능들을 추가할 수 있다. 예를 들면, 인증 처리와 관련된 Login, PasswordRecovery, ChangePassword 컨트롤을 비롯하여, 다양한 스킨을 지원하는 Treeview 컨트롤, 사이트 메뉴 컨트롤, 데이터베이스 관련 작업을 위한 GridView, DetailView 컨트롤 등이 그것이다.

게다가 지금 나열한 이러한 컨트롤들은 자체 처리 기능까지 내장하고 있어서, 단 한 줄의 코드 작성 없이도 자신의 역할을 수행해낸다. 예를 들면 Login 컨트롤은 단 한 줄의 코드도 없이 사용자 인증 처리를 스스로 처리하며, GridView 컨트롤도 웹 페이지 상에서 데이터를 쉽게 출력하고, 편집할 수 있는 기능을 단 한 줄의 코드 작성 없이도 가능하게 한다.

프로바이더 디자인 모델 패턴의 도입
이러한 편의성의 이면에는 프로바이더 디자인 모델 패턴이라는 추상적인 패턴의 도입이 있다. 프로바이더 개념은 처음에는 다소 어려운 개념처럼 느껴질 수 있지만 알고 보면 사실 크게 어렵지 않은 내용이며, 이미 대부분의 개발자들이 알고 있어왔던 개념이기도 하다.

하지만 프로바이더라는 개념에 대한 이해가 없어도 그를 이용하여 ASP.NET 웹 애플리케이션을 개발하는 데에는 전혀 문제가 없다. 이는 마치 기존에 OLEDB 프로바이더에 대한 지식이 없어도 그를 이용해서 데이터베이스를 대상으로 맘껏 쿼리를 실행할 수 있었던 것과 같다. 프로바이더 디자인 모델 패턴은 기술적인 복잡함을 추상화하고 있기에 개념자체는 다소 복잡하게 보일지 몰라도 사용하는 측면에서 보면 상당히 쉽고 편리하다(<화면 2>).

사용자 삽입 이미지
<화면 2> 프로바이더 모델 디자인 패턴


예를 들면 ASP.NET 2.0에서는 사용자 인증 및 관리를 위한 보안 관련 서버 컨트롤들이 새롭게 제공되는데, 이 컨트롤들은 프로바이더 디자인 모델 패턴과 멤버쉽(Membership)이라는 API를 통해서 실제 인증처리에 관한 모든 로직을 자체 제공 및 처리한다. 쉽게 말하면 Login, LoginView, CreateUserWizard, ChangePassword 등의 컨트롤이 보안과 관련된 대표적인 컨트롤인데, 이러한 컨트롤들은 내부적으로 액세스(Access) 데이터베이스를 자동으로 생성하여 그를 기반으로 인증을 처리한다는 것이다.

기본적으로 ASP.NET 2.0은 MS 액세스 데이터베이스 파일을 인증 관련 요청이 처음 접수되는 경우, 동적으로 데이터베이스 파일을 만들어서(이미 존재하지 않을 경우에만) 그곳에 데이터를 저장하고, 그곳으로부터 필요한 데이터를 불러온다.

이러한 내부적인 처리 프로세스는 이미 해당 컨트롤과 API 그리고 프로바이더를 통해서 구현되어져 있기에, 개발자는 코드 한 줄 작성할 필요 없이 적절한 서버 컨트롤을 사용하여 새로운 사용자를 추가하거나, 인증·관리할 수 있는 것이다. 물론 원한다면 데이터베이스 서버의 종류를 바꿀 수도 있다.

ASP.NET 2.0이 기본적으로 제공해주는 프로바이더에는 AspNetAccessProvider와 AspNetSQLProvider가 있지만 정식 버전에서는 조금 더 늘어날 수도 있을 것 같다. 만일 정식 버전에서 여러분이 사용해야 하는 특정 데이터베이스 서버에 대한 프로바이더가 지원되지 않아도 크게 걱정할 것은 없다. 필요하다면 오라클이나, 인포믹스 등의 데이터베이스 서버를 이용하게끔 직접 설정할 수 있기 때문이다. 이를 위해서는 단지 별도로 프로바이더를 제작해주기만 하면 된다(별도의 작업이 요구되긴 하지만, 그리 어려운 작업이 아니다).

하지만 대부분의 경우 개발자가 프로바이더들을 직접적으로 건드릴 일은 없을 것이다. 개발자들은 그보다는 주로 ASP.NET 2.0에서 새롭게 제공하는 편리한 API들을 즐기는 것으로 시간을 보내게 될 것이다.

마스터 페이지 기능
그리고 무엇보다 ASP.NET 개발자들이 기뻐할만한 소식은 UI 페이지 디자인 측면에서의 획기적인 지원, 마스터 페이지의 도입 소식이다. 마스터 페이지 기능은 기존 ASP.NET 1.x에서는 사용자 정의 컨트롤과 같은 것을 이용해서 다소 복잡하게 처리해야 했던 공통 UI의 재사용을 획기적으로 개선한 것으로, 웹 폼에서 비주얼 상속(Visual Inheritance)을 가능하게 하는 기술이다. 마스터 페이지의 논리적인 모습은 <화면 3>을 보면 이해가 쉬울 것이다.

사용자 삽입 이미지
<화면 3> 비주얼 상속을 가능케 하는 마스터 페이지


<화면 3>에서 보이는 것처럼, 마스터 페이지는 최종 UI 페이지에 반복적으로 재사용하게 될 내용들을 별도의 파일로써 정의해 둔 페이지를 말한다. 이렇게 마스터 페이지로 작성해 두고, 각각의 최종 UI에서 이러한 마스터 페이지를 이용한다면 공통적인 UI를 그대로 물려받게 됨으로써 개발 생산성이 크게 향상될 수 있다. 이는 마치 MS 파워포인트에서의 마스터 슬라이드를 연상하면 쉽게 이해가 될 것이다. <화면 4>는 비주얼 스튜디오 닷넷 2005(이하 VS.NET 2005)에서 마스터 페이지를 사용하여 페이지를 개발하고 있는 모습이다.

사용자 삽입 이미지
<화면 4> VS.NET에서의 마스터 페이지 사용


ASP.NET 2.0의 또 다른 진화는 바로 향상된 코드 비하인드 모델이다. 코드 비사이드(code-beside)라고도 불리는 이 기술은 Partial이라는 새로운 확장 클래스 개념을 통해서 코드 비하인드 클래스가 System.Web.UI.Page를 직접적으로 상속하지 않고, Page 클래스를 별도로 확장하는 개념을 적용하고 있다(<화면 5> 참고).

사용자 삽입 이미지
<화면 5> ASP.NET 코드 비하인드 모델의 비교


이러한 변경으로 인해 기존 ASP.NET 1.x에서 개발자의 실수로 간혹 발생하곤 했던 런타임시의 타입 불일치 문제는 명쾌하게 해결된다. 예를 들면 그러한 문제의 전형적인 시나리오는 다음과 같다. 기존 ASP.NET 1.x 시절에는 UI 페이지와 코드 비하인드 페이지가 명시적으로 연계된 구성을 가지고 있었다. 즉 UI 페이지에 서버 컨트롤이 추가되면 그에 따라 코드 비하인드 페이지에도 해당 컨트롤의 객체 선언이 추가되어야 해당 객체를 인식할 수 있는 구조로 되어져 있었으며, 빌드 및 배포 후에 컨트롤의 ID가 변경된다거나 UI 단에서 서버와의 연계성을 가진 특정 값들에 변경이 일어나면 서버에서 ‘예기치 않은 오류’가 발생할 수 있는 구조를 가지고 있었다.

ASP.NET 2.0은 이러한 문제를 원천적으로 해결하기 위해서 코드 비하인드 파일을 상속되는 형식이 아닌 확장되는 형식으로 바꿈으로써 UI 페이지의 서버 컨트롤과 코드 비하인드의 실제 코드 간의 연결이 ASP.NET 런타임에 의해서 실제 런타임시에 관리되도록 내부 구조를 변경하였다. 그 결과 개발자가 작성해야 할 코드(VS.NET이 자동으로 생성해주는 코드를 포함하여)도 혁신적으로 줄어들게 되었으며, 안전성 및 개발 생산성 측면에서도 상당한 진일보를 이룰 수 있게 되었다.


<리스트 1>과 <리스트 2>는 각각 ASP.NET 1.x 시절의 코드 비하인드 파일과 ASP.NET 2.0 버전의 코드 비하인드 파일의 일반적인 소스를 보여주고 있다. 두 리스트는 모두 페이지가 로드될 때, 라벨(Label) 컨트롤에 인사 메시지를 출력하는 코드를 포함하고 있다. 두 코드를 비교해 봄으로써 코드 비하인드의 내부적인 처리 구조 변화가 어떻게 개발 생산성을 높여주는 지 확인해 보기 바란다.

 <리스트 1> ASP.NET 1.x의 코드 비하인드 파일
사용자 삽입 이미지

namespace WebApplication1
{
        public class WebForm1 : System.Web.UI.Page
        {
                 protected System.Web.UI.WebControls.Label Label1;
                 private void Page_Load(object sender, System.EventArgs e)
                 {
                         Label1.Text = "Hello ASP.NET 1.x";
                 }

                 #region Web Form Designer generated code
                 override protected void OnInit(EventArgs e)
                 {
                         InitializeComponent();
                         base.OnInit(e);
                 }

                 private void InitializeComponent()
                 {
                         this.Load += new System.EventHandler(this.Page_Load);
                 }
                 #endregion
        }
}
사용자 삽입 이미지

 <리스트 2> ASP.NET 2.0의 코드 비하인드 파일
사용자 삽입 이미지

namespace WebApplication1
{
        public partial class Webform1_aspx
        {
                 void Page_Load(object sender, EventArgs e)
                 {
                         Label1.Text = "Hello ASP.NET 2.0";
                 }
        }
}
사용자 삽입 이미지

눈에 띄는 변화, 캐싱
ASP.NET 2.0에서 눈에 띄게 개선된 또 다른 기능은 바로 캐싱(Caching)이다. 기존의 캐싱 기능들을 성능적으로 개선한 것에 더하여 캐시를 위한 새로운 방안들도 추가되었는데, 이 들 중 개발자들의 눈길을 가장 크게 끄는 기능은 바로 SQL 서버 데이터베이스의 테이블에 캐시 종속성을 지정할 수 있는 기능이다. 이 기능을 이용하면 개발자는 테이블의 데이터가 변경되는 그 즉시 캐시가 갱신되도록 캐싱 정책을 세울 수가 있게 된다.

또한 ASP.NET 2.0에서는 개발자가 다양한 방식으로 웹 사이트와 웹 페이지를 사용자 정의할 수 있다. ASP.NET 2.0에서 제공하는 프로필(Profile) API를 사용하면 개별 사용자용 속성 값들을 자동적으로 할당 및 추적할 수 있는 기능을 제공할 수 있기 때문이다. 프로필 클래스는 기존 세션(Session) 변수의 역할과 다소 비슷하다고 생각하면 이해가 용이하다. 하지만 세션에 비해 성능적으로도 뛰어나고, 개발자가 다루기에도 훨씬 직관적이기에 더욱 매력적으로 느껴질 것이다.

프로필 클래스는 또한 ASP.NET 사용자 개별화(Personalization)의 일부이기에 이를 적절히 이용하면 ASP.NET 2.0에서 새롭게 제공되는 포탈 프레임워크 기능인 웹 파츠(Web Parts)와 연계할 경우 놀랄만한 사용자 정의 기능을 제공할 수 있게 된다. 즉 ASP.NET 2.0의 프로필과 웹 파츠를 이용하여 사이트를 제작할 경우에는 사용자가 브라우저 내에서 그들만의 페이지 구성 및 레이아웃을 꾸밀 수 있게끔 웹 애플리케이션을 구성할 수 있다는 이야기이다.

별로 놀랍지 않은가? 아마도 그럴 것이다. 그렇게 작성된 결과가 구체적으로 어떤 모습일지가 머리 속에 잘 그려지지 않았을 테니 말이다. 그렇다면 백문이 불여일견이다. 그렇게 꾸며진 사이트를 직접 눈으로 본다면 아마 이해하기가 더 쉬울 것이다. MS MSN 사이트에 접속하여, My MSN 기능을 이용해보라. 바로 그와 동일한 기능을 ASP.NET 포탈 프레임워크와 프로필을 이용하면 대단히 쉽게 제작할 수 있다는 것이니 말이다(<화면 6>).

사용자 삽입 이미지
<화면 6> My MSN 기능은 ASP.NET 포탈 프레임워크 기능과 유사한 모습


www.msn.com에서 로그인을 하고, My MSN으로 가면 각 사용자는 자신이 원하는 대로 컬럼 창을 추가하거나, 위치시킬 수 있다. 뿐만 아니라 각 창을 드래그 앤 드롭으로 이동시킬 수도 있다.

클라이언트 스크립트를 즐겨 다루는 이들은 알겠지만 이 기능은 직접 개발자가 작성할 경우, 스크립트로 상당히 복잡한 로직을 작성해서 처리해야만 한다. 이로 인해 스크립트를 상당히 잘 다루지 못하면 구현하기가 대단히 어려운 기능이기에 개발 중인 웹 애플리케이션에 이러한 기능을 적용한다는 것은 대부분의 경우 마음만인 경우가 많았을 것이다.


ASP.NET 2.0의 포탈 프레임워크와 개별화 기능을 이용하면 이 또한 쉽게 구현이 가능하다. 뒷단에 존재하고 있을 수많은 클라이언트 스크립트 기법과 기반 구조를 이해하지 않고서도 말이다.

이를 위한 기반 구조를 제공해 주는 것이 ASP.NET 포탈 프레임워크이며, 그 중 사용자마다의 설정을 유지할 수 있도록 도와주는 기능이 개별화의 프로필 클래스이다. 앞에서도 잠깐 이야기했지만 프로필 클래스가 제공하는 기능은 기존에 세션 객체를 통해서 개발자가 각 개인의 정보를 유지했던 것과 유사한 것이라 할 수 있다. 하지만 성능적으로나 사용성 측면에서 보았을 때 세션을 이용하는 것보다 상당히 낫다(물론 이 부분은 논란이 있을 수 있으므로, 상황에 따라 다를 수도 있다는 전제를 추가적으로 덧붙여 두도록 하겠다).

트리뷰와 메뉴 컨트롤
ASP.NET 2.0에서는 또한 상당히 많은 신인 컨트롤들이 새로이 데뷰하고 있기도 하다. 그 중 우리의 눈길을 끄는 대표적인 컨트롤로는 트리뷰(TreeView) 컨트롤과 메뉴 컨트롤이 있는데, 이들은 사용하기도 매운 쉬울 뿐만 아니라 자체 스타일 기능이 내장되어져 있어서 꾸미기에도 매우 쉽다는 장점을 갖고 있다.

트리뷰의 경우는 ‘자동 속성’ 기능을 이용해서 디자인을 최신의 MS 스타일로 쉽게 작성할 수 있으며, 메뉴 컨트롤의 경우는 클라이언트 스크립트에 대한 부담 없이 쉽게 동적으로 나타나는 메뉴를 구성할 수 있다(<화면 7>). 모든 복잡한 내부 처리는 ASP.NET 2.0이 대신해 주고 있는 것이다.

사용자 삽입 이미지
<화면 7> 트리뷰 컨트롤과 메뉴 컨트롤의 모습


ASP.NET 2.0에서 개발자들이 반가워할 만한 또 다른 소식은 2.0부터는 다른 페이지로의 전송(페이지 교차 포스팅, Cross-Page Posting)이 가능하게 된다는 것이다. 물론 ASP.NET 1.x 버전에서도 다른 페이지로 데이터를 전송하는 것이 불가능하지는 않았었다. 웹 폼을 이용하지 않고 Html 폼을 이용한다면 말이다.

하지만 그렇게 하게 되면 ASP.NET의 기반 서비스를 전혀 이용하지 않는 것이 되므로(ASP.NET을 도입하는 의미가 전혀 없게 되기에) 사용이 권장되지 않았다. 이로 인해 특별한 이유가 있지 않은 한 ASP.NET 1.x에서는 기본적으로 웹 폼은 포스트백(자기 자신 페이지로의 전송)을 기본 원칙으로 했다. 이는 ASP.NET 2.0에서도 달라지지 않았지만, 2.0은 개발자의 목소리에 경청을 한 덕분인지 추가적으로 교차 페이지 전송도 지원한다. 이로써 웹 개발자는 여러 페이지에 걸쳐서 어떤 프로세스를 수행할 수 있게 된 것이다.

페이지 교차 포스팅을 하기 위한 간단한 방법은 버튼 컨트롤의 PostBackUrl 속성을 이용하는 것이다. 버튼의 PostBackUrl 속성에 이동할 페이지 명을 지정하면, 해당 버튼이 클릭될 경우에는 그 페이지로 교차 전송이 일어나게 된다. <리스트 3>은 페이지 교차 포스팅을 요청하는 버튼 컨트롤의 소스를 보여주고 있다. 소스 코드 중 굵은 부분에 주목하라(샘플에서의 현재 페이지 이름은 PageOne.aspx이다).

 <리스트 3> PageOne.aspx
사용자 삽입 이미지

< %@ Page Language="VB" AutoEventWireup="false" CompileWith="PageOne.aspx.vb"
ClassName="PageOne_aspx" %>
< html>
< head runat="server">
< link href="site.css" type="text/css" rel="stylesheet" />
< /head>
    < body>
        <form id="form1" runat="server">
                 < asp:DropDownList ID="Friends" Runat="server" >
                 < asp:ListItem >김태영</asp:ListItem>
                 < asp:ListItem >최용기</asp:ListItem>
                 < /asp:DropDownList >
                 < asp:Button ID="btnCrossPage" Runat="server" Text="Cross-Page Posting" PostBackUrl="PageTwo.aspx" / >
                 < p >선택 항목 : >asp:Label ID="Msg" Runat="server" Text="">< /asp:Label >< /p >
        < /form >
    < /body >
< /html >
사용자 삽입 이미지

페이지 교차 포스팅의 대상이 되는 페이지(샘플의 경우 PageTwo.aspx)는 반드시 지시문(Directive) 구역에 @PreviousPage를 지정해 주어야 한다. 자신이 참조할 이전 페이지의 형식이나 경로를 지정해 줘야만 현재의 페이지에서 이전 페이지의 멤버들에 접근이 가능하게 되기 때문이다. <리스트 4>는 @PreviousPage 지시문을 추가적으로 설정하고 있는 두 번째 페이지의 HTML 소스를 보여주고 있다.
 <리스트 4> PageTwo.aspx
사용자 삽입 이미지
<%@ Page Language="VB" AutoEventWireup="false" CompileWith="PageTwo.aspx.vb" ClassName="PageTwo_aspx" %>
<%@ PreviousPageType VirtualPath="~/PageOne.aspx" %>
<html>
<head runat="server">
    <link href="site.css" type="text/css" rel="stylesheet" />
</head>
<body>
        <form id="form1" runat="server">
                 <p>PageOne에서 선택한 항목 : <asp:Label ID="Msg" Runat="server" /></p>
        </form>
</body>
</html>
사용자 삽입 이미지

그리고 <리스트 5>는 두 번째 페이지(PageTwo.aspx)의 코드 비하인드에서 어떻게 이전 페이지(PageOne.aspx)의 DropDownList 컨트롤에 접근하는지 그 방법을 보여주고 있는데, 이는 Page 개체의 PreviousPage 속성 객체를 통해서 가능하다. <화면 8>은 이러한 동작의 결과를 보여준다.
 <리스트 5> PageTwo.aspx의 코드 비하인드 소스
사용자 삽입 이미지
Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim ddl As New DropDownList
        ddl=CType(Page.PreviousPage.FindControl("Friends"), DropDownList)
        Msg.Text = ddl.SelectedValue
End Sub
사용자 삽입 이미지

사용자 삽입 이미지
<화면 8> 페이지 교차 포스팅의 실행 모습


ASP.NET 2.0이 제공하는 편리함은 개발 측면에만 한정된 것이 아니다. 관리적인 측면에서도 ASP.NET은 진보된 편리성을 제공하는데, 이전 ASP.NET 1.x 버전의 경우는 웹 애플리케이션 관리를 위해서 Web.config라는 XML 파일을 직접적으로 변경하여야 했던 반면, ASP.NET 2.0에서는 IIS 내에 ASP.NET 설정 구성을 위한 UI가 포함됨으로써 더욱 쉽게 사이트를 관리할 수가 있게 되었다(<화면 9> 참고).

사용자 삽입 이미지
<화면 9> IIS와 통합된 ASP.NET 2.0 구성 윈도우


또한 웹 어드미니스트레이션 툴(Web Administration Tool)이라는 웹 애플리케이션 관리 사이트를 제공해 줌으로써 여러 웹 사이트 관련 관리를 용이하게 해 준다. 여기서 제어할 수 있는 것들로는 보안, 프로필, 애플리케이션 환경 설정, 프로바이더 환경 설정 등이 있다(<화면 10> 참고).

사용자 삽입 이미지
<화면 10> ASP.NET 웹 사이트 관리도구


지금까지 간략하게 ASP.NET 2.0의 몇몇 특징들을 살펴보았는데, 앞에서 설명한 많은 기능들은 ASP.NET 2.0에서 제공되는 진보된 기능들의 일부에 불과할 뿐이다. 지금까지의 이야기로 새로운 기술에 대한 기대감과 반가움이 교차하는 사람들은 이 글을 모두 읽은 뒤에 MSDN 사이트로 이동하여, 그 멋진 모습들을 더 구체적으로 살펴보길 권한다. 비록 영어의 압박이 느껴진다 해도 내용 자체는 매우 재미있을 것이다. 필자가 꼭 읽어보라고 권하고 싶은 컬럼은 ASP.NET 인터널(Internals)이다.

VS.NET 2005, 웹 개발자 중심의 개발 도구로 진화
현재 필자는 이 글을 작성하는 것에 더하여, 11월과 12월에 걸쳐 MSDN 세미나를 통해서 ASP.NET 2.0에 대한 내용을 발표하고 있기도 하다. 세미나에서는 이 글에서는 간략하게 소개할 수밖에 없었던 내용들을 실제 데모와 함께 조금은 구체적으로 파고들어 진행했는데, 세미나를 경청한 개발자들 대부분의 피드백은 ‘기대가 된다’였다. 그리고 ASP.NET 2.0의 이러한 진보에 맞춰 VS.NET은 어떤 편리한 기능들을 제공하려고 준비 중에 있는지 궁금해 하는 사람들이 많았다. 그래서 그 부분에 대한 이야기도 이 자리에서 조금 같이 나누어 볼까 한다.

최고의 집을 짓기 위한 자재와 기반은 ASP.NET 2.0이 모두 준비해 주었다. 그렇다면 이제 개발자의 입장에서 남은 것은 어떤 도구로 집을 지을 것인가 일 것이다. 맨 손으로 집을 짓는 것은 아무래도 무모해 보인다. 그렇게 여유로운 프로젝트는 사실 현실 세계에서는 존재하지 않을 테니 말이다. 그러한 이유로 많은 개발자들이 닷넷(ASP.NET 포함) 프로그래밍을 위해서 VS.NET을 선택해 왔다. VS.NET의 새로운 버전은 2005로써 ASP.NET 2.0의 등장과 발맞추어 출시될 예정에 있다. 현재는 베타 버전이 인터넷을 통해서 배포되고 있다.

VS.NET 2005에서도 웹 개발자들을 위한 많은 보강이 있었다. 개발자들이 불편하다고 생각했던 많은 부분들이 개선되었으며, 개발자 각각이 자신의 취향에 맞게 툴을 설정할 수 있는 옵션들도 상당히 많이 제공되고 있다. 무엇보다 가장 크게 눈에 띄는 부분은 더 이상 VS.NET이 웹 서버에 의존적이지 않다는 부분이다. VS.NET은 웹 페이지 실행시 자체적으로 보유하고 있는 가상 웹 서버(이전 버전의 카시니와 유사)를 먼저 구동시키고 그 가상 서버에서 웹 페이지를 실행하게 한다. 그리고 가상 웹 서버는 VS.NET을 닫는 순간 모두 같이 해제된다.

이것은 큰 의미를 지닌다. 왜냐하면 이제 개발자는 더 이상 IIS에 의존적이지 않아도 되며, 그에 따라 웹 파일들의 관리도 상당히 간단해지고 용이해지기 때문이다.

예전에는 프로젝트 파일과 실제 웹 파일들이 서로 다른 폴더에 형성됨으로 해서(설정을 바꾸지 않았다면, 웹 파일들은 VS.NET에 의해 자동적으로 C:\inetpub\wwwroot에 놓여진다) 관리 측면에서 다소 혼란스러움이 있었지만, 이제는 반드시 가상 웹 애플리케이션으로 특정 디렉터리를 설정하지 않아도 특정 폴더를 웹 폴더처럼 만들어 개발할 수 있게 되었기 때문에 더 이상 웹 애플리케이션을 위한 파일들을 C:\inetpub\wwwroot에 올릴 필요도, 각 파일들을 관리하기 위해서 폴더를 이리 저리 돌아다닐 필요도 없게 되었다(<화면 11> 참고).

사용자 삽입 이미지
<화면 11> VS.NET에서 가상 웹 개발 서버를 자체 보유 및 가동하는 모습


초보자를 위한 스타터 킷 사이트
또한 초보 개발자를 위해서 스타터 킷 사이트가 템플릿으로 제공되는데, <화면 12>처럼 『새 웹 사이트 | Personal Web Site Starter Kit』을 선택하면 자동으로 자신의 소개 및 이미지 갤러리를 제공하는 심플한 수준의 웹 사이트가 자동으로 생성된다. 겉으로 보기엔 단순해 보일 수 있지만, 기능적으로는 제법 쓸만하게도 사용자 가입·인증·보안처리까지 다 되어있는 훌륭한 사이트이다.

자동 생성된 사이트의 소스를 살펴보면서 소스 분석을 해보는 것은 초보자에게 상당한 도움이 될 것이다. 장담컨대 소스 분석을 하다 보면 여러분은 반드시 놀라게 될 것이다. 왜냐하면 갖출 것은 어느 정도 갖춘 규모의 개인 사이트임에도 전체 소스 코드는 단 30 줄도 안 되기 때문이다. 퍼스널 웹 사이트 스타터 킷은 ASP.NET 2.0팀의 Codeless 목표가 ASP.NET 전반적으로 상당 부분 녹아있음을 입증해 주는 좋은 예이다.

사용자 삽입 이미지
<화면 12> Personal Web Site Starter Kit


또한 VS.NET 2005부터는 하나의 프로젝트에서 다중 언어를 사용하는 것도 지원된다(사실 하나의 애플리케이션에서 다중 언어를 사용하는 것은 이전 1.x 버전에서도 가능하였다. 단지, VS.NET이 그것을 지원하지 않았을 뿐이다). 뿐만 아니라 프로젝트에서 페이지 단위로 컴파일을 하는 것도 가능하다. 하나의 프로젝트는 반드시 하나의 DLL로 빌드 되었던 이전의 불합리함을 완전히 개선한 것이다.

디자인 측면의 보완
디자이너 측면에서도 많은 부분이 보완되었는데, VS.NET 2005는 더 이상 개발자가 작성해 놓은 HTML을 자동으로 재정렬하여서, 기껏 들여쓰기를 한 개발자의 마음을 더 이상 아프게 하지 않는다. 또한 도구 상자로부터 컨트롤을 드래그 앤 드롭 하여 웹 폼에 컨트롤을 올려놓는 방식이 코드 뷰에서도 가능하게 되었다는 점도 재미있다.

또한 기쁜 소식은 VS.NET 2005에서는 인텔리센스 기능이 완전하게 제공된다는 것이다. HTML 뷰에서도, Web.Config에서도 이제는 인텔리센스 기능이 지원된다. ASP.NET 1.x 시절에는 많은 개발자들이 이러한 부분에서 인텔리센스 기능이 지원되지 않아 불편해 했었다. 더욱 인텔리센스 기능이 지원되도록 직접 작업을 한 개발자들도 있었다.

또한 VS.NET 2005에서는 웹 애플리케이션의 쉬운 복사 및 배포를 위한 기능들도 제공된다. <화면 13>과 <화면 14>에서 볼 수 있듯이, 로컬 파일 시스템이나 FTP, IIS, 원격 웹 사이트로의 배포가 클릭만으로 가능하도록 편리한 방법들을 제공하고 있는 것이다.

사용자 삽입 이미지
<화면 13> 웹 사이트 복사하기


사용자 삽입 이미지
<화면 14> 웹 애플리케이션 퍼블리싱하기


그 외에도 소스 작성과 관계되어 수많은 편리한 기능들을 VS.NET 2005는 제공하고 있지만, 세세한 부분은 차후 정식 버전이 발표된 다음에 알아보는 것이 좋을 듯 하여 말을 아끼려 한다. 아직은 베타 1 버전이기에 베타 2와 RTM을 거치면서 사소한 기능적인 변경이 있을 수 있기 때문이다.

이번 글은 ASP.NET 베타 1을 기반으로 하여 작성된 것이기에, 정식 버전이 나오면서 이 글에서 설명한 기능들 중 일부에 변화가 있을 수 있다는 점은 기억하도록 하자. 현재의 일정대로라면 내년 중반 즈음에 ASP.NET 2.0은 정식으로 세상에 등장하지 않을까 싶다.

게으른 모습을 경계하라
ASP.NET 2.0은 다소 불안하게 느껴지기도 했던 ASP.NET의 미래에 대한 확실한 청사진을 제시하고 있다. 스마트 클라이언트가 세상을 지배하고 곧 ASP.NET은 사라지게 될 것이라는 루머 속에서 자신의 강화된 모습을 제시하여 ASP.NET의 역할이 어떤 것인지를 강하게 피력하고 있는 것이다.

인터넷을 하기 위해서 브라우저를 사용하고, 인터넷을 위한 데이터 기반이 HTML인 이상 ASP.NET은 웹 애플리케이션 개발에서 빠질 수 없는 기술이다. 그리고 그러한 자신의 위치에서 모든 웹 개발자들이 필요로 했던 대부분의 공통적인 기능들을 ASP.NET 2.0은 제공하고 있다.

어쩌면 웹 개발자들이 해야 할 일이 없어지는 것은 아닐까 우려하는 목소리도 나오겠지만, 그것은 우려해야 할 소식이 아니라 기뻐해야 할 소식이다. 반복적인 UI 작업으로 인해, 자신이 코더인지 개발자인지에 대한 정체성 혼란을 한번이라도 느껴봤던 개발자라면 이번 ASP.NET 2.0을 통해서 진정한 개발자로 거듭날 수 있는 기회를 붙잡게 된 것이다.

물론 모든 것은 자신의 마음에 달려있고, 자신이 많은 부분을 노력해야 하겠지만, 이젠 페이지의 UI, 컨트롤의 특정 기능지원 여부로 끙끙대는 시간보다는 비즈니스 로직의 개발 및 클래스 설계, 패턴 분석 쪽으로 더 많은 시간을 가질 수 있게 될 것이다. 코더의 역할은 ASP.NET 2.0이 상당 부분 책임져 줄 것이기 때문이다.

다만 ASP.NET 2.0이 제공하는 편리함이 오히려 개발자를 나태하게 만들 수도 있다는 부분은 다소 우려스러운 부분이다. 그 점에서 우리는 나태한 개발자가 되지 않도록 노력해야 한다. 기술의 편리함, 도구의 편리함은 인간을 돕기도 하지만, 그만큼이나 게으르게도 하니 말이다. 꾸준한 노력을 마음에 품고, 시야를 조금씩 더 넓혀 나가자.

ASP.NET 2.0은 웹 개발자에게 그러한 시야를 가질 수 있도록 도와줄 것이다. 그리고 기술적인 고민의 시간들을 통해서 여러분은 진정한 개발자로 거듭날 수 있을 것이다.@


* 이 기사는 ZDNet Korea의 제휴매체인마이크로소프트웨어에 게재된 내용입니다

 

김태영 (Taeyo.net 사이트 운영자)

2005/03/04

 

사용자 삽입 이미지

 

원문 :http://www.zdnet.co.kr/techupdate/lecture/asp/0,39024946,39133971,00.htm

  Comments,     Trackbacks
닷넷 프레임워크 2.0과 개발 언어의 변화

닷넷 프레임워크 2.0과 개발 언어의 변화

개발 환경의 새로운 변화, 비주얼 스튜디오 2005 분석

 

연재순서
1회.닷넷 개발의 새로운 변화, 비주얼 스튜디오 2005 맛보기
2회.닷넷 프레임워크 2.0과 개발 언어의 변화
3회. 웹 애플리케이션 개발의 진화, ASP.NET 2.0

 

2000년 봄 NGWS(Next Generation Windows Services)라는 이름으로 소개됐던 MS의 차세대 개발 환경이 오랜 베타 기간의 높은 관심을 뒤로 하고, 2002년 닷넷 프레임워크 1.0·비주얼 스튜디오 닷넷 2002와 함께 세상에 나타났다.

그 후 마이너 업그레이드인 닷넷 프레임워크 1.1과 비주얼 스튜디오 2003으로 안정화됐고, 이제는 2005년 출시를 위해 현재 닷넷 프레임워크 2.0과 비주얼 스튜디오 2005 베타1이 출시됐다. 베타 시절의 열기가 실제 출시 시점의 IT 경기 급랭으로 다소 부진하지 않느냐는 의견이 있었지만 기업 환경을 중심으로 2년간 성장세를 올리고 있다. 비록 북미 지역으로 제한되어 있지만 2003년말을 기준으로 닷넷 개발자가 자바 개발자를 넘어서고 있다(<그림 1>).

국내에서는 아직 닷넷의 점유율이 자바에 비해 낮지만 빠른 시간에 바뀔 것으로 예상되고 있다. 이제 본격적으로 MS의 개발 환경의 변화에 대해 알아보겠다.

사용자 삽입 이미지
<그림 1> 닷넷 플랫폼 채택률(2002.2/4분기~2003년 2/분기)


닷넷 프레임워크 2.0의 변화
최근 들어 많은 개발자들이 MS의 개발 환경은 닷넷 프레임워크와 비주얼 스튜디오 닷넷 개발 툴만으로는 2% 부족하다는 것을 이야기하고 있다. 이 2%에 어떤 것이 포함되어 있기 때문에 닷넷 프레임워크와 비주얼 스튜디오만으로는 힘들다는 것인지 한 번 살펴보겠다.

닷넷은 단순한 개발 프레임워크라기보다는 빈틈없는 컴퓨팅 환경을 구축하기 위한 웹 서비스 인프라 시스템이다. 윈도우와 엔터프라이즈 서버를 통해 운영 인프라 구조를 제공하고, 기존 웹 서비스인 ASMX와 WSE(Web Services Enhancements), 롱혼의 인디고(Indigo)를 위해 연결된 시스템 환경이 된다. 그리고 서비스, 아키텍처 가이던스(Patterns & Practices,
msdn.microsoft.com/architecture/patterns/default.aspx), 디바이스, 비즈니스 응용, 정보 근로자 도구와 인프라를 종합적으로 지원하고 있다.

이렇게 복잡한 환경을 지원하니 개발자들이 닷넷 개발 환경에 대해 혼란을 느끼게 되고 닷넷이 도대체 무엇인지 잘 모르겠다는 이야기를 많이 하게 된다.

혼란(?)을 줄이기 위해 우선 닷넷 프레임워크에 대해서만 살펴보자. 닷넷 프레임워크는 CLS(Common Language Specification)를 지원하는 언어(C#, VB.NET, J#, 매니지드 C++ 등)로 만들어진 IL(Intermediate Language)로 작성된 코드를 실행하는 환경이다.

닷넷 프레임워크 2.0은 크게 CLR 2.0, 윈도우 폼(Windows Forms) 2.0, ASP.NET 2.0, 닷넷 컴팩트 프레임워크 2.0, ADO.NET 2.0으로 구분할 수 있다. CLR 2.0을 제외한 다른 내용은 BCL에 포함되는 라이브러리 성격이 강하므로 여기서는 CLR 2.0을 중심으로 살펴보겠다. 닷넷 2.0의 큰 변화를 살펴보면 다음 세 가지 영역으로 구분할 수 있다.

◆ 플랫폼 확장 : SQL 서버와 통합, 64비트 프레임워크 지원

◆ 플랫폼 개선 : 성능 향상, RAD 디버깅, CLR 보안 강화

◆ 플랫폼 혁신 : 제너릭(Generics) 지원, BCL 강화


먼저 SQL 서버와의 통합으로 가질 수 있는 장점은 다음과 같다.

◆ 닷넷 프레임워크의 개발 모델을 데이터베이스 층에도 바로 적용할 수 있다.

◆ 비즈니스 로직을 개발 층으로 쉽게 마이그레이션할 수 있다.

◆ 데이터베이스 확장을 안전하고 쉽게 진행할 수 있다.


결론적으로 저장 프로시저와 트리거(Triggers), 데이터 타입의 정의를 관리되는 코드(managed code)로 할 수 있으므로 훨씬 개발 지향적인 데이터베이스 환경을 제공해준다.

사용자 삽입 이미지
<그림 2> SQL 내의 CLR 기능


64비트 프레임워크 지원으로 가질 수 있는 장점으로는 x86-64와 IA-64 아키텍처·관리되는 실행 환경·WoW64 지원을 들 수 있다. 현재 64비트 프레임워크 역시 베타1이 나와 있는 상태이고 비주얼 스튜디오 2005를 설치할 때 인텔과 AMD CPU를 선택해 설치할 수 있다. WoW64 지원으로 64비트 환경에서 32비트 환경 구동이 가능하며 개발, 배포, 디버깅 또한 64비트와 32비트를 선택할 수 있다.

성능 역시 크게 향상됐다. 기존 CLR 1.1에 비해 CLR 2.0은 애플리케이션 구동 시점의 IL 코드 병합과 구동에서 좋은 성능을 보여주며, 한 번 JIT(Just In Time) 컴파일된 코드를 디스크에 저장한 후 사용함으로써 성능이 향상됐다. 그리고 APPDomain Remoting에서 수십 배 이상, 그리고 델리게이트(delegate) 처리에서 두 배의 성능을 보여준다. UTF-8 인코딩은 여덟 배 정도의 차이를 보이고 있다.

또한 디버깅 모드로 실행시 코드 편집(클래스 내의 필드와 메쏘드)과 계속 기능을 통해 디버깅 환경이 더욱 개선됐으며, CLR 보안 역시 강화됐다. PKCS7과 XML 암호화 기능이 추가됐으며 X509 인증이 추가됐다. 그 외에도 권한 허가 계산기 기능이 ClickOnce와 통합되어 사용할 수 있다.

이와 같은 변화가 있지만 다음에 소개할 제너릭 기능이 가장 큰 변화이며 기능 또한 강력하다 할 수 있겠다. 제너릭 기능에 대해서는 좀 더 자세히 살펴보겠다.

제너릭
2002년에 열린 OOPSLA(Object-Oriented Programming, Systems, Language, and Applications)에서 C#의 아버지인 Anders Hejlsberg가 다음 버전의 C#에 추가될 새로운 특징들로 제너릭, 익명 메쏘드(anonymous method), 이터레이터(iterator), Partial Types에 대해 이야기했고 이러한 기능들이 C# 2.0(Generic C#)에서 구현됐다(닷넷 프레임워크 1.×에서도 제너릭은 이용할 수 있으며 이는 CLIX라는 이름으로 배포되고 있다). 잠시 C#의 디자인 목표에 대해 알아보자. C#의 대부분의 기능은 네 가지 디자인 목표를 기반으로 만들어졌다.

◆ 언어에서 값 및 참조 형식을 사용하는 방식을 간소화하며 통합된 형식의 시스템

◆ XML 주석, 특성, 속성, 이벤트 및 델리게이트와 같은 기능을 통해 구축된 구성 요소 기반의 디자인

◆ 안전한 포인터 조작, 오버플로 검사 등과 같은 C# 언어의 고유한 기능을 통해 구축

◆ 개발자의 생산성을 향상시키는 실용적인 언어 구문(예 : foreach, using 명령문) 사용

 

그럼 이제 이 네 가지 요소에 대해 제너릭을 중심으로 알아보겠다.

사용자 삽입 이미지
<그림 3> 2004년 샌 디에고(San Diego)에서 있었던 테크애드 2004(TechEd 2004)에서 C#의 아버지인 Anders Hejlsberg를 만나다.


재사용성 높인 제너릭
애플리케이션의 복잡도가 심해질수록 개발자에게는 기존 객체 기반 코드를 최대한 다시 사용해야 할 방법이 중요해진다. C# 2.0에서는 제너릭이라는 기능을 사용한다. C#에는 형식이 안전한 제너릭이 포함되어 있다. 이 제너릭은 C++의 템플릿과 유사하지만 구문이 약간 다르며 구현 방식도 크게 다르다.

C# 1.0에서의 클래스 작성
C# 1.0에서는 개발자가 기본 개체 형식의 인스턴스에 데이터를 저장해 미약한 기능의 제너릭 형식을 만들 수 있다. C#의 모든 개체는 기본 개체 형식에서 상속되고 통합된 닷넷 형식 시스템의 박싱(boxing : 자동 변환) 및 언박싱(unboxing) 기능이 있으므로 프로그래머는 참조 및 값 형식 모두를 개체 형식의 변수에 저장할 수 있다.

하지만 참조 형식, 값 형식 및 기본 개체 형식 사이를 변환하는 데 심각한 성능 저하가 발생하게 된다. 이러한 기능을 설명하기 위해 예를 하나 들어 보겠다. 다음 예는 마이크로소프트 연구소의 공식 Generics for C# 팀의 홈페이지인 Gyro(
research.microsoft.com/projects/clrgen)에 있는 Andrew Kennedy와 Don Syme이 작성한 「Design and Implementation of Generics for the .NET Common Language Runtime」(research.microsoft.com/projects/clrgen/generics.pdf)의 예를 사용했다(<리스트 1, 2>).

 <리스트 1> 객체 기반의 스택 예
사용자 삽입 이미지

class Stack {
   private object[] store;
   private int size;
   public Stack()
      store=new object[10]; size=0;
   }
   public void Push(object x) {
      if (size>=store.Size) {
         object[] tmp = new object[size*2];
         Array.Copy(store,tmp,size);
         store = tmp;
      }
      store[size++] = x;
   }
   public object Pop() {
      return store[--size];
   }
   public static void Main() {
      Stack x = new Stack();
      x.Push(17);
      Console.WriteLine((int) x.Pop() == 17);
   }
}
사용자 삽입 이미지


 <리스트 2> 제너릭 스택 예
사용자 삽입 이미지

class Stack<T> {
   private T[] store;
   private int size;
   public Stack()
      store=new T[10]; size=0;
   }
   public void Push(T x) {
      if (size>=store.Size) {
         T[] tmp = new T[size*2];
         Array.Copy(store,tmp,size);
         store = tmp;
      }
      store[size++] = x;
   }
   public T Pop() {
      return store[--size];
   }
   public static void Main() {
      Stack<int> x = new Stack<int>();
      x.Push(17);
      Console.WriteLine(x.Pop() == 17);
   }
}
사용자 삽입 이미지

앞의 코드에서는 Push 및 Pop의 두 가지 작업을 수행하는 간단한 스택 형식을 만든다. Stack 클래스는 개체 형식의 배열에 해당 데이터를 저장하고 Push 및 Pop 메쏘드는 기본 개체 형식을 사용하여 각각 데이터를 받고 반환하게 된다. 사용자 지정 형식을 스택에 푸시할 수 있다.

하지만 프로그램에서 데이터를 검색해야 하는 경우 기본 개체 형식인 Pop 메쏘드의 결과를 명시적으로 캐스팅해야 한다. 정수 등과 같은 값 형식이 Push 메쏘드에 전달되면 런타임은 이 형식을 참조 형식으로 자동 변환(boxing)한 다음 내부 데이터 구조에 저장한다.

정수 등과 같은 값 형식을 스택에서 검색하려면 Pop 메쏘드에서 얻은 객체 형식을 값 형식에 명시적으로 캐스팅(unboxing)해야 한다. 값 및 참조 형식 사이의 박싱 및 언박싱은 특히 부담되는 작업이 될 것이다.

C#의 제너릭은 내부 알고리즘이 동일하게 유지되고 내부 데이터 형식이 최종 사용자 설정에 따라 다를 수 있도록 매개 변수 있는 형식을 통해 구현한다. 만약 C++의 템플릿 기능을 사용해 본 독자라면 C++와 거의 동일한 방식으로 C#의 제너릭이 선언되므로 쉽게 이해할 수 있을 것이다. 일반적으로 기존 클래스 및 구조와 똑같이 만들 수 있으며 꺾쇠 괄호 표기법(< 및 >)을 사용하여 형식 매개 변수를 지정할 수 있다. 그렇다면 실제 위의 두 코드가 IL 코드로는 어떻게 다른지 한번 살펴보겠다(<리스트 3, 4>).

 <리스트 3> 객체 기반의 스택 IL 코드
사용자 삽입 이미지


.class Stack {
   .field private class System.Object[] store
   .field private int32 size
   .method public void .ctor() {
      ldarg.0
      call void System.Object::.ctor()
      ldarg.0
      ldc.i4 10
      newarr System.Object
      stfld class System.Object[] Stack::store
      ldarg.0
      ldc.i4 0
      stfld int32 Stack::size
      ret
   }
   .method public void Push(class System.Object x) {
      .maxstack 4
      .locals (class System.Object[], int32)
      .
      .
      .
      ldarg.0
      ldfld class System.Object[] Stack::store
      ldarg.0
      dup
      ldfld int32 Stack::size
      dup
      stloc.1
      ldc.i4 1
      add
      stfld int32 Stack::size
      ldloc.1
      ldarg.1
      stelem.ref
      ret
   }
   .method public class System.Object Pop() {
      .maxstack 4
      ldarg.0
      ldfld class System.Object[] Stack::store
      ldarg.0
      dup
      ldfld int32 Stack::size
      ldc.i4 1
      sub 

      dup
      stfld int32 Stack::size
      ldelem.ref
      ret
   }
   .method public static void Main() {
      .entrypoint
      .maxstack 3
      .locals (class Stack)
      newobj void Stack::.ctor()
      stloc.0
      ldloc.0
      ldc.i4 17
      box System.Int32
      call instance void Stack::Push(class System.Object)
      ldloc.0
      call instance class System.Object Stack::Pop()
      unbox System.Int32
      ldind.i4
      ldc.i4 17
      ceq
      call void System.Console::WriteLine(bool)
      ret
   }
}

사용자 삽입 이미지


 <리스트 4> 제너릭 스택 IL 코드
사용자 삽입 이미지

.class Stack<T> {
   .field private !0[] store
   .field private int32 size
   .method public void .ctor() {
      ldarg.0
      call void System.Object::.ctor()
      ldarg.0
      ldc.i4 10
      newarr !0
      stfld !0[] Stack<!0>::store
      ldarg.0
      ldc.i4 0
      stfld int32 Stack<!0>::size
      ret
   }
   .method public void Push(!0 x) {
      .maxstack 4
      .locals (!0[], int32)
      .
      .
      .
      ldarg.0
      ldfld !0[] Stack<!0>::store
      ldarg.0
      dup
      ldfld int32 Stack<!0>::size
      dup
      stloc.1
      ldc.i4 1
      add
      stfld int32 Stack<!0>::size
      ldloc.1
      ldarg.1
      stelem.any !0
      ret
   }
   .method public !0 Pop() {
      .maxstack 4
      ldarg.0
      ldfld !0[] Stack<!0>::store
      ldarg.0
      dup
      ldfld int32 Stack<!0>::size
      ldc.i4 1
      sub
      dup
      stfld int32 Stack<!0>::size
      ldelem.any !0
      ret
   }
   .method public static void Main() {
      .entrypoint
      .maxstack 3
      .locals (class Stack<int32>)
      newobj void Stack<int32>::.ctor()
      stloc.0
      ldloc.0
      ldc.i4 17
      call instance void Stack<int32>::Push(!0)
      ldloc.0
      call instance !0 Stack<int32>::Pop()
      ldc.i4 17
      ceq
      call void System.Console::WriteLine(bool)
      ret
   }
}
사용자 삽입 이미지

IL 코드 내에서 명시적으로 형식을 사용해 줌으로써 필요 없는 박싱과 언박싱을 줄여 주고 있는 것이 확연히 구분될 것이다. Generic 클래스가 컴파일되면 이 클래스는 일반 클래스와 실제로 차이가 없다. 결과는 메타 데이터 및 중간 언어(IL)일 뿐이다. 제너릭 형식의 IL은 제공된 형식 매개 변수가 값 형식 또는 참조 형식인지에 따라 다르다.

이외에도 제너릭 형식은 다양한 매개 변수를 지원하며 애플리케이션에서 형식 매개 변수의 멤버를 사용하여 프로그램의 제너릭 형식 내에서 명령문을 실행하도록 제약 조건을 주는 것도 가능하다. 그럼 C#의 제너릭과 다른 언어의 차이를 한번 알아보겠다.

C++ 템플릿은 C# 제너릭과는 표현 형식은 비슷하지만 실제는 현저히 다르다. C# 제너릭은 IL로 컴파일되므로 각각의 값 형식에 대해서는 런타임에, 참조 형식에 대해서는 한 번만 발생하게 된다. C++ 템플릿은 템플릿에 제공된 각 형식 매개 변수에 대한 특수화된 형식을 생성하는 코드 확장 매크로다. 따라서 C++ 컴파일러는 정수의 스택과 같은 템플릿을 발견하면 기본 형식으로서 정수를 내부적으로 포함하는 Stack 클래스로 템플릿 코드를 확장한다.

형식 매개 변수가 값 또는 참조 형식에 관계없이 코드 양을 감소시킬 수 있도록 링커를 디자인하지 않으면 C++ 컴파일러는 매번 특수화된 클래스를 만든다. 따라서 C# 제너릭에 비해 코드 양이 상당히 증가한다. 그리고 C++ 템플릿에서는 제약 조건을 정의할 수 없다. 그렇지만 C++ 템플릿은 그 자유로움이나 다양함에서 고급 C++ 개발자들의 총애를 받고 있다. C# 제너릭은 위에서 이야기한 C#의 디자인 목표를 충실히 이행하면서 C++의 템플릿보다 통합되고 실용적인 모습으로 구현됐다.

자바의 경우는 JDK 5.0에서 제너릭 기능을 추가하기로 했지만 성능 문제를 어떻게 극복할 것인지가 관건이 될 것 같다. 그리고 조금 늦은 감이 있지만 JDK 5.0에는 C#에서 볼 수 있는 박싱과 같은 기능이 추가로 들어가며, ADO.NET의 DataSet과 같은 비연결지향적인 DataSet 또한 추가한다고 한다.

닷넷 2.0에서는 C# 이외도 VB.NET과 매니지드 C++에서도 제너릭 기능을 지원하고 있다. 그 외의 제너릭의 장점으로는 다음과 같은 요소들을 들 수 있다.

◆ 코드 작성, 테스트 및 배포를 한 번에 수행할 수 있으므로 다양한 데이터 형식에 해당 코드를 재사용할 수 있다.

◆ 제너릭은 컴파일시 검사된다. 프로그램이 제공된 형식 매개 변수로 generic 클래스를 인스턴스화하는 경우 형식 매개 변수는 프로그램에서 클래스 정의에 지정한 형식으로만 사용할 수 있다.

◆ 제너릭 구현은 다른 형식의 구현과 비교해 보면 코드 양을 감소시킨다. 제너릭으로 형식화된 컬렉션을 만들면 각 클래스의 특정 버전을 만들 필요가 없으며 성능을 그대로 유지할 수 있다.

◆ 코드를 더 쉽게 읽을 수 있다.


이외에도 BCL(Base Class Library)에서의 Generic 컬렉션에 대해 알아보도록 하겠다. BCL에서는 다음과 같이 이미 구현된 클래스와 인터페이스를 제공하고 있다.

◆ System.Collections.Generic 클래스 : List<T>, Dictionary<K, V>, Stack<T>, Queue<T>

◆ System.Collections.Generic 인터페이스 : IList<T>, IDictionary<K, V>, ICollection<T>, IEnumerable<T>, IEnumerator<T>, IComparable<T>, IComparer<T>


이터레이터
이터레이터는 해당 요소에서 foreach 문이 반복되는 방식을 형식이 간단하게 선언할 수 있게 만들어 주는 것으로 이터레이터는 foreach 루프 구문의 논리적 구문으로 foreach 키워드 다음에 여는 괄호 및 닫는 괄호를 사용하여 함수와 유사하게 정의된다.

이터레이터는 프로그램 대신에 열거자 패턴을 구현하여 번거로운 작업을 처리한다. 클래스를 만들고 상태 시스템을 작성하는 것이 아니라 C# 컴파일러는 열거자 패턴을 사용하여 이터레이터에 작성한 코드를 적절한 클래스 및 코드로 변환한다. 이렇게 함으로써 이터레이터는 개발자의 생산성을 상당히 높여준다.

익명 메쏘드
익명 메쏘드는 유용한 언어 구문으로 프로그래머는 델리게이트에 캡슐화하고 나중에 수행할 수 있는 코드 블록을 만들 수 있다. 이 메쏘드는 lambda라는 함수형 언어의 개념을 기반으로 하며 LISP 및 파이썬과 개념적으로 비슷하다.

델리게이트는 메쏘드를 참조하는 객체로 C에서 이야기하는 함수 포인터다. 델리게이트가 실행될 때마다 이 델리게이트가 참조하는 메쏘드가 호출된다. 별도의 함수가 만들어지고 델리게이트에 의해 참조되고 델리게이트가 호출될 때마다 프로그램이 해당 함수를 호출한다. 함수 내에서 일련의 실행 단계가 수행된다.

익명 메쏘드를 추가하면 프로그램은 클래스에 대해 완전히 새로운 메쏘드를 만들 수 있으며 델리게이트에서 그 안에 포함된 실행 단계를 직접 참조할 수 있다. 익명 메쏘드는 실행 영역을 나타내는 중괄호 쌍이 있는 인스턴스화 문과 명령문 다음에 델리게이트를 인스턴스화하여 선언한다.

사용자 삽입 이미지
데이터 중심적 분산 프로그래밍을 위한 언어 Cω
사용자 삽입 이미지
 
사용자 삽입 이미지
사용자 삽입 이미지
Cω(코메가, COmega,
research.microsoft.com/Comega)는 실험실 언어이지만 현재 컴파일러를 구해 사용할 수 있다. Cω는 근래의 대표적 프로그래밍 분야인 데이터 중심적인 분산 프로그램을 위한 데이터 구조와 제어 구조를 제공하기 위해 설계됐으며, 동기적 혹은 비동기적 메쏘드를 지원하며, 언어에 데이터 지향적인 기능이 포함되어 있다. Cω가 C#이나 닷넷의 언어에 어떤 형태로 반영이 될지는 현재로서는 미지수이며, 앞으로 지켜봐야 할 것 같다.
사용자 삽입 이미지
사용자 삽입 이미지


익명 메쏘드는 클래스에서 선언한 변수뿐만 아니라 클래스가 상주하는 메쏘드에 선언된 지역 변수 또는 매개 변수를 참조할 수 있다. 또한 익명 메쏘드 문은 sender 및 e라는 매개 변수 두 개를 포함한다. 윈도우 폼의 Button 컨트롤 클래스의 Click 델리게이트의 정의를 찾아보면 델리게이트가 참조하는 모든 함수는 첫 번째는 형식 객체, 두 번째는 EventArgs 형식인 매개 변수 두 개를 포함해야 한다는 것을 알 수 있다.

익명 델리게이트가 발견되면 C# 컴파일러는 해당 실행 범위의 코드를 고유한 이름의 클래스 내에서 고유한 이름의 함수로 자동 변환한다. 코드 블록에 있는 델리게이트가 저장된 다음 참조(컴파일러가 생성한 개체 및 메쏘드)로 설정된다. 델리게이트가 호출되면 익명 메쏘드 블록은 컴파일러가 생성한 메쏘드를 통해 실행하게 된다.

Partial Types
Partial Types를 사용하면 대량의 소스 코드를 여러 개의 다른 소스 파일로 나눌 수 있다. 또한 시스템이 생성한 형식과 사용자가 작성한 형식을 분리할 수 있으므로 도구에서 생성한 코드를 간단하게 보충하거나 수정할 수 있다.

다음에 나타날 새로운 기술은 어떤 것일까

지금까지 간략하게나마 닷넷 2.0의 새로운 기능과 닷넷 2.0에서의 언어의 변화에 대해 살펴봤다. 언어나 개발 환경 또한 유기체와 같아서 지속적으로 변화하며 모방을 통해 새롭게 진화해 나간다는 것을 볼 수 있다. 결국 이러한 변화에 대응하지 못하게 되면 없어지지는 않지만 대중과 멀어지는 과거의 기술로 전락할 수밖에 없는 것이다. 지금 예측하기에는 무리겠지만 그럼 그 다음 변화는 어떻게 올 것인지 한 번 생각해 보는 것도 재미있을 것이다. @

* 이 기사는 ZDNet Korea의 제휴매체인마이크로소프트웨어에 게재된 내용입니다.

 

강성재 (한국MS)

2005/01/24

 

사용자 삽입 이미지

 

원문 :http://www.zdnet.co.kr/techupdate/lecture/dotnet/0,39024986,39133022,00.htm

  Comments,     Trackbacks
[메타 사이트 만들기] ① 닷넷으로 구현하는「블로거 집합소」

[메타 사이트 만들기] ① 닷넷으로 구현하는「블로거 집합소」

 

연재순서
1회. 블로거들의 집합소「메타 사이트 구현」
2회. RSS 수집 로봇 구현과 문제점 분석

 

메타 사이트는 블로그에 새롭게 업데이트된 내용을 다른 블로거들에게 알려주고, 블로거에게 더 많은 블로깅을 할 수 있는 일종의 항해일지 역할을 하는 사이트입니다. 거대한 네트워크에서 블로그들을 순회하며 새롭게 업데이트된 내용들을 찾아내 알려주는 메타 사이트는 거대한 웹 검색 엔진의 축소판이라고 부르기에 알맞지요.

이번 연재를 통해 이러한 블로그 정보를 수집하는 메타 사이트를 개발하는 과정에 대해 알아보도록 하겠습니다.

‘사람이 모이는 장소에는 장터가 생기고, 블로거들이 모이는 곳에는 메타 사이트가 생겨난다’는 정체불명의 명언(?)에서 볼 수 있듯, 메타 사이트는 블로거들에게 아주 중요한 커뮤니케이션 수단이 되고 있습니다. 메타 사이트는 블로그에서 지원하는 RSS 정보로부터 메타 정보를 읽어서 종합적인 블로그의 소식을 전해준다는 의미로 메타 사이트라 불립니다. 하지만 개인적으로는 그와 비슷한 의미를 가지고 있는 블로그 센터라는 좀 더 직관적인 단어를 좋아합니다.

이러한 메타 사이트의 작동 방식은 마치 작은 크기로 줄여놓은 검색 엔진 사이트와도 비슷하게 생각할 수 있습니다. 이번 시간에는 메타 사이트에 대한 소개와 메타 사이트와 수집 로봇 구성, 그리고 수집 로봇에 대한 여러 가지 방법들에 대해서 이야기해 보고자 합니다.

블로그의 정보를 수집하는 로봇
메타 사이트에서 블로그의 최신 정보를 알아내기 위해서는 우선 블로그와 메타 사이트간에 데이터 교환을 위한 방식이 필요하게 됩니다. 검색 엔진에서 사용하는 검색 로봇의 경우 이미 웹이라는 매체가 오래된 HTML 방식으로 구성되어 있었기 때문에 그에 맞는 검색이 가능하도록 로봇을 설계했습니다.

하지만 블로그의 경우 블로그의 내용을 손쉽게 읽을 수 있는 파일 규약을 지원하고 있으며 그러한 규약 중 대표적으로 사용되고 있는 것이 바로 RSS입니다. 덕분에 우리가 만들고자 하는 로봇은 단순히
XML형식으로 되어 있는 이 RSS 파일을 자유롭게 읽고 해석할 수 있으면 손쉽게 해결할 수 있습니다.

검색 로봇과 다른 점이라면 인터넷에 떠도는 많은 웹 페이지들 전체를 대상으로 하지 않는다는 점입니다. 인터넷에 있는 하나의 문서, 자료들도 각자의 저작권이 있는 저작물이며 이를 함부로 수집해서는 안 된다는 것입니다. 물론 이미 이용되고 있는 검색 엔진은 이를 간단히 검색 거부할 수 있는 기능을 지원한다는 명목 하에 대부분의 웹 사이트에서 정보를 수집하고 있지만, 최근 이러한 검색 엔진의 무분별한 자료 수집으로 인한 개인 정보 노출 등의 문제점을 보더라도 이러한 문제는 신중히 생각해야 한다고 생각합니다.

메타 사이트에서는 이러한 이유로 사이트에서 가입되어 있는 블로그의 정보만을 수집하며 언제든 수집을 원하지 않는 게시물에 대해서 수집을 거부할 수 있는 권한을 가지고 있어야 합니다. 물론 수집되는 블로그의 범위를 지금의 검색 엔진처럼 거대한 인터넷 전체로 확대한다면 앞으로 웹 사이트보다 더 많은 컨텐츠를 보유하게 될 블로그의 검색 엔진으로써 활약할 수 있는 프로그램을 만들 수 있지 않을까 합니다.

RSS 파일을 정복하자
블로그의 정보 수집에 있어서 가장 중요한 내용 중 하나인 RSS에 대해 이야기해 보도록 합시다. 이 RSS는 알고 있는 것과 같이 블로그의 정보와 최근 등록된 글들의 정보가 포함되어 있는 XML 파일입니다.

 <리스트 1> RSS 파일의 구조
사용자 삽입 이미지

<?xml version="1.0" encoding="euc-kr" ?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
    <channel>
        <title>하늘이의 생각나무</title>
        <link>http://www.in1983.com</link>
        <description>사랑하는 주영이와 알콩달콩 이야기</description>
        <item>
            <title>머리속 가비지 컬렉터 파워 온!!</title>
            <link>http://php.chol.com/~ppk314/tt/index.php?pl=386</link>
            <description> 글의 내용이 들어가나, 생략함 </description>
            <pubDate>Tue, 19 Oct 2004 23:54:00 GMT</pubDate>
        </item>
        ...
        <item>의 반복
...
    </channel>
</rss>
사용자 삽입 이미지

이 RSS 파일은 rss라는 루트 엘리먼트로 시작됩니다. 그리고 채널이라는 하위 엘리먼트를 가지고 있는 이곳에 블로그의 대한 정보들(블로그의 이름, 주소, 설명, 기타 정보들)이 포함됩니다. 그리고 여러 개의 아이템 엘리먼트들을 포함하고 있는데, 이들이 바로 블로그의 글에 대한 정보를 담고 있습니다.

메타 사이트에서 필요한 정보는 대부분 아이템 엘리먼트에 있으니 아이템 엘리먼트의 구조에 대해서 자세히 살펴보도록 하겠습니다.

사용자 삽입 이미지
<그림 1> RSS 파일의 구조 - item들의 구성


<그림 1>을 보면 RSS 파일의 구조에 아이템들의 구성을 볼 수 있습니다. 아이템에 있는 각각의 엘리먼트들은 <표 1>과 같은 의미를 가지고 있습니다.

사용자 삽입 이미지
<표 1> RSS 파일의 엘리먼트들의 의미


이러한 엘리먼트의 이름들은 RSS 버전에 따라서 약간의 차이들이 있으며 <표 1>에 표시한 몇 가지 종류의 엘리먼트 이외에도 많은 종류의 엘리먼트들이 존재하게 됩니다. 그리고 이미 여러 종류의 블로그 툴들이 개발되어 있고, 각자 조금씩 다른 엘리먼트를 조합하여 사용하고 있습니다.

 <리스트 2> 각각 다른 이름의 엘리먼트를 사용하는 item 엘리먼트들
사용자 삽입 이미지

<item>
    <title>머리속 가비지 컬렉터 파워 온!!</title>
    <link>http://php.chol.com/~ppk314/tt/index.php?pl=386</link>
    <description> 글의 내용이 들어가나, 생략함 </description>
    <pubDate>Tue, 19 Oct 2004 23:54:00 GMT</pubDate>
</item>

<item>
    <title>머리속 가비지 컬렉터 파워 온!!</title>
    <link>http://php.chol.com/~ppk314/tt/index.php?pl=386</link>
    <description> 글의 내용이 들어가나, 생략함 </description>
    <pubDate>2004-10-19 23:54:00</pubDate>
    <author>하늘이</author>
</item>

<item>
    <title>머리속 가비지 컬렉터 파워 온!!</title>
    <link>http://php.chol.com/~ppk314/tt/index.php?pl=386</link>
    <description> 글의 내용이 들어가나, 생략함 </description>
    <dc:date>2004-10-19T23:54:00+09:00</dc:date>
    <dc:creator>하늘이</dc:creator>
</item>
사용자 삽입 이미지

각각의 블로그 툴마다 다른 엘리먼트 이름을 사용하고 있습니다. 하지만 메타 사이트의 RSS 수집 로봇이 그러한 RSS의 모든 태그의 정보가 필요한 것은 아닙니다. 메타 사이트에서 필요한 일부 정보들만을 사용하게 되므로 <표 1>에서 정리한 정도의 정보들만을 수집하면 됩니다.

하지만 여기서 문제가 발생하게 되는데, 과연 각기 다른 엘리먼트들의 조합으로 되어 있는 RSS 파일들을 어떻게 처리하면 될까요? 각 블로그 툴의 종류별로 약간 다른 방식으로 RSS 파일을 읽어들이는 방법을 가장 첫 번째로 생각해볼 수 있을 것입니다.

하지만 그럴 경우 잘 알려지지 못해서 RSS 구조의 정보를 잘 모르고 있던 블로그들의 경우에는 어떤 방식으로 처리할까요? 바로 이러한 문제들을 해결하기 위해서 가장 효과적인 방법으로 여러 가지 엘리먼트를 동시에 지원하는 방식을 사용하고자 합니다.

예를 들어 pubDate와 의미가 비슷한 dc:date와 author는 dc:creator와 같은 엘리먼트로 간주하고 처리하는 방식입니다. 이러한 방법을 이용하여 모든 종류의 RSS 파일에서 필요한 내용들로 정리할 수 있습니다.

이러한 RSS 파일의 처리를 위해서 RSS 아이템 한 개를 표현하는 아이템 클래스와 그러한 아이템들을 집합을 표현할 컬렉션 클래스, 그리고 XML 파일로부터 이들의 클래스를 생성하는 RSS 리더 클래스를 각각 구현하여 보도록 하겠습니다. RSS 아이템 클래스의 경우 <표 1>에 나와 있는 내용들을 기억하는 간단한 클래스이기 때문에 그다지 구현에 큰 어려움은 없습니다.


Public Class RSSItem
Public Title As String
Public Link As String
Public Author As String
Public Description As String
Public PubDate As Date
End Class


멤버 변수들 이름으로는 RSS 파일의 엘리먼트 이름과 동일하게 처리했습니다. 지면상 간단한 방식으로 줄였으나, 변수들은 프라이비트(Private)로 선언하고, 퍼블릭(Public)으로 선언된 프로퍼티들을 사용하여 처리하는 방식으로 구현하는 것이 좋습니다. 이 클래스는 날짜 처리 등을 위해서 다음 글에서 수정할 예정이니, 우선은 이대로 사용하기로 하겠습니다.

RSS의 아이템 하나를 저장하는 클래스를 만들었으니, 그러한 다수의 아이템들을 편하게 접근할 수 있는 컬렉션 클래스를 만들어보도록 합시다. 닷넷 프레임워크에서는 간단하게 강력한 컬렉션을 구현할 수 있는 CollectionBase 추상 클래스를 지원하고 있습니다.


MustInherit Public Class CollectionBase
Implements IList, ICollection, IEnumerable


우리가 만들었던 RSSItem 컬렉션 클래스는 바로 이 추상 클래스를 상속받아 만들게 됩니다. CollectionBase에 대한 자세한 설명은 닷넷 프레임워크 SDK 설명서를 참고하길 바랍니다. 이 추상 클래스를 상속받아서 간단하게 RSSItem들을 추상화하는 클래스를 만들어보도록 하겠습니다. 이 클래스에는 우리가 컬렉션 클래스에서 흔히 사용하는 멤버 변수들도 같이 구현하도록 하겠습니다.

 <리스트 3> RSSItemCollection 클래스
사용자 삽입 이미지

Public Class RssItemCollection
Inherits CollectionBase

    Default Public Property Item(ByVal index As Integer) As RssItem
        Get
            Return CType(list(index), RssItem)
        End Get
        Set(ByVal Value As RssItem)
            list(index) = Value
        End Set
    End Property

    ' 삽입, 검색, 삭제 등의 메쏘드
    Public Function Add(ByVal itemObject As RssItem) As Integer
        Return list.Add(itemObject)
    End Function

    Public Function IndexOf(ByVal itemObject As RssItem) As Integer
        Return list.IndexOf(itemObject)
    End Function

    Public Sub Insert(ByVal index As Integer, ByVal itemObject As RssItem)
        list.Insert(index, itemObject)
    End Sub

    Public Sub Remove(ByVal itemObject As RssItem)
        list.Remove(itemObject)
    End Sub

    Public Function Contains(ByVal index As Integer, ByVal itemObject As RssItem) As Boolean
        Return list.Contains(itemObject)
    End Function
End Class
사용자 삽입 이미지

이제 남은 것은 RSS 파일로부터 데이터를 읽어서 이들의 클래스를 반환해주는 RSS 리더 클래스를 만드는 것입니다. 이번 호에서는 네트워크의 XML 파일에도 편하게 접근할 수 있는 XmlTextReader 클래스를 이용하도록 하겠습니다. XML 파일 처리에는 다양한 방법들이 있으니 자신에게 편리한 방법을 선택하여 구현하면 됩니다.

 <리스트 4> RSSReader 클래스
사용자 삽입 이미지

Public Class RSSReader
    Private xmlUrl As String
    Private rssItems As RssItemCollection

    Public Sub New()
        rssItems = New RssItemCollection
    End Sub

    Public Sub New(ByVal xmlAddress As String)
        Me.New()
        xmlUrl = xmlAddress
    End Sub

    Public Property Items() As RssItemCollection
        Get
            Return rssItems
        End Get
        Set(ByVal Value As RssItemCollection)
            rssItems = Value
        End Set
    End Property

    Public Property XmlAddress() As String
        Get
            Return xmlUrl
사용자 삽입 이미지


        End Get
        Set(ByVal Value As String)
            xmlUrl = Value
        End Set
    End Property

    Private Function findValue(ByVal rssXML As XmlTextReader) As String
        Try
            While (True)
                rssXML.Read()
                If (rssXML.NodeType = XmlNodeType.CDATA) Or (rssXML.NodeType =                 XmlNodeType.Text) Then
                Return rssXML.Value
                ElseIf (rssXML.NodeType = XmlNodeType.EndElement) Then
                    Return ""
                End If
            End While
        Catch ex As Exception
            Return ""
        End Try
    End Function

    Public Sub readItems()
        rssItems.Clear()

        Dim isInItem As Boolean

        Dim rssXML As XmlTextReader
        Dim tempItem As RSSItem
        Try
            rssXML = New XmlTextReader(xmlUrl)
            While rssXML.Read()
                Select Case rssXML.NodeType
                Case XmlNodeType.Element
                    If rssXML.Name = "item" Then
                    tempItem = New RSSItem
                    isInItem = True
                ElseIf isInItem Then
                    Select Case rssXML.Name.ToLower
                        Case "title"
                            tempItem.Title = findValue(rssXML)
                        Case "link"
                            tempItem.Link = findValue(rssXML)
                        Case "author", "dc:creator"
                            tempItem.Author = findValue(rssXML)
                        Case "pubdate", "dc:date"
                            tempItem.PubDate = findValue(rssXML)
                        Case "description"
                            tempItem.Description = findValue(rssXML)
                    End Select
                End If

            Case XmlNodeType.EndElement
                    If rssXML.Name = "item" Then
                        isInItem = False
                        rssItems.Add(tempItem)
                     End If
                End Select
            End While
            rssXML.Close()
        Catch ex As Exception
            rssItems.Clear()
        Finally
            rssXML = Nothing
        End Try
    End Sub

End Class
사용자 삽입 이미지

<리스트 4>의 몇 개의 메쏘드를 간단하게 설명하자면, findValue는 XMLTextReader로부터 데이터만을 찾아서 반환해 줍니다. 데이터의 경우 텍스트 형식이나 CDATA 형식으로 지정하는데 이러한 형식 또한 RSS 파일마다 각기 다른 방법을 사용하고 있어서 편리하게 데이터를 읽을 수 있도록 구현했습니다.

ReadItems 메쏘드가 우리가 하고자 했던 XML 파일로부터 데이터를 읽어들이는 이 클래스에서 가장 중심이 되는 작업을 수행하게 됩니다. 간단하게 XML 파일을 읽으며 엘리먼트의 시작 부분에서 아이템 엘리먼트가 시작되는 경우 새로운 RSSItem의 인스턴트를 생성해주고, 이후 아이템 엘리먼트의 각각의 엘리먼트들을 돌며 값을 읽어 저장하고, 아이템 엘리먼트가 끝나면 컬렉션 클래스에 넣어주게 됩니다. 이렇게 만들어진 클래스들은 다음과 같이 사용해볼 수 있습니다.


Dim myRss As New RSSReader("http://php.chol.com/~ppk314/tt/index.xml")
myRss.readItems()

If myRss.Items.Count > 0 Then
Console.WriteLine("첫번째 글의 제목 : " + myRss.Items(0).Title)
End If


네트워크에서 데이터베이스까지
이렇게 해서 모든 종류의 RSS 파일을 읽을 수 있는 클래스가 준비됐습니다. 이제 남은 건 RSS 파일들을 읽고, 그것을 데이터베이스에 정리하는 작업입니다.

간단히 네트워크와 데이터베이스에 대해서 생각하여 보겠습니다. RSS 수집 로봇은 분명 블로그들을 떠돌며 새로운 정보들을 데이터베이스에 저장하는 작업을 거치게 됩니다. 그렇다면 과연 어떤 방식으로 블로그의 RSS 파일이 업데이트되었다는 정보를 알 수 있을까요? 그리고 읽은 RSS 파일의 내용 중 어떻게 새로 추가된 내용을 찾아 그 부분만 데이터베이스에 저장할 수 있을까요?

웹 검색 엔진의 핵심이 이렇게 수집하는 방법과 정리하여 저장하는 방식이 큰 핵심 중 하나라고 말한 것과 같이 이 부분에서 많은 생각과 아이디어들을 떠올려 볼 수 있습니다.

우선 RSS 로봇이 업데이트된 정보를 어떻게 알 수 있는지는 HTTP 프로토콜 헤더에 If-Modified-Since 필드를 사용하여 요청하는 방법을 사용할 수 있습니다. 이 필드에 일정 시간 이후에 수정되어 있는지 여부에 따라서 수정되었다면 정상적으로 XML 파일을 반환할 것이며, 만약 수정되지 않은 상태라면 304 Not Modified 응답을 돌려주게 됩니다. 이 결과를 통해 첫 번째로 서버에서 RSS 파일이 수정되었는지를 확인하고 파일을 읽어온다면 네트워크의 트래픽 감소는 물론 좀 더 효율적인 처리를 할 수 있게 됩니다.

그리고 이제 XML 파일을 읽고 데이터베이스에 저장하게 됩니다. 하지만 RSS 파일에는 새롭게 저장된 글의 내용만을 포함하는 것은 아닙니다. 최근 몇 개의 글을 포함하고 있기 때문에 이미 이전에 데이터베이스에 저장되어 있는 내용을 또다시 저장하는 문제가 발생할 수 있습니다.

이 문제는 해당 글의 링크는 유일하다는 가정을 내려서 쉽게 해결할 수 있습니다. 즉 데이터베이스에 저장할 때의 글의 기준은 링크라는 것입니다. 데이터베이스에 같은 링크 값을 가진 글이 있다면 이미 저장되어 있으므로 넘어가고, 저장되어 있지 않은 글들만 저장하면 됩니다.

이외에도 이전에 RSS 파일의 정보를 이미 데이터베이스에 저장했다고 가정하고 최근 1개의 정보만을 업데이트하는 방법도 있을 수 있습니다. 수시로 RSS 파일의 변경 여부를 체크하는데 이 시간 간격 내에 동시에 여러 개의 글을 올리지 않는다는 가정 하에 사용될 수 있는 방법입니다. 그밖에 성능을 고려한 여러 가지 방법들이 있을 수 있으며 그러한 방법들에 대한 생각은 이 글을 읽는 여러분들께 맡기도록 하겠습니다.

사용자 삽입 이미지
"블로그에서 스팸이?"
사용자 삽입 이미지
 
사용자 삽입 이미지

한때 인터넷에 있는 게시판에 자동으로 광고 글을 등록해주는 스팸 프로그램이 떠돌면서 많은 게시판 관리자들과 게시판 프로그래머들을 골치 아프게 했지만, 이제는 블로그까지 이러한 스팸의 사악한 기운들이 손을 뻗고 있습니다. 이중에는 블로그의 트랙백 기능을 사용하여 광고 내용의 페이지를 많은 블로그 사이트에 대량으로 등록시켜 버리는 신종 광고도 등장했습니다.

거기에 메타 사이트에 등장한 스팸으로는, 저도 지난번에 처음 경험한 광고 블로그 형태였습니다. 이 블로그는 겉으로 보면 일반 블로그처럼 보이지만 메타 사이트에 등록하고 사이트에 클릭할 때마다 적립금이 부여되는 배너들을 달고 있는 포스트를 집중적으로 올리게 됩니다. 이러한 정보들은 그대로 블로깅하는 블로거들에게 노출되며, 메타 사이트에는 광고 글, 도배 글 등으로 다른 글을 읽기 더욱 힘들어지게 합니다.

모든 서비스를 어떻게 하면 광고의 기능으로 사용할 수 있을지를 연구하는 스팸 개발자와 어떻게 수많은 광고성 글들을 차단할 수 있을지를 연구하는 서비스 개발자와의 대립은 미래의 어떤 인터넷 환경이 온다고 해도 끊임없이 계속될 것 같습니다.
사용자 삽입 이미지
사용자 삽입 이미지


다음 시간에는 RSS 수집 로봇 구현
사실 메타 사이트를 만들기 위한 기본적인 설계는 이번 연재에서 대부분 마쳤다고 볼 수 있습니다. 다음 연재에서는 이번에 구현한 클래스들과 이야기한 방법들을 토대로 RSS 수집 로봇을 구현하고, 거기서 발생할 수 있는 여러 가지 문제들에 대해서 이야기하도록 하겠습니다.

그리고 필자의 블로그에 들어오면 ‘창작’이라는 카테고리에 메타 사이트를 제작하면서 간단히 적어둔 몇 가지 관련 내용들이 있으니 관심 있는 독자들이라면 참고하고, 궁금증이나 더 나은 아이디어가 있다면 답글로 이야기해 주기 바랍니다. 이밖에 메타 사이트 개발에 관심 있는 사람이 있다면 이름이 거창한(?) ‘올블로그 개발 연구실(
lab.allblog.net)’의 기술 연구실 게시판에서 메타 사이트에 대한 여러 가지 이야기를 함께 나눌 수 있었으면 좋겠습니다. @

* 이 기사는 ZDNet Korea의 제휴매체인마이크로소프트웨어에 게재된 내용입니다

 

박영욱 (Allblog.net 운영자)

2005/03/04

 

사용자 삽입 이미지

 

원문 :http://www.zdnet.co.kr/techupdate/lecture/dotnet/0,39024986,39133977,00.htm

  Comments,     Trackbacks
최신 기술 닷넷과「통성명 하는 법」
최신 기술 닷넷과「통성명 하는 법」

 

나날이 새로운 기술들이 쏟아지는 가운데 닷넷도 수년이 흘렀다. 벌써 많은 프로젝트들이 닷넷 기술을 적용해서 수행되었지만, 아직도 왠지 닷넷을 낯설게 보는 개발자들을 주변에서 쉽게 찾아볼 수 있다.

필자는 이전 기술에 대한 이해를 바탕으로 과감히 새로운 기술을 받아들이되 충분히 자기의 것으로 소화시켜 실무에 적용하라고 조언하고 싶다. 또한 단순한 개발 기술에만 집중하지 말고 패턴과 아키텍처에 대한 이해에도 관심을 가지는 것이 중요하다고 생각한다.

필자가 본격적으로 프로그래밍을 시작하게 된 것은 D조선 연구소에 근무하게 되면서부터이다. 당시 생산관리 부서에서 생산계획을 하는 시스템이 DOS 기반으로 되어 있어 GUI 지원이 부족하기 때문에 업무 수행에 어려움이 있으니 연구소에서 윈도우 기반으로 시스템을 개발해 달라는 요청이 있었다.

당시만 해도 윈도우 환경에서 프로그램을 개발할 수 있는 사람이 일반 제조업체에는 많지 않았던 때였다. PC 성능은 그리 좋지 않은데 생산계획 업무에서 사용하는 데이터의 양은 많고 UI는 복잡한 터라, 개발은MFC를 사용하기로 하였다.

1년간의 개발을 통해 시스템을 현업에 배포했다. 많은 개발 프로젝트들이 그렇듯이 프로젝트의 어려움은 그 때부터 시작이었다. 많은 요구사항 변경이 있었고 수많은 버그들과의 싸움이 있었다. 어렵사리 현업 적용에 성공을 하고, 2차, 3차 후속 프로젝트를 수행했지만 서서히 회의가 들기 시작했다.

기업 내부에서 진행하는 프로젝트니 기간이 연장되고 현업 요구사항이 바뀌어도 그대로 수용하면서 갈 수 있었지만, 만약 외부에 프로젝트를 줘서 진행했다면 성공할 수 있었을까? 한사람의 개발자요 프로젝트 리더로서 충분한 생산성을 내고 있으며 경쟁력을 가지고 있나? 이런 의문과 장래에 대해 고민하면서, IT 업계로 이직을 하게 되었다.

최신 기술에 과감히 도전하라
이직한 업체는 CBD 등의 방법론과 아키텍처 컨설팅을 전문으로 하는 회사였다. 규모는 30여명 되었지만, 업계에서는 나름대로 인정받는 회사였다. 회사에서 수행하는 프로젝트는 주로 금융권 시스템에 대한 컨설팅이었고 기술 기반도 대부분 자바를 사용하는 것들이었다. 자바에 대해서는 언어 정도만 알고 있는 상태였기 때문에J2EE쪽을 집중적으로 스터디하고 있었는데 회사에서의 첫 번째 미션은 엉뚱하게도 닷넷을 사용해야 하는 일이었다.

회사의 홈페이지와 인트라넷은 ASP.NET으로 개발되어 있었는데 인트라넷 기능에 일일업무 보고를 위한 기능을 추가하라는 것이 필자에게 내려진 첫 번째 임무였다. 주어진 시간은 일주일. 필자는 그때까지 MS 기술을 사용한 개발을 주로 하기는 했지만 MFC와 COM 기반의 윈도우 애플리케이션 개발이 주였기 때문에 닷넷을 사용하거나 웹 기반 애플리케이션 개발을 해본 경험이 없었다.

그저 흥미삼아 책을 보면서 홈페이지 정도 만들어본 것이 전부인 데다 닷넷이라면 왠지 어렵고 복잡한 딴 세상의 물건인가보다 하고 살았기 때문에 당장 일주일 안에 닷넷으로 회사 사람들이 모두 사용할 기능을 만들라는 것은 상당히 부담스러운 일이었다.

C#은 이전에 보아둔 적이 있는 터라 ASP.NET 기본서를 놓고 인트라넷 코드를 살펴보니 의외로 내가 너무 겁을 내고 있었다는 생각이 들었다. ASP.NET에서는 디자인과 코드를 분리해서 작업할 수 있게 되어 있기 때문에 디자이너가 만들어준 페이지와 별도로 필요한 기능을 하는 코드를 해당 클래스에 구현하고 간단히 연결만 해주면 되었다.

선임자가 만들어둔 다른 기능들을 참고해서 진행을 하니 그리 어렵지 않게 필요한 기능을 주어진 기간 안에 완성할 수 있었다. 필자와 닷넷과의 인연은 이렇게 뜻하지 않게 시작되었다.

하루가 멀다 하고 새로운 기술들이 쏟아져 나오고 있고 기존에 알고 있던 기술들도 계속해서 변화를 거듭하고 있다. 어떤 사람들은 이것들을 다 따라가는 것은 불가능하다며 새로운 기술을 습득하기를 포기하기도 하고, 혹은 자신이 가지고 있는 지식이 최고의 것이라 생각하여 새로운 것들을 무시하고 받아들이지 않는 경우도 있다.

새로운 기술이 늘 좋은 것은 아니며 시간이 지남에 따라 오히려 옛 것을 선택하는 것이 바람직한 경우도 있겠지만, 그러한 기존의 기술과 새로운 기술에 대한 이해를 바탕으로 정확한 취사선택을 할 수 있는 상황에서 판단할 문제일 것이다.

하지만 변화가 생명인 IT 업계에서 생존하기 위해서는 새로운 것에 대해 도전하고 이를 받아들이는 것을 두려워할 필요도 없으며 더더욱 게을리해서는 안된다. 엄청나게 많은 기술에 대해 한번에 이해하고 익히려고 하면 엄두가 나지 않을 것이다. 하지만 새로운 기술이라 해도 어느 날 아침에 하늘에서 뚝 떨어지는 것이 아니고, 기존 기술을 기반으로 진화해 나가는 것이기 때문에 하루하루 열린 마음으로 도전해간다면 많은 기술들을 진정 자신의 것으로 소화해낸 개발자가 될 수 있을 것이다.

COM이 닷넷을 이해하는 데 도움이 된다
MS의 빌게이츠를 립 서비스 전문가라고 혹평하는 이들이 있다. 물론 빌게이츠가 말한 것 중에 이루어지지 않은 것도 있고 출시 기한을 넘기는 것은 비일비재하기 때문에 그런 말을 들을 만하다는 생각이 들기도 하다. 하지만 필자는 빌게이츠가 비전을 제시하고 자신이 제시한 비전대로 업계를 이끌어나가는 사람이라고 생각한다.

MS의 기술들은 현재 상황에서는 완전히 이루어지지 않았지만 미래에 대한 로드맵을 제시하고 한 단계씩 이루어나가는 방식으로 만들어진다. 로드맵 상에서 새로운 기술로 만들어내지 못한 부분들은 기존의 기술을 확장하거나 경우에 따라서는 말도 안 되게 이름만 바꾸어서 집어넣어 두기도 한다. MS의 닷넷 기술 역시 이제 막 걸음마를 떼고 성숙하려고 하는 단계라고 생각하고, 많은 부분들이 기존 기술을 활용하고 있다(물론 로드맵에 따르면 언젠가는 새로운 기술로 대체될 것이지만).

이직한 회사에서의 첫 번째 프로젝트는 K통신사에서 COM/DCOM기반으로 ARS 시스템을 구축하는 프로젝트에서 기술 컨설팅을 하는 것이었다. 기존 ARS 시스템들은 장비에서 제공하는API와 라이브러리를 사용하고 소켓을 사용하여 통신하는 방식으로 돼 있었다.

기존 라이브러리들을 COM 래퍼(Wrapper)를 만들어 컴포넌트화하고COM+로 컴포넌트 서비스를 제공하며 시스템간 통신은 DCOM 통신을 하도록 하는 것이 주된 내용이었다. 이 프로젝트를 수행하기 위해서ATL을 사용해서 COM+ 컴포넌트를 만들기 위한 기술들을 다시 점검하고 프로토타입을 만들었다. 프로젝트가 끝나고 닷넷의 COM+ 컴포넌트 서비스를 들여다보니 기본적인 사항들은 완전히 동일하다는 것을 알게 되었다.

현재 버전의 닷넷 프레임워크는 CLR에 완전히 통합된 미드티어 서비스를 제공하지 못하고 있다. 닷넷의 미드티어 서비스는 <그림 1>에서 닷넷의 미드티어 서비스에 나타낸 것 같이 언매니지드 코드를 사용하는 COM+,IIS, 그리고MSMQ를 기반으로 제공된다. COM+는 닷넷에서는 엔터프라이즈 서비스(Enterprise Service)로 이름을 바꾸었지만 실제 동작은 COM+ 서비스를 사용하기 때문에 닷넷의 컴포넌트 서비스인 엔터프라이즈 서비스를 이해하기 위해서는 COM과 COM+에 대한 이해가 필수적이라고 할 수 있다.

사용자 삽입 이미지
<그림 1> 닷넷의 미드티어 서비스


COM에서 컴포넌트나 인터페이스를 식별하기 위해서는 CLSID와 IID 등의 GUID를 사용한다. 그러나 닷넷에서는 GUID를 사용해서 컴포넌트나 인터페이스를 식별하지는 않기 때문에 닷넷에서 컴포넌트를 만들 때는 COM에서처럼 GUID를 생성하고 관리할 필요가 없다.

이에 따라 원칙적으로는 닷넷의 엔터프라이즈 서비스를 사용하여 서비스드 컴포넌트(Serviced Component)를 만들 때 COM에서처럼 GUID를 신경 쓸 필요가 없다. 하지만 COM+가 COM 기반의 컴포넌트 서비스이기 때문에 실제 COM+에서 동작하는 컴포넌트가 되기 위해서는 GUID를 부여해야 할 필요가 있다.

닷넷 엔터프라이즈 서비스에서는 사용자가 이를 지정하지 않아도 COM+에서 동작할 수 있도록 자동으로 컴포넌트에 GUID를 부여해준다. 그런데 이 경우 GUID가 매번 변경됨에 따라 클라이언트에 배포된 프록시를 재배포해 줘야 하는 문제가 발생할 수 있다. 따라서 이러한 배치 문제를 제거하려면 모든 COM+ 컴포넌트에 GUID를 지정해야만 한다. COM에 대한 이해가 전혀 없는 상태라면 이와 같은 상황을 이해하고 대처하는 데 어려움이 있을 수 있다. 이와 같은 상황은 미들티어 서비스들이 완전히 닷넷 프레임워크에 포함될 때까지는 유지될 것 같다.

개발자 커뮤니티를 적극 활용하라
닷넷으로 분산 애플리케이션을 개발하는 경우 분산 객체간의 통신을 위한 방법은 전통적인 DCOM 통신을 이용할 수도 있고, 닷넷 리모팅(.Net Remoting), 그리고 XML 웹 서비스를 사용할 수도 있다.

DCOM 통신은 닷넷 이전의 COM 기반의 분산 아키텍처에서부터 사용되던 방법으로 언매니지드 코드로 작성된 객체들과 통신할 수 있다는 장점이 있는 반면 바이너리 프로토콜이기 때문에 방화벽이 있는 환경에서는 방화벽의 보안 정책과 맞물려 문제를 야기하는 경우가 종종 있다.

이에 반해XML웹 서비스는 HTTP 기반의SOAP프로토콜을 사용함으로써 방화벽에 별도의 포트를 개방하지 않고도 원하는 서비스를 제공할 수 있으며, 서비스를 사용하는 클라이언트가 다른 플랫폼이어도 무관하다는 장점을 가지고 있다. 닷넷 리모팅은 닷넷 애플리케이션간 통신을 위해 만들어진 기술로서 일반적으로 XML 웹 서비스보다 좋은 퍼포먼스와 기능을 제공해준다.

필자가 얼마 전에 수행한 프로젝트는 국내 D조선소의 생산 계획 시스템을 닷넷 기반으로 개발하는 것이었다. 아키텍처를 수립하면서 클라이언트 티어는 윈폼(WinForm)을 사용하고 비즈니스 티어에는 엔터프라이즈 서비스를 사용하되 티어간 통신에는 닷넷 리모팅을 사용하기로 했다. 티어간 데이터 전달 객체(Data Transfer Object)는 Strongly Typed DataSet을 사용하는 것으로 했다.

원칙에 충실하게 초기 아키텍처를 수립하고 프로토타입 시스템을 개발하여 아키텍처를 검증하는데 문제가 발생했다. 원격 객체에 대해서 Strongly Typed DataSet을 반환하는 메쏘드를 호출할 때는 문제가 없었는데, 반대로 Strongly Typed DataSet을 파라미터로 넘기는 메쏘드를 호출할 때는 보안 관련 예외사항(Exception)이 발생하는 것이었다.

틀림없이 뭔가 코딩을 잘못했을 것이라 생각하고 닷넷 리모팅 관련 서적을 다시 다 뒤져보았지만 원칙을 벗어나게 코딩한 부분은 전혀 없었다. 아키텍처 단계를 마무리해야 하는 시점은 다가오는데 원격 호출이 제대로 되지 않아서야 나머지 테스트를 진행할 수도 없는 상황이라 마음은 너무 조급했다.

일주일을 고민했는데 의외로 해법은 아주 쉽게 발견됐다. 구글의 뉴스그룹(groups.google.com/groups?hl=en&lr=&group=microsoft.public.dotnet)을 조회해보니 이미 많은 사람들이 이 문제를 고민하고 해법까지도 친절히 나와 있는 것이었다.

문제는 닷넷 프레임워크가 1.1로 업그레이드되면서 보안을 강화하였고 이 때문에 이와 같은 상황에서 보안 오류가 발생하는 것이었다. 해법은 다음과 같이 서버측과 클라이언트측 각각에 대해 "typeFilterLevel"을 설정해주면 되는 것이었다.


◆ 서버 측 리모팅 설정
<serverProviders>
<provider ref="wsdl" />
<formatter ref="soap" typeFilterLevel="Full" />
<formatter ref="binary" typeFilterLevel="Full" />
</serverProviders>

◆ 클라이언트 측 리모팅 설정
<configuration>
<system.runtime.remoting>
<serverProviders>
<formatter ref="binary" typeFilterLevel="Full" />
</serverProviders>


문제를 해결하기 위해 혼자 고민하면서 일주일을 보내는 동안 잠을 자려고 누워도 온통 이 문제에 대한 생각뿐이었고, 관련 레퍼런스를 뒤져보면서 문제와 상관없는 부분까지 많이 배울 수 있었던 것은 좋았으나 필자와 동일한 문제를 고민한 사람들의 결과를 먼저 찾아보았더라면 바쁜 프로젝트 일정을 많이 아낄 수 있었으리라는 아쉬움이 남았었다.

이 문제를 해결한 이후로는 기술적인 문제가 발생하면 우선 관련 뉴스 그룹을 검색해서 나와 유사한 문제가 있었는지를 확인하고 있다. 필자가 자주 사용하는 개발자 커뮤니티는 <화면 1>과 같다.

<화면 1> 필자가 자주가는 커뮤니티

사용자 삽입 이미지
뉴스그룹(microsoft.public.dotnet)


 

사용자 삽입 이미지
GotDotNet(www.gotdotnet.com)


 

사용자 삽입 이미지
데브피아(www.devpia.com)


 

사용자 삽입 이미지
TheServerSide.Net(www.theserverside.net)


최근 개발자 커뮤니티를 통해 얻을 수 있는 것은 개발 중에 부딪힐 수 있는 단편적인 문제에 대한 해결 방법뿐 아니라, 많은 경험들의 집약체라 할 수 있는 패턴과 엔터프라이즈 프로젝트에서 자주 사용되는 닷넷 코드들을 클래스 라이브러리 형태로 만들어서 제공하는 애플리케이션 블럭(Application Block), 그리고 견고한 시스템을 만들기 위한 아키텍처에 관한 기사들에 이르기까지 많은 선임자들의 고민과 경험을 얻을 수 있다.

MS에서는 ‘Patterns & Practices’ 사이트(www.microsoft.com/resources/practices/default.mspx)를 통해 닷넷에서 사용할 수 있는 패턴과 애플리케이션 블럭, 그리고 아키텍처에 관한 좋은 기사와 서적, 그리고 클래스 라이브러리를 배포하고 있다. 약간의 관심과 노력을 기울인다면 시중에서 구할 수 있는 어떤 책보다도 양질의 정보를 담고 있는 정보를 얻을 수 있다.

사용자 삽입 이미지
<화면 2> Patterns & Practices 사이트


엔터프라이즈 애플리케이션들은 갈수록 복잡한 업무 프로세스를 반영하고 있고, 이를 구현하기 위해서 여러 기술을 복합적으로 사용하고 있다. 복잡한 시스템을 구축할 때 한 분야에만 시야를 고정시키고 구현 기술에만 포커스를 두게 되면 프로젝트 전체를 망치게 될 수 있다.

최근의 프로젝트에서는 체계적인 방법론과 아키텍처 수립을 기본으로 요구하는 경우도 많아지고 있고, 따라서 개발자들도 이에 대한 이해가 부족한 경우 고급 인력으로 인정받지 못하게 된다. 다행히도 우리 주변에는 우리가 노력하기에 따라서 이에 대한 이해를 하기에 충분한 정보가 제공되고 있다. 아직 이에 대해서 관심을 갖지 못했던 개발자라면 오늘이라도 관련 사이트를 돌아보며 마음가짐을 새로 하는 것도 좋을 것이다.

닷넷으로 개발하면 퍼포먼스가 나쁘다?
D조선 프로젝트가 진행되면서 개발이 마무리되어갈 무렵 현업 담당자들로부터 UI 퍼포먼스에 대한 이슈가 제기되었다. 이전에 사용하던 시스템에 비해 반응 속도가 너무 느리다는 것이었다.

이전 시스템은 C++로 작성되었고 GDI를 직접 사용하는 것이었기 때문에 당연히 퍼포먼스가 좋은 데다 데이터베이스만 원격에 있고 나머지는 모두 클라이언트에서 구현된 팻 클라이언트(Fat Client)이기 때문에 퍼포먼스가 동일하기를 바라면 안 된다고 반은 구슬리고 반은 협박을 하였다.

그리고 개발자들 노트북에서는 그럭저럭 쓸만해 보이는데 현업이 이전 시스템에 너무 익숙해져서 불만을 표시한다고 생각하고 넘어가려 했는데 현업의 불만이 쉽게 수그러들지 않는 것이었다. 예전 같으면 2시간이면 처리할 일을 시스템이 느려서 이틀은 걸리게 생겼다고 아주 난리가 났다.

도대체 왜 그런가 하고 내려가 보았더니, 아뿔사! 현업 담당자의 PC가 펜티엄3 800㎒였던 것이었다. 프로젝트 초기에 계획한 하드웨어 사양에 한참 미치지 못하는 사양이라 많은 데이터를 올리는 경우 클라이언트단에 무리가 갔던 모양이었다. 사용자 환경을 면밀히 확인하지 못했던 것이 화근이었다. 부랴부랴 하드웨어 업그레이드를 요청하고 프로젝트팀에서도 UI 퍼포먼스 향상을 위한 조처를 강구하기로 하였다.

시간 여유를 들여 UI 프레임워크를 들여다보니 닷넷의 코드가 네이티브 코드보다야 당연히 느리기는 하겠지만 그래도 너무 느리다는 생각이 들었다. 메쏘드별로 수행 시간을 측정해보니 가장 많이 호출되는 메쏘드에서 검색을 하는 부분이 시간을 많이 소요하게 되어 있는 것을 발견하게 되었다.

이 부분에 Hashtable 클래스를 사용하여 검색하는 것으로 변경했더니 UI 반응 속도가 놀라울 만큼 빨라졌다. 자료구조를 적절하게 사용하는 것은 어찌 보면 아주 기본적인 것이지만 늘 기본을 지키지 않는데서 문제가 발생하는 법이다. 또한, 닷넷으로 개발하면 이전에 비해서 당연히 퍼포먼스가 떨어진다는 안이한 생각에 퍼포먼스에 대한 고려를 충분히 하지 못했던 것도 잘못된 점이었다.

프로젝트를 진행하다 보면 이와 유사한 경험을 종종 하게 된다. 또한, 이러한 문제는 대부분 프로젝트 후반에 일어나는 것이 일반적이다. 그런 경우에 흔히 사용하는 변명이 “운영 시스템에 문제가 있다”라거나 “이 기술은 아직 문제가 많은 기술이야”라는 것이다.

그러나 필자의 경우와 같이 문제는 운영 시스템이나 사용한 기술에 있는 것이 아니고, 설계와 개발시 기능 외적인 요소들에 대해 세심하게 고려하지 못하고 부분적인 기능만 만족시킨 채 자기 할 일을 다 했는데 나머지가 문제라고 생각하는 경우가 많다는 것이다. 프로젝트 중에 문제가 발생할 경우 자신이 담당한 부분이 단순한 기능 이외의 요소들을 충분히 반영했는지, 개념에 충실하게 코드를 작성했는지, 좀 더 넓은 시각으로 살펴보는 습관을 가지도록 하자.

변화를 따라가 보는 즐거움
최근 들어 닷넷으로도 많은 프로젝트들이 만들어지고 있어 닷넷 기술도 시장에서 어느 정도 받아들여지고 있는 것 같다. 많은 기술들이 그렇듯이 닷넷도 어느 날 하늘에서 뚝 떨어진 것이 아니고 기존의 기술을 기반으로 주변 기술들의 장점을 수용하면서 만들어지고 발전해가는 과정에 있다.

따라서 기존 기술들에 대한 이해가 새로운 기술의 깊은 면을 이해하는데 많은 도움이 된다고 생각한다. 이제 처음 개발자로 시작을 하는 입장에서 기존의 기술까지 이해하면서 새 기술까지 익히는 것은 어려운 일이겠지만 기존 기술을 이해하고 있는 개발자라면 새로운 기술을 받아들일 때 기존 기술과 비교해가면서 기술의 진화 과정을 살펴보면 좀 더 깊은 이해를 할 수 있으리라 생각한다.

닷넷 프레임워크 2.0 베타가 발표되고 또 많은 기술들이 적용되었다. 변화의 과정에서 어떤 점들이 달라지고 기술이 진화해가는지 따라가 보는 일도 즐거운 일일 것 같다. @

* 이 기사는 ZDNet Korea의 자매지인마이크로소프트웨어에 게재된 내용입니다.

 

조성원

2005/02/07

 

사용자 삽입 이미지

 

원문 :http://www.zdnet.co.kr/techupdate/lecture/dotnet/0,39024986,39132995,00.htm

  Comments,     Trackbacks
IPv6 주소 생성 절차

1. IP Autoconfiguration의 개념 및 주소의 종류

 

IP 주소 자동설정 기능은 IPv6 주소체계의 새로운 기능중 하나로, 각종 단말에 IPv6 주소가 자동적으로 생성되도록 한다. 이는 IPv6는 일반 PC 뿐만 아니라 콘솔이나 디스플레이가 없는 Embedded OS 및 non-PC 장치에 까지 IPv6 주소를 부여하고자 하기 때문이다.


IP 주소 자동설정기능을 이용함으로써 사용자는 별도의 IPv6 주소를 설정할 필요가 없으며, 관리자 또한 사용자별로 IP 주소를 할당해야하는 관리상의 불편함을 줄일 수 있다.


 

2. Link Local Address와 Global Address


일반적으로 IPv6 단말이 이용하는 주소에는 Link Local 주소와 Global 주소가 있다. Link Local 주소는 단일 네트워크 내에서 이용되는 주소로, 주로 관리 및 내부 통신 목적으로 활용된다. 반면 Global 주소는 외부의 IPv6 네트워크와 데이터 통신을 하기 위해 이용된다. Link Local 주소와 Global 주소 모두 IP Autoconfiguration에 의해 생성된다.


 

3. IPv6 주소 생성 방법


기존 IPv4 주소와 유사하게 IPv6 주소역시 수동 생성(Manual Configuration), 주소 할당에 의한 자동 생성(Stateful Address Autoconfiguration) 그리고 임의의 자동 생성(Stateless Autoconfiguration)으로 구분된다.


가. Manual Configuration


관리자 또는 사용자가 직접 자신이 사용할 IPv6 주소를 수동으로 입력하는 방식으로, 외부 서비스를 위한 서버를 이용할 때, 시스템이 변경되더라도 항상 동일한 주소를 가져야 하기 때문에 수동 설정을 많이 이용한다.


나. Stateful Address Autoconfiguration


IPv6 주소를 할당하는 별도의 서버(예: DHCPv6 서버)이 존재하고 시스템이 주소할당 시스템으로부터 적절한 주소를 할당받는 방식이다. 기존 IPv4의 DHCP(Dynamic Host Configuration Protocol)와 유사한 개념이다


다. Stateless Address Autoconfiguration


별도의 주소 관리 시스템 없이, 단말이 스스로 자신이 이용할 IPv6 주소를 생성하는 방식으로, 각 단말간 중복되지 않는 고유의 구분자(예: Mac 어드레스)를 이용하여 주소를 생성한다.



4. Stateless Autoconfiguration 절차


IPv6의 Stateless Autoconfiguration은 네트워크에 할당된 64bit Prefix와 인터페이스의 Interface ID의 조합으로 이루어진다. 즉 라우터에 할당된 64bir Prefix와 인터페이스(랜카드)에 부여되어 있는 MAC 어드레스의 조합을 통해 총 128bit의 IPv6 주소가 자동으로 생성되는 것이다.


사용자 삽입 이미지



Stateless Autoconfiguration 절차는 아래와 같다.


(1)네트워크의 새로운 단말은 Link Local 주소를 생성하고 인터페이스에 할당을 한다. Link Local 주소는 fe80:0000:0000:0000:0000 형태를 취한다.


사용자 삽입 이미지


(2)방금 생성한 Link Local 주소가 같은 네트워크내에 존재하는지 확인(DAD: Duplicate Address Detection)한다.

  

   가. 새로운 단말이 Neighbor Solicitation(NS) 메시지를 네트워크에 전송한다.

   나.만약 다른 단말이 동일한 주소를 사용하고 있으면, 그 단말이 Neighbor Advertisement(NA)메시지를 전송한다.

   다. 단약 일정 기간동안 NS 메시지를 받지 못하면, NS 메시지를 보낸 새로운 단말이 Link Local 주소를 이용한다.

   라.단약 NS 메시지를 보낸 단말이 NA 메시지를 통해 자신이 생성한 Link Local 주소가타 단말과 중복됨을 확인하면 Link Local 주소를 네트워크 인터페이스에 할당하지 않는다.


(3)새로운 단말은 라우터로부터 네트워크 정보를 얻기 위해 새로 생성한 Link Local 주소를 이용하여 Router Solicitation 메시지를 네트워크에 전송한다. RS 메시지를 전송하는 것은 필수는 아니며, RA 메시지가 올때까지 기다릴 수도 있다.


(4)RS 메시지를 받은 단말(주로 라우터)는 Router Advertisement(RA) 메시지를 전송한다. RA 메시지는 주기적으로 네트워크에 뿌려지기 때문에 반드시 RS 메시지가 필요한 것은 아니다.


(5)RA 메시지를 받은 단말은 IPv6 Prefix(상위 64bit) 정보를 얻게 된다.


(6)단말은 Link Local 주소 생성때와 유사하게 Prefix 정보와 인터페이스 ID(하위 64bit)를 조합하여 128bit Global Address를 생성한다.



5. Generation of Interface ID


지금까지 단말이 속한 네트워크의 Prefix 정보를 얻는 절차에 대해 알아보았다. 이제 단말자신의 Interface ID를 생성하는 방법에 대해 알아보자.


인터페이스 ID가 생성되는 방식은 인터페이스의 종류에 따라 다르다. 일반적인 Ethernet 인터페이스의 경우 IEEE EUI-64(Extended Unique Identifier-64) 주소가 생성된다.


모든 Ethernet 인터페이스는 IEEE 표준에 의해 할당받은 유일한 주소(MAC 어드레스)를 가지고 있다. 현재 MAC 어드레스는 48bit(6byte)의 물리적 주소를 가지고 있으며, 그 형태는 아래 그림과 같다.


사용자 삽입 이미지


Ethernet 인터페이스는 아래와 같은 절차에 의해 MAC 어드레스로부터 인터페이스 ID(EUI-64 주소)를 생성하게 된다.


사용자 삽입 이미지

 

인터페이스 ID 생성 절차

(1)MAC 어드레스가 두 부분으로 분리된다.

   - 일반적으로 24비트와 25비트 사이, 혹은 3번째 바이트와 4번째 바이트 사이

(2)"ff fe"가 3번째 바이트 사이에 삽입된다.


사용자 삽입 이미지


(3)MAC 어드레스의 나머지 3바이트가 뒤에 붙는다.

(4)처음 8비트중 7번째 비트에 “Universal/Local" 비트임을 나타내는 수치가 더해진다.

   - 1이면 Universal 관리 주소, 0이면 Locally 관리 주소

(5)처음 8비트중 8번째 비트에 “Individual/Group" 비트임을 나타내는 수치가 더해진다.

   - 0이면 유니캐스트 주소, 1이면 멀티캐스트 주소

 

              

사용자 삽입 이미지

 

실제로 생성된 Interface ID의 예를 보면


Auto Configuration에 의해 생성된 2001:2b8:80:12:209:6bff:fee3:f8be IPv6 주소중 Interface ID 부분은 “209:6bff:fee3:f8be”이며 16진수를 2진수로 변경하면 아래와 같다.


0000001000001001011010111111111111111110111000111111100010111110


위 2진수중 7번째 비트가 1로 되어 있으므로 Universal administrated address 이고, 8번째 비트가 0이므로 유니캐스트 주소이며, 주소 생성 절차에 의해 24비트 ~ 40비트 까지가 1111111111111110(16진수 ff fe)로 채워진 것을 확인할 수 있다.



6. IPv6 주소 정보의 확인


http://doc.tavian.com/ipv6util사이트의 IPv6 확인 도구를 이용하여 IPv6 주소의 정보를 아래와 같이 확인이 가능하다.

 

사용자 삽입 이미지

  Comments,     Trackbacks
[CSS]텍스트 편집하기

텍스트 편집시 활용될수 있는 몇 가지 스타일쉬트입니다.

 

1. 글자의 간격을 지정할 때(letter-spacing)

 

<P style="letter-spacing:0.5em;">글자의 간격을 0.5em으로 설정했으므로 반 칸씩 이동하게 됩니다. 1em 은 기본 글꼴 하나만큼의 간격입니다.</p>

 

2. 텍스트에 밑줄을 그어줄 때(text-decoration)

 

<p style="text-decoration:underline">글자에 밑줄을 그어줍니다.</p>

<p style="text-decoration:overline">글자에 윗줄을 그어줍니다.</p>

<p style="text-decoration:line-through">글자 중앙으로 줄을 그어줍니다.</p>

 

3. 텍스트의 줄 간격을 지정할 때(line-height)

 

<p style="line-height:15pt">텍스트의 내용이 두 줄 이상일때 한줄한줄의 줄 간격을 지정해줍니다. 여기서는 15pt로 지정되었네요..^^</p>

'Programming > HTML/CSS' 카테고리의 다른 글

이미지와 글의 간격조정하기  (0) 2004.10.25
[css] 영문 자동 줄바꿈  (0) 2004.10.14
TABLE 넓이 고정하기  (0) 2004.08.06
TEXTBOX에 CSS 활용하기  (0) 2004.08.06
글자에니메이션 - 마퀴(MARQUEE)  (0) 2004.06.27
배경이미지 속성 지정하기  (0) 2004.05.25
  Comments,     Trackbacks
IPv6과 휴대인터넷이 만난다
[디지털타임스 2004-12-09 10:56]

전산원, 내년 최대 1만명 수용 시범서비스

IPv6 기반의 휴대인터넷(와이브로) 활성화를 위한 시범서비스가 추진된다.

정보통신부와 한국전산원은 내년 2월 와이브로 사업자 선정 이후 특정 정부기관이나 지방자치단체, 또는 특정 지역을 대상으로 모바일 IPv6 기술을 적용한 와이브로 시범서비스를 제공할 계획이라고 8일 밝혔다.

올해 하반기부터 시작된 IPv6 시범사업 `코리아 버전6'(KOREAv6)의 확대 차원에서 추진되는 이번 시범사업은 전산원이 내년 2월 KTㆍSK텔레콤ㆍ하나로텔레콤 등 3개 사업자 가운데 최종 와이브로 사업권을 획득한 사업자를 대상으로 단수 또는 복수로 선정하고, 시범서비스 기관이나 지역도 신청을 받아 선정키로 했다. 시범사업 예산은 20억원 안팎이 될 것으로 보인다.

전산원은 와이브로 시범망을 IPv4와 IPv6를 모두 지원하는 듀얼 망으로 구축할 방침이며, IPv6주소의 라우팅이 가능한 장비와 기지국 장비, IPv4ㆍ6 듀얼 모드를 지원하는 휴대폰ㆍ노트북ㆍPDA 등 모바일 단말기 등을 동원해 최대 1만명이 사용할 수 있는 시범망을 구축키로 했다.

전산원은 와이브로 응용서비스 모델로 텔레매틱스ㆍ위치기반서비스(LBS)ㆍ인터넷전화(VoIP)ㆍ주문형비디오(VOD)ㆍ모바일게임ㆍ모바일커머스ㆍ블로그ㆍ멀티미디어메시징 등을 고려하고 있다.

전산원은 시범 사업을 통해 이동전화에 대역폭도 넓고, 빈번한 셀 간의 이동에도 끊김 없는 연결성을 확보할 수 있는 와이브로가 풍부한 인터넷 주소와 강화된 보안과 품질 기능 등 의 장점을 지닌 IPv6 기술과 결합할 경우의 시장성을 조기에 가늠해 볼 수 있을 것으로 기대하고 있다.

정통부는 앞으로 와이브로 사업자들의 인프라 구축 시 IPv6 기반의 라우터?갚誰仄? 장비 등을 도입하도록 유도해 나간다는 계획이다.

이밖에 정통부는 전산원을 통해 KT와 SK텔레콤이 주도해 실시하고 있는 홈네트워크 시범서비스 지역에 IPv6기술을 적용하는 시범 사업과 광대역통합망(BcN) 시범사업에도 IPv6를 연계하는 사업을 내년에 추진키로 했으며, 올 하반기 추진한 10가지 코리아 버전6 사업 가운데 몇 가지를 내년에 확대 시행하는 등 IPv6 시범사업을 대폭 강화키로 했다.

  Comments,     Trackbacks
Global IP Business Exchange 전시 행사 - IPv6 부문 전시

 

1. 전시회 개요

   o 일시 : 2004. 11. 16 ~ 18
   o 장소 : 일본 동경 Tokyo International Forum
   o Global IP Business Exchange 전시 행사 구성
       - 총 3개의 쇼케이스로 구성되었으며, 약 30여개의 기업이 50여종의 제품을 전시함

Facility Networking ShowCase

IPv6, IPv4 네트워크를 이용하여 각종 센서, 제어 장비를 연계하는 솔루션을 전시

정보가전 ShowCase

IPv6를 이용한 원격제어(예: m2m-x), 모바일 및 이동통신과 관련된 내용을 전시

Pv6 Ready Logo ShowCase

IPv6 Ready Logo 프로그램에 대한 소개, 인증 로고를 받은 제품을 한자리에 모아서 전시

 

2. IPv6 Ready Logo 프로그램 및 인증 제품 전시

 가. IPv6 Ready Logo 프로그램

   o Global IPv6 포럼과 일본의 IPv6 관련 기관을 중심으로 추진되고 있는 IPv6 Ready Logo
      프로그램에 대한 안내 및 인증 획득 제품 전시

   o IPv6 Ready Logo 프로그램 홍보
     - 현재 진행되고 있는 Phase I에 대한 전반적인 안내 및 향후 진행될 Phase 2에 대한 정보를
        제공하고 있었음
     - Phase I의 경우 IPv6 Core Protocol에 대한 테스트를 통해 인증로고를 부여하고 있으며,
        현재 약 130여개의 제품이 인증로고를 받았음
     - Phase 2 프로그램은 2004년 12월 중으로 실시될 예정이며, Core Protocol이외에
        Mobile IPv6, 변환기술, 라우팅 프로토콜에 대한 부분까지  확대할 계획이라고 함

사용자 삽입 이미지

< IPv6 Ready Logo 프로그램 홍보 부스 >

  나. IPv6 Ready Logo 인증 제품 전시

   o 일본 IPv6 Promotion Council의 주관으로 IPv6 Ready Logo를 받은 제품을 한자리에 모아서
      전시를 하고 있었고, IPv6 지원 라우터, L3 스위치, 방화벽, 임베디드 OS 등이 전시되었음

사용자 삽입 이미지

< IPv6 Ready Logo 인증 제품 전시 부스 >

   o 주요 전시 제품 및 솔루션
       - Allied Telesis : 소형 IPv6 지원 네트워크 제품
          · CentreCOM 9924Ts : IPv6 지원 Gigabit L3 Switch
          · CentreCOM AR450S : IPv6 Broadband Router(소형 라우터)
       - Nokia : IPv6 지원 방화벽
       - Wind River : IPv6 지원 OS Stack, Wind River Network Stack v2.0
       - Extream Networks : Extream Black Diamond 6800 IPv6 지원 L3 스위치
       - Internet Initiative Japan Inc. : 소형 라우터 제품
          ·  SEIL neu 2FE Plus IPv6 Access Router, SEIL Turbo IPv6 Router

   o 일본의 경우 대규모 백본용 네트워크 장비보다는 소규모 네트워크 제품을 중심으로
      발 빠르게 IPv6 지원 장비를 출시하고 있었음
       - 관계자의 말에 의하면 백본용 장비는 CISCO, Hitachi, Juniper와 같은 대형 벤더와 경쟁하기
          곤란하므로 상대적으로 개발이 용이하고, 진입장벽이 낮은 엑세스급 네트워크 장비를 위주로
          IPv6 지원 장비 개발을 진행한다고 함

 

3. 파나소닉 IPv6 제품 전시

   o 그동안 꾸준히 IPv6 관련 제품을 출시하였던 파나소닉은 자사의 IPv6 관련 제품을 한곳에 모은
      별도의 부스를 마련하였음

   o 파나소닉은 기존 네트워킹 제품과 함께, 건물 및 설비 관리(facility management) 솔루션 전시

   o IPv6 네트워크 카메라(총 4종)
      - 이번 전시회에는 총 4종의 IPv6 네트워크 카메라(KX-HCM180, BB- HCM311, BB-HCM331,
         BB-HCM371)가 전시되었으며, 이중 3종의 네트워크 카메라가 상용화되어 일반인 구입 가능
      - 세계 최초의 IPv6 네트워크 카메라 개발 기업답게 작은 외형과 깔끔한 디자인

사용자 삽입 이미지
,
사용자 삽입 이미지

  o 건물 및 설비 관리(facility management) 솔루션
     - 건물관리를 위한 조명 제어 솔루션으로 사람이 직접 현장에 가지 않고도 원격에서 전원장치의
        릴레이(relay)를 제어할 수 있음
     - 즉, IPv6 주소가 내장된 소형 콘트롤 박스(BX : Building Exchange)와 조명 제어를 위한
        릴레이가 시리얼 라인으로 연결되어 있으며, 사용자는 웹 인터페이스를 통해 조명의 상태 제어      - 한국전산원 IPv6 체험관에 있는 SINKBoard와 유사한 개념

사용자 삽입 이미지

BX(Building Exchange)의 구성

  o IPv6 지원 네트워크 프린터(WORKIO CL-500)
     - 기존 네트워크 프린터의 프린터 서버 모듈을 수정하여 IPv6를 지원할 수 있도록 수정한 제품
        아직 시판되지는 않는다고 함
     - IPv6의 자동주소 할당기능을 이용하여, 자동으로 프린터에 IP 주소가 할당되며,
        사용자는 별도의 설치 절차 없이 간단하게 프린터를 이용할 수 있다고 함

사용자 삽입 이미지

 

4. IPv6를 이용한 건물 및 설비 관리 관련 전시

   o Global IP Business Exchange 2004의 주요 이슈중 하나가 IP 네트워크를 이용한 건물 및
      설비 관리(facility management)임
      - 파나소닉, 요코가와 전기, NEC 등의 전기전자 기업이 건물 관리를 위한 IPv6 기반의 각종 제어
         장치를 개발하고, 건설회사에서 이를 실제 건설현장에 도입하고 있음
      - 즉, IPv6를 Intelligent 빌딩, Home 네트워크의 구현에 필요한 핵심 요소기술로서 인식

  o 요코가와 전기 : Fis(Field information Server)
      - 실외의 기온, 풍향, 풍속, 습도, 강수량 등의 각종 정보를 IPv6 네트워크를 통해 원격지로 전달
      - 원격지에서는 각종 계측 정보를 바탕으로 적절한 의사결정을 내리거나 원격 제어장치를 작동
      - Fis 모듈에는 IPv6를 지원하는 OS가 내장, 각종 센서 데이터를 IPv6 네트워크로 전송함

사용자 삽입 이미지

Fis(Field information Server)

  o 요코가와 전기 : Xancia
     - Windows CE 기반의 Embedded OS를 내장한 초소형 단말
     - 각종 외부 입출력 포트(Serial, Digital-I/O, 이더넷 등)를 활용하여 다양한 장치를 제어

사용자 삽입 이미지
사용자 삽입 이미지

  o 청수건설(淸水建設) 주식회사 : IPv6 기반 건물 환경 관리
     - 청수건설에서는 IPv6 기반의 건물관리 솔루션을 활용하여 실제 건물관리에 활용하고 있음
     - 건물내부의 온도, 습도, 조도, 전압, 전력 등을 실시간으로 모니터링 하여, 사용자가 원하는
        최적의 상태로 유지할 수 있다고 함
     - 한국전산원 IPv6 체험관 내의 무드 스피어와 유사한 솔루션임

사용자 삽입 이미지

  o 기타
     - 파나소닉 : FreeFit Light 콘트롤러

사용자 삽입 이미지

     - 도시바 : GIGABINE, Ethernet-to-Loanworks 게이트웨이

사용자 삽입 이미지
 
사용자 삽입 이미지

 

5. IPv6 지원 운영체계(OS)

   o Embedded OS와 Linux 기반의 IPv6 운영체제가 선보였으며, 소형 임베디드 기기에 IPv6를
      적용하는 추세를 반영하고 있었음
      - MiSPO의 NORTi,
      - Wind River의 VxWorks
      - ELMIC Systems의 KASAGO IPv6 실시간 Embedded OS
      - 알파시스템의 KNOPPIX Bootable Linux OS가 전시되었음

   o KNOPPIX/IPv6 Live Linux
      - KNOPPIX는 별도의 설치과정 없이 바로 CD로 부팅하여 사용할 수 있는 테스트탑용 Linux OS
      - IPv6 프로토콜 스택, 터널링, 자동주소설정 등 IPv6에서 요구되는 기본기능을 제공하며
         웹브라우저, 오피스프로그램 등이 포함되어 가정이나 기업에서 이용하기 용이함

사용자 삽입 이미지
,
사용자 삽입 이미지

  o NORTi RTOS(Real Time Embedded OS)
     - NORTi는 일본 TRON 프로젝트의 일환으로 개발된 임베디드 OS,  IPv6 프로토콜 스택 지원
     - 일본에서 개발된 다수의 IPv6 지원 임베디드 기기에 NORTi RTOS가 탑재되어 있다고 함

사용자 삽입 이미지

 

6. IPv6 네트워크 장비

   o 이번 전시에서는 Hitachi, NEC와 같은 대형 IPv6 장비 제조사뿐만 아니라,
      중소규모 기업의 다양한 IPv6 장비가 전시되었음

   o 주요 전시 제품
      - 시스코 : 모바일 라우터 - CISCO 3200 Mobile Access Router
      - NEC : IPv6 라우터 - IX2000/IX1000/IX3010
      - Extream Networks - BlackDiamond 10808
      - 후지스 : IPv6 라우터 - GeoStream SI-R370
      - FITEL : IPv6 라우터 - FITELnet-F3000, F1000, F100
      - 파나소닉 : IPv6 홈게이트웨이 - BB-HGW502
      - 야마하 : IPv6 라우터 - RTX1500, RTX1000
      - ALLIED Telesis : 소형 라우터 - AR450S
      - Internet Initiative Japan - SEIL Plus, SEIL Turbo
      - YOKOGAWA : TTB IPv6/IPv4 변환기 - TTB3020

   o CISCO : CISCO 3200 Mobile Access Router\
      - 이동중에 소규모 IPv6 네트워크 구성이 가능한 모바일 라우터 제품
      - 본 전시회에서는 실제 데모를 볼 수 없었으나, 미국의 경찰업무에 시범적으로 적용됨

사용자 삽입 이미지
,
사용자 삽입 이미지

   o NEC : IPv6 라우터 - IX2000/IX1000/IX3010
      - NEC는 저가의 소형 엑세스급 라우터 2종과, 중형 라우터 1종을 전시
      - 이중 소형 엑세스급 라우터는 원화로 약 1백~2백만원 정도로,
         대규모 벤터의 장비와 기술 및 가격 측면에서 경쟁력이 있다고 판단됨

사용자 삽입 이미지
,
사용자 삽입 이미지

   o 파나소닉 : IPv6 홈게이트웨이 - BB-HGW502
      - 가정에서 유무선 인터넷을 이용하기 위한 IPv6 홈게이트웨이 장비
      - KOREAv6 시범사업에서 (주)에스넷시스템의 Ubi-6 G10 장비와 유사한 개념 및 기능제공

   o 야마하 : IPv6 소형 라우터
      - 야마하에서는 IPv6 소형 라우터와 IPv6 지원 홈게이트웨이 장비 전시
      - 특히 IPv6 홈게이트웨이는 ADSL에서 IPv6 네트워크를 지원하며,
         일본내 IPv6 시범사업에 이용된다고 함

사용자 삽입 이미지
,
사용자 삽입 이미지

   o YOKOGAWA : TTB IPv6/IPv4 변환기 - TTB3020
      - 이번 전시회에 유일한 IPv6/IPv4 변환기로 NAT-PT 기능을 수행함
      - 국내 iBIT의 Forsix IPv6/IPv4 변환기와 기본 기능을 동일하며,
         SIP 프로토콜을 위한 ALG(Application Level Gateway)를 지원함
      - 파나소닉의 PSTN-VoIPv6 게이트웨이를 이용하여 IPv6 인터넷전화와 IPv4 인터넷전화간의
         변환기능을 시연하였음

사용자 삽입 이미지
,
사용자 삽입 이미지

  Comments,     Trackbacks
KOREAv6 시범 사업 소개
KOREAv6는 전국 규모의 IPv6 시범망을 활용하여,
IPv6 장비 및 서비스를 검증하고 상용화를 유도하기 위한 시범사업입니다.

KOREAv6.VSIX.NET

 o 다양한 분야의 일반이용자들에게 IPv6 이용을 권장하여 IPv6 서비스를 활성화 하고

 o 실망(real-network)에서 IPv6 장비 및 솔루션에 대한 시험 운영 프로젝트

사용자 삽입 이미지

 

 KOREAv6 진행 단계

   o KOREAv6 1단계 : 2003년 : KOREAv6 백본 네트워크 구성, 시범사업 기획
   o KOREAv6 2단계 : 2004년 : KOREAv6 백본 확장, 시범 서비스 및 시험 운영 실시
   o KOREAv6 3단계 : 2005년 : KOREAv6 백본 확장, 휴대인터넷, RFID, BcN 사업과 연계
   o KOREAv6 4단계 : 2006년 : IPv6 서비스 상용화 단계
 

KOREAv6 백본

  
 o 이미 구축되어 있는 국내의 IPv6 망들을 연계한 국내 최대의 IPv6 망 구축함
      - 6NGIX를 중심으로 6KANet, KREONET, KOREN 등의 연구망과
      - 상용 ISP 사업자의 IPv6 망을 포함
   o KOREAv6 시범 서비스와 시험 운영을 위한 기반 인프라로 활용함

사용자 삽입 이미지

 

IPv6 시범 서비스

  o
다양한 분야의 IPv6 시범 서비스 제공하여 실제 IPv6 이용자를 확보
  o
IPv6 서비스 구현 및 서비스 제공에 대한 가이드라인 제시
  o
11개 시범서비스, 35개 기관 참여
      -
IPv6 인터넷을 이용한 자연생태계 모니터링 서비스
      -
통신사업자(DACOM)의 IPv6 서비스
      -
SOHO용 유무선 IPv6 Internet Gateway를 이용한 시범서비스

      -IPv6-IPv4 통합 모바일 홈네트워크 시범망 구축 및 시범 서비스
      -IPv6 고품질 영상 전송 서비스
      - 가정에 IPv6 시스템-응용서비스 도입 및 이용활성화

      -
 IPv6를 활용한 병원용 디지털 차트 시스템 시범서비스
      - IPv6 캠퍼스 망에서 원격 가상 저장장치를 이용한 모바일 학습서비스

      - 학교 내에 IPv6 시스템-응용서비스 도입 및 이용활성화
      -
VoIPv6 음성 및 화상 서비스
      - IPv6 포탈 서비스 및 IPv6 체험관 서비스
 

사용자 삽입 이미지

IPv6 장비 시험 운영

  o실망에서 IPv6 장비의 기능 검증 및 여러 IPv6 장비간 상호 운영성, 기능 확인
  oIPv6 시험운영에 대한 가이드라인 제시
  o개방된 IPv6 시험운영 환경을 제공하여 업체의 기술력 향상에 기여
  o18개 업체, 39개 제품 시험 운영 참가

사용자 삽입 이미지

  Comments,     Trackbacks
Windows XP 내장 IPv6 방화벽 Part 1


Windows XP SP1 + 고급네트워킹 팩 내장 IPv6 Firewall 활용 Part 1

 

Part1에서는 IPv6 ICF의 주요 기능 소개, IPv6 네트워크 인터페이스의 필터링 설정을 다룹니다.

 

1. IPv6 Internet Connection Firewall - IPv6 ICF

최근 다양한 애플리케이션이 개발되고, 보안에 대한 관심이 높아짐에 따라 Windows XP 및 2003 OS에서는 간단한 IPv4 방화벽(firewall)을 내장하고 있습니다.[그림1]

사용자 삽입 이미지

[그림1]

하지만, IPv6 애플리케이션이 늘어나고, End-to-End 연결성을 지향하는 IPv6의 특성상 IPv6 네트워크에 대한 보안의식이 증대되면서 IPv6 방화벽에 대한 관심이 증가하고 있습니다.

이러한 추세를 반영하여 Microsoft에서는 Windows SP1(서비스팩 1)에 고급네트워킹 팩(Advanced Networkig Pack)을 설치하거나 Windows XP SP2를 이용하는 경우 IPv6 Internet Connection Firewall을 지원하고 있습니다.

Windows XP SP1 + 고급네트워킹팩에 내장된 IPv6 ICF와 Windows XP SP2에 내장된 IPv6 ICF는 서로 사용방법이 다른 까닭에,본 문서에서는 Windows XP SP1 + 고급네트워킹팩을 이용하는 경우를 가정하고 설명하겠습니다.

Windows XP SP2용은 향후 별도의 문서로 설명할 예정입니다.

 

2. IPv6 ICF의 위치 확인

[그림1]처럼 IPv4 ICF는 각 네트워크 인터페이스의 속성에서 [고급] 탭을 선택하면 이용을 할 수 있습니다. 하지만 IPv6 ICF는 [그림1]같은 GUI가 제공되지 않으므로,netsh를 통한 CLI(Command Line Interface)를 이용해야 합니다.

명령 프롬프트에서netshfirewall을 입력하면 IPv6 ICF 설정 메뉴로 들어가게 됩니다.[그림2]
** IPv6 ICF 설명 메뉴에서 ?를 입력하면 관련 도움말을 볼 수 있습니다.

사용자 삽입 이미지

[그림2]

 

3. IPv6 네트워크 인터페이스에 대한 IPv6 ICF 적용 상태 확인

구체적인 IPv6 방화벽 설정에 앞서, 현재 각 IPv6 네트워크 인터페이스에 대한 IPv6 ICF 적용 상태를 확인해 보겠습니다.

>> netsh firewallshow adapter

show adapter명령은 시스템에 설치된 모든 IPv6 네트워크 인터페이스에 대한 IPv6 ICF 적용 상태를 표시합니다. 별다른 설정을 하지 않았으면 [그림3]처럼 모든 네트워크 인터페이스가 필터링되고 있습니다.

** IPv6FilteringEnabled가 "예"로 되어 있으면 해당 인터페이스에 방화벽이 활성화되어 있다는 의미 입니다.

사용자 삽입 이미지

[그림3]

특정 IPv6 네트워크 인터페이스에 대한 구체적인 방화벽 적용 상태를 확인하려면netsh firewall show adapter "네트워크 인터페이스 명"을 실행합니다.[그림4]

>> netsh firewallshow adapter ADSL

사용자 삽입 이미지

[그림4]

 

4. IPv6 방화벽 적용 상태 변경

특정 IPv6 네트워크 인터페이스에 대해 방화벽 적용 상태를 변경하기 위해서는netsh firewall set adapter명령을 이용합니다.

netsh firewall set adapter명령을 입력하면 [그림5] 같은 옵션을 확인할 수 있습니다.

사용자 삽입 이미지

[그림5]

    o name :: 네트워크 인터페이스의 이름

    o icmp :: IPv6 icmp 필터링의 활성화 여부

    o port :: 특정 포트의 필터링 여부

    o protocol :: tcp, udp의 선택

    o ignoreglobalport :: 글로벌 포트 설정의 무시 여부

    o filtering :: 필터링의 여부

     

예)netsh firewallset adapter "6to4 Pseudo-Interface" filtering=disable
     ** 6to4 Pseudo-Interface의 IPv6 방화벽 설정을 해제함[그림8]

사용자 삽입 이미지

[그림8]

예)netsh firewallset adapter "Automatic Tunneling Pseudo-Interface" icmp all=enable filtering=enable
     ** Automatic Tunneling Pseudo-Interface(보통 ISATAP)에 방화벽을 적용하되, icmp 프로토콜은 허용함

[그림6]에서icmp all=enable에서icmp all=disable로 설정을 변경했을 때, ping에 대한 응답을 더 이상 하지 않는 것을 확인할 수 있다.

참고 :: Windows XP에서 고급네트워킹팩을 설치한후 해당 PC로 ipv6 ping이 안되는 이유는, 고급네트워킹팩이 설치되면 모든 인터페이스의 방화벽 설정이 enable 되기 때문입니다.

사용자 삽입 이미지

[그림6]

예)netsh firewallset adapter "ADSL" port 80=enable
      ** ADSL 인터페이스의 80 포트를 오픈함

[그림7]에서 TCP 프포토콜 80포트에 대해 IPv6 방화벽이 Open 되었음을 알 수 있습니다.

사용자 삽입 이미지

[그림7]

예를 들어 Native IPv6 환경에서 IPv6 웹서버를 운영하고 있는 경우, 외부 접속은 물리적 네트워크 인터페이스의 80포트를 통해 이루어 집니다.

이 경우 netsh firewall set adapter "물리적 인터페이스명" filtering=disable명령을 통해 해당 네트워크 인터페이스에 대한 IPv6 방화벽 적용을 해제하거나

netsh firewall set adapter "물리적 인터페이스명" port 80=enable filtering=enable명령을 통해 IPv6 방화벽은 적용하되 80포트는 open 해야지만 외부에서 80 포트로 웹서버에 접속 할 수 있습니다.

만약 6to4 터널링 환경에서 IPv6 웹서버를 운영한다면 6to4 터널링 인터페이스(6to4 Pseudo-Interface)의 80번 포트를, ISATAP 터널링 환경에서 IPv6 FTP 서버를 운영한다면 ISATAP 터널링 인터페이스(Automatic Tunneling Pseudo-Interface)의 20, 21번 포트를 각각 오픈해 주어야 합니다.

 

Part2에서는 IPv6 ICF의 Global Port와 Logging 기능에 대해 알아보겠습니다.

 

  Comments,     Trackbacks
Windows XP SP1 + 고급네트워킹 팩 내장 IPv6 Firewall 활용 Part 2
Windows XP SP1 + 고급네트워킹 팩 내장 IPv6 Firewall 활용 Part 2

IPv6 ICF Part 1에서는 기본적인 설정 방법에 대해 알아보았습니다.

IPv6 ICF Part 2에서는 모든 IPv6 네트워크 인터페이스에 공통으로 설정을 적용하는globalport 명령과 IPv6 ICF의 동작결과를 기록하는logging 명령에 대해 알아보겠습니다.

 

1. set globalport 명령 및 show globalport 명령

Part 1에서 설명한 set adapter 명령은 특정한 하나의 네트워크 인터페이스에 대한 설정을 변경합니다. 그런데, 경우에 따라시스템에 설치된 모든 네트워크 인터페이스에 공통적으로 적용하거나 변경해야할 필요가 있습니다. 이 경우 set globalport 명령을 이용할 수 있습니다.

set globalport명령의 결과는 모든 IPv6 네트워크 인터페이스에 공통적으로 적용됩니다.

명령어 프롬프트에서netsh firewall set global명령을 입력합니다.[그림1]

사용자 삽입 이미지

[그림1]

    o port# : 방화벽에서 개방(open)할 포트번호, enable은 개방을 한다는 의미

    o name : 방화벽 룰(rule)에 대한 이름 지정

    o protocol : tcp, udp 프로토콜 종류 지정
     

예를 들어 웹서버와 관련된 80포트를 개방(open)하기 위해서는 아래 명령을 입력합니다.[그림2]

netsh firewallset globalport 80=enable name=webserver

사용자 삽입 이미지

[그림2]

globalport의 적용 결과를 확인합니다.[그림3]

netsh firewallshow globalport

사용자 삽입 이미지

[그림3]

위 그림에서 보면, 80포트가 개방되어 있고, 이름이 webserver로 지정된 것을 확인할 수 있습니다.

만약 다시 80포? 폐쇄하려면,set global 80=disable명령을 입력합니다.

globalport 적용예를 더 들어보면

netsh firewallset globalport 53=enable name="open dns server" protocol=udp

netsh firewallset globalport 22=enable name="open ssh port" protocol=tcp

위 명령을 실행한뒤show globalport명령으로 결과를 확인합니다.[그림4]

사용자 삽입 이미지

[그림4]

 

2. set logging 명령 및 show logging 명령

set logging 명령을 이용하여 IPv6 ICF에서 발생한 각종 이벤트를 특정 파일에 기록할 수 있으며, 나중에 이 기록을 바탕으로 각종 분석을 실시하게 됩니다.

명령어 프롬프트에서netsh firewall set logging명령을 입렵합니다.[그림5]

사용자 삽입 이미지

[그림5]

    o filelocation : 로그파일이 저장될 위치를 지정

    o filesize : 로그파일의 크기

    o droppedpackets : 방화벽에서 차단된 패킷의 정보 저장 여부

    o successfulconnections : 정상적으로 통과된 연결 정보의 저장 여부

예) netsh firewallset logging filelocation=c:\logfile.log filesize=4096

예) netsh firewallset logging droppedpackets=enable

예) netsh firewallset logging successfulconnections=enable filesize=9068

netsh firewallshow logging명령을 이용하여 정책에 대한 설정을 확인할 수 있습니다.[그림6]

사용자 삽입 이미지

[그림6]

  Comments,     Trackbacks
개발 환경의 새로운 변화「비주얼 스튜디오 2005 맛보기」

닷넷개발 환경의 새로운 변화「비주얼 스튜디오 2005 맛보기」

 

연재순서
1회.닷넷 개발의 새로운 변화, 비주얼 스튜디오 2005 맛보기
2회.닷넷 프레임워크 2.0과 개발 언어의 변화
3회. 웹 애플리케이션 개발의 진화, ASP.NET 2.0

 

비주얼 스튜디오 2005는 새로운 기능으로 무장하여 닷넷 개발자들의 최대 관심 대상으로 부각되고 있다. 특히 ‘비주얼 스튜디오 2005’ 제품군의 최상위 제품인 ‘비주얼 스튜디오 2005 팀 시스템’은 설계, 개발, 배포 주기 등을 지원하며 명실상부한 IT 라이프사이클 개발 도구임을 내세우고 있다.

응용 시스템 모델링부터 코드 구현 및 테스트 관리까지 비주얼 스튜디오 2005에서 지원되는 모든 기능을 한 눈에 확인해 볼 수 있는 엔터프라이즈급 응용 시스템 구현을 위한 ‘비주얼 스튜디오 2005 팀 시스템’을 눈여겨 보자.

XML 웹 서비스, 데스크탑, 모바일 및 웹 기반 응용 프로그램 등 모든 종류의 응용 프로그램 개발, 구축 및 실행을 가능케 해주는 MS의 새로운 프로그래밍 모델인 닷넷 프레임워크를 처음 소개했던 비주얼 스튜디오 닷넷은 기존의 InterDev를 알고 있던 개발자들에게는 가히 충격이 아닐 수 없었다.

그리고 비주얼 스튜디오 닷넷 2003 이후 닷넷 개발자들의 최대 관심의 대상으로 부각되고 있는 ‘비주얼 스튜디오 2005(코드명 ‘위드비(Whidbey)’)는 코드 커버리지, 전문적인 소스코드 제어, 64비트 컴파일러, 배포 도구, 테스트 케이스 관리 및 프로젝트 관리 기능 등으로 무장하여 또 한번의 충격을 예고하고 있다.

과거 InterDev와 비주얼 스튜디오 닷넷 2003은 응용 시스템 자체를 구현하는 소프트웨어 개발 부분에 보다 초점을 맞춘 개발 환경을 제공했다. 이에 비해 비주얼 스튜디오 2005는 아직 닷넷을 접해보지 못한 초보 닷넷 개발자는 물론 취미 삼아 소프트웨어를 개발하는 사람들을 위한 제품, 응용 시스템 자체를 구현하기 위한 소프트웨어 개발 환경만을 지원하는 제품, 엔터프라이즈급 응용 시스템 구현을 위한 제품까지 다양한 환경의 개발자를 위한 폭 넓은 제품 구성을 제시하고 있다.

IT 라이프사이클 도구, 비주얼 스튜디오 2005
비즈니스 환경이 복잡하고 빠르게 변화하는 오늘날의 기업들은 보다 다양한 응용 시스템을 보유하게 되었고, 신규로 구축되는 응용 시스템들은 기존 시스템과의 연계, 통합 등 더욱 향상된 서비스를 기대하는 사용자의 요구를 고려해야만 한다. 이러한 응용 시스템의 개발 프로젝트는 종종 복잡하고, 대규모로 진행됨에 따라 많은 인력들이 개발팀에 합류하게 되고 이들 구성원간의 정보 공유와 향상된 품질 및 비용 감소를 추구하는 시스템 설계는 성공적인 응용 시스템 구축을 위한 기본 요건이 되었다.

이러한 시대적 변화에 대응하며 개발자들이 필요로 하는 보다 효율적인 응용 시스템 개발을 위한 ‘비주얼 스튜디오 2005’ 제품군의 최상위 제품인 ‘비주얼 스튜디오 2005 팀 시스템(이하 팀 시스템)’은 응용 프로그램의 복잡성 증대를 해결하고, 빠르게 변화하는 개발 환경 및 기술에 대처할 수 있는 능력을 제공한다.

팀 시스템은 IT 라이프사이클 도구로 설계(디자인), 개발, 배포 주기 등을 지원해 생산성 향상 및 개발팀원간의 협업 환경을 제공하며, MS의 DSI(Dynamic Systems Initiative) 전략의 중요한 부분을 제공한다.

비주얼 스튜디오 2005 Team System
팀 시스템은 윈도우 서버 시스템 환경에서 조직이 핵심 솔루션 제공의 예측 가능성과 안정성을 향상시킬 수 있도록 검증된 프로세스 지침, 규범적 아키텍처 지침 및 솔루션 액셀러레이터를 포함한다. 팀 시스템은 전체 소프트웨어 개발팀을 지원하는 다음과 같은 도구를 제공한다.


◆ 비주얼 스튜디오 2005 Team Architect 에디션 : 설계자는 비주얼 디자이너를 사용하여 운영 환경에 대해 초기부터 디자인하고 유효성을 검사할 수 있으며, 서비스 지향 솔루션을 디자인하기 위한 통합된 효율적 도구들을 제공한다.

◆ 비주얼 스튜디오 2005 Team Developer 에디션 : 향상된 정적 분석, 코드 프로파일, 코드 검사 그리고 유닛 테스트 도구 등 고급 개발 도구를 사용하여 라이프사이클 전체에서 신속하고 주기적으로 품질을 통합 관리할 수 있다.

◆ 비주얼 스튜디오 2005 Team Test 에디션 : 고급 로드 테스트 도구 및 다양한 분야의 테스트들을 관리하고 실행하기 위해 필요한 도구들을 제공하며 응용 프로그램의 배포 전에 다양한 성능 확인을 수행할 수 있다.

◆ 비주얼 스튜디오 2005 Team Foundation : 프로젝트 매니저는 익숙하게 잘 사용하고 있는 엑셀, Microsoft Project, 윈도우 셰어포인트 서비스와 같은 도구를 기반으로 일련의 프로젝트 관리 업무를 효율적으로 수행할 수 있다. 프로젝트 포탈 사이트는 프로젝트 상태를 일목요연하게 보여주고 각 팀별로도 볼 수 있도록 하며, 팀에서 작업하는 동안 모아진 측정 값들을 다양한 리포트로 보여준다.

더불어 업계에서 증명된 방법에 기초한 재정의 가능한 프로젝트 프로세스를 이용하여 라이프사이클을 운영할 수 있다. 또한 개발팀의 협업을 위해 서버 기반의 팀 공동 작업 도구를 제공하며, 이를 통해 프로젝트의 진행과 상태를 간단하게 관리 및 추적할 수 있다. 포트폴리오 탐색기는 프로젝트 포탈 사이트에 있는 것과 같은 프로젝트 작업을 비주얼 스튜디오
IDE에 통합하여 팀이 쉽게 접근할 수 있도록 했으며, 확장 가능한 작업 목록 추적 시스템과 엔터프라이즈 급을 위한 소스코드 제어를 제공한다.


사용자 삽입 이미지

<그림 1> 비주얼 스튜디오 2005 팀 시스템 제품 구성


궁극적으로 팀 시스템을 통해 설계자나 개발자는 ‘운영을 위한 디자인(design for operations)’을 수행할 수 있고, 개발 환경에서 동일한 기반 구조에 대한 정보를 사용할 수 있다. 이를 통해 실제 배포할 때 발생할 수 있는 문제점들을 초기 디자인 단계부터 실질적으로 파악할 수 있다. 또한 서비스 지향 솔루션을 제공할 때 발생하는 복잡성을 감소할 수 있다.

비즈니스 사용자, 프로젝트 관리자, 작업 관리자, 설계자, 개발자 및 테스터를 비롯한 모든 소프트웨어 개발팀원은 구성원간의 공동 작업을 촉진할 수 있다. 이것이 팀 시스템을 통해 얻을 수 있는 이점이며 팀 시스템이 추구하는 목표이기도 하다. 이제 각각에 대해 좀 더 자세한 내용을 살펴보자.

Team Architect
일반적으로 모델링 도구를 사용하여 소프트웨어 시스템을 설명하려 할 때마다 막대한 시간과 비용 투자 문제에 직면하게 된다. 그리고 대개 결과로 만들어지는 다이어그램은 처음에는 매우 훌륭하게 보이지만 개발이 한창 진행됨에 따라 코드와의 비동기화로 무용지물이 되거나 번거로운 추가 작업을 필요로 하게 된다.

일부 다이어그램과 코드간의 동기화를 제공하는 도구가 이용되기도 하지만 이러한 도구를 익히기 위해 드는 비용과 시간 때문에, 다이어그램을 제작하는 일이 주 업무가 아닌 경우를 제외하면 대개의 많은 사용자들이 모델링 도구 사용법을 익히는 것을 미루고 있다. 이 외에도 시스템 디자인과 이것이 배포되는 환경 특성 사이의 불일치 문제가 있다.

언제나 그러하듯 솔루션이 다이어그램에서 훌륭하게 표현되고 코드화된 다음 배포 시점이 다가올 때쯤이면, 모델이 운영 환경에 정확하게 맵핑되지 않아 발생하는 문제들을 해결하기 위한 작업들이 새로 추가되곤 한다. 또한 설계자, 디자이너, 개발자 및 IT 인프라 운영 부서 직원의 견해 차이로 인해 충돌이 발생할 수도 있다.

이러한 경우 대개 충돌에 대한 제약 조건은 시작 단계에서 조정되는 것이 바람직하며, 실제 서버 보안과 같은 제약 조건은 새로운 시스템을 성공적으로 배포?구현하는 데 장애가 되기도 한다. 중앙의 메인프레임 전용 시스템에서 클라이언트/서버 모델 및 분산 시스템으로 발전해 현재의 IT 환경을 더욱 복잡하게 만든 것도 이러한 문제를 증폭시키고 있다.

다양한 플랫폼과 네트워크 환경에서 사용자의 높은 요구 수준을 충족시키기 위해 응용 프로그램들은 서로 상호작용하며 효율적으로 운영되기 위해 하나의 완전한 서비스로서 존재하는 동시에 메시지 교환을 통하여 서로 연결될 수 있어야 한다. 이러한 서비스 지향 애플리케이션을 만들기 위해 오늘날 매우 널리 사용되고 있는 환경은 서비스 지향 아키텍처(SOA)이며, 이 SOA는 서비스 제공, 메시지 사용 통신 및 종종 신뢰할 수 있는 경계선을 넘나드는 느슨한 결합으로 구성된 자체 응용 프로그램으로 구축된다.

팀 아키텍트는 기술이 발전함에 따라 사용자가 손쉽게 SOA 기반의 시스템을 구축하고 관리하며 기본 플랫폼의 능력을 확장할 수 있는 다양한 기술 및 새로운 그래픽 디자인 도구를 제공한다.

새로운 그래픽 디자인 도구 제공
새로운 디자인 도구는 클래스 디자이너(Class Designer)와 분산 시스템 디자이너(Distributed System Designers)로, 분산 시스템 디자이너는 긴밀하게 통합된 네 개의 도구 그룹으로 구성된다. 이들 네 개의 도구는 응용프로그램 연결 디자이너(Application Connection Designer), 논리적 데이터센터 디자이너(Logical Datacenter Designer), 시스템 디자이너(System Designer), 배포 디자이너(Deployment Designers)이다.

네 개의 도구 중 응용 프로그램 디자이너와 클래스 디자이너는 시스템 및 구성 요소의 그래픽 디자인 지원과 코드 생성 지원 등 주요 특성을 공유한다. 이러한 디자이너들은 양방향 동기화를 지원하므로, 다이어그램이 시스템 및 구성 요소를 나타내지 않는다고 해도 염려할 필요가 없으며, 기존 모델링 시스템의 전형적인 문서 중심의 보기를 능가하는 점에서 모델링 분야에서의 르네상스 시대를 열었다고 할 수 있다.

이러한 디자이너 도구의 사용이 주는 또 다른 이점은 응용 시스템 개발 완료 후 배포 단계에서 발생할 수 있는 오류 또는 변경 사항을 시스템을 설계하는 초기 단계부터 발견하고 대처함으로써 예상치 못한 추가 비용의 발생을 제거하는 것이다.

서비스 지향 시스템을 디자인하고 즉각적으로 이 시스템의 운영 인프라에 대한 유효성 검사를 실행할 수 있는 능력을 ‘운영을 위한 디자인(Design for Operations)’이라고 한다. 응용 프로그램은 대개 하나의 환경에서 디자인되는 경우가 많지만, 그 밖의 다른 환경이나 여러 환경에 배포되도록 설계된다. 대상 데이터센터 모델과 대조하여 디자인 유효성 검사를 수행하는 능력은 배포 과정을 더욱 매끄럽게 만들어 주며, 동시에 연결된 시스템의 개발, 배포, 운영의 단순화 및 자동화를 추구하여 설계자의 관점에 맞추어 작업을 수행할 수 있다.

또한 제약 조건은 양쪽 부분에서 모두 강제 실행될 수 있으므로, 프로젝트 시작 단계부터 유효성 검사 메커니즘을 통해 의사소통을 강제함으로써 시스템이 성공적으로 배포되도록 보장할 수 있다. 그럼 분산 시스템 디자이너를 사용하여 간단한 시스템을 작성하면서 디자인 도구에 대해 살펴보자.

응용 프로그램 연결 디자이너
새로운 솔루션을 만들 때 접하게 되는 첫 번째 디자이너가 응용 프로그램 연결 디자이너로, 웹 서비스 응용 프로그램 및 클라이언트 웹 또는 윈도우 기반 응용 프로그램을 정의하기 위한 디자인 화면을 제공한다. 이 디자이너를 사용하면 응용 프로그램을 연결할 수 있고 코드 내에서 지원돼야 하는 통신 경로를 정의할 수 있다. 또한 구현을 위해 개발자용 기본 胄?구현을 생성하기 전에 응용 프로그램 설정 및 디자인으로 자유롭게 시험해 볼 수 있다.

응용 프로그램 연결 디자이너가 제공하는 비주얼 스튜디오 도구 상자는 윈도우 기반 응용 프로그램, 웹 서비스 및 데이터베이스를 나타내는 구성 요소 집합을 제공한다(<화면 1>). 드래그 앤 드롭 기능을 적용하여 쉽게 시스템을 배치할 수 있다.

예를 들어, 데이터베이스 연결이 필요하다고 지정하려면 ExternalDatabase 구성 요소를 디자인 화면으로 끌어서 놓은 다음 udio의 표준 속성 창에서 데이터베이스에 대한 연결 문자열을 설정한다. 데이터 소스가 결정된 경우에는 웹 서비스의 형식으로 데이터 액세스 층을 추가한다. 웹 서비스를 디자인 서비스로 끌어온 다음에는 둘 사이의 연결을 끌어와 웹 서비스를 이전에 정의한 데이터 소스로 바인딩할 수 있다.

사용자 삽입 이미지
<화면 1> 도구상자
다음 단계는 웹 서비스 인터페이스를 통해 데이터를 표시하는 것으로, 이렇게 하려면 기본으로 생성된 웹 서비스의 종점을 클릭한 다음 종점 정보 창에서 공용 진입점을 정의한다. 새 웹 서비스 프로젝트가 솔루션에 추가되고, IIS의 로컬 인스턴스가 구성되며 언어별 소스 집합과 구성 파일이 생성된다.

솔루션 탐색기에서 코드 폴더를 열면 두 개의 클래스 파일이 표시되는데, 하나는 웹 서비스 구현을 위한 것이고 다른 하나는 web.config 파일에 생성되는 데이터베이스 연결 문자열을 검색하는 데 유용한 유틸리티 클래스이다. 이 시점에서 코드의 공용 진입점에 대해 수정 또는 조정 작업이 이루어질 경우 수행된 변경 사항은 시스템 다이어그램과 자동으로 동기화된다. 초기 디자인을 테스트하는 작업은 비주얼 스튜디오의 초기 버전에서 수행된 것처럼 간단히키만 누르면 된다.

모든 것이 잘 작동되었다면 이제 프론트 엔드를 웹 서비스에 추가해 보자. 응용 프로그램 연결 디자이너의 도구상자에서 ‘ASP.NET 웹 응용 프로그램’을 디자이너 화면으로 끌어서 놓는다. 이전과 마찬가지로 구성 요소를 모두 바인딩해야 하며, 표시된 웹 서비스의 진입점을 클릭하고 웹 서비스 및 웹 응용 프로그램 사이의 연결 링크를 끌어오면 된다.

그런 다음 웹 응용 프로그램에서 마우스 오른쪽 단추를 클릭하고 구현을 선택한다. 그러면 비주얼 스튜디오가 새 웹 응용 프로그램 프로젝트를 솔루션에 추가하고 웹 서비스에 대한 웹 참조를 생성한다. 그런 다음 새 항목 추가 명령을 사용하여 이전 버전에서와 마찬가지로 기본 웹 페이지를 추가한다.

웹 폼 디자이너를 사용하여 웹 서비스를 UI(웹 페이지의 GridView 컨트롤)에 연결하는 ObjectDataSource 구성 요소를 추가한다. ObjectDataSource는 웹 서비스의 표시된 메쏘드 호출을 처리하며, 이 경우 어떠한 코드도 작성할 필요가 없다. 단지 GridView 컨트롤의 속성을 약간 조정한 다음 웹 브라우저에 있는 웹 서비스에서 데이터를 표시하기 위해키를 누르기만 하면 된다. <화면 2>는 응용 프로그램 연결 디자이너에서 완료된 응용 프로그램이다.

사용자 삽입 이미지
<화면 2> 분산 솔루션의 응용 프로그램


논리적 데이터센터 디자이너
다음으로는 배포 환경 내 네트워크의 논리 모델과 실제적인 서버 유형을 정의해야 하는데, 이 단계는 이미 운영 팀에서 완료했을 수 있다. 이러한 경우, 데이터센터의 응용 프로그램 호스팅 기능에 대한 논리 모델을 표현하는 다이어그램을 만드는 데 이용되는 논리적 데이터센터 디자이너를 사용할 수 있다.

이 디자이너를 사용하면 인프라 설계자가 데이터베이스 서버, 웹 서버, 논리 보안 영역 및 통신 끝점과 같은 시스템 엔터티를 표시하여 데이터센터 토폴리지를 지정할 수 있다. 또한 제약 조건은 데이터센터의 요구 사항을 기반으로 한 응용 프로그램 구성에 대해 적용될 수 있다.

사용자 삽입 이미지
<화면 3> 유형
그럼 논리적 데이터센터 디자이너 도구 상자에 표시된 특정 요소를 사용하여 새로운 논리 데이터센터 다이어그램을 만들어 보자. <화면 3>은 현재의 논리 서버 목록 및 지원되는 끝점 유형을 보여준다. 이제 다이어그램에 DMZ(DeMilitarized Zone)를 나타내고 네트워크의 보안 내부 영역을 나타내는 두 개의 영역을 추가해 보자. 그런 다음 DMZ에 견고한 IIS 웹 서버를 정의하고, 내부 영역에는 ‘AppServer’라는 IIS 웹 서버와 SQL 서버를 실행하는 컴퓨터를 추가하자.

IIS 웹 서버의 경우 미리 정의된 입력 및 출력 끝점이 있다. 연결 도구를 사용하면 AppServer와 SQL 서버 컴퓨터 사이의 연결을 포함한 다양한 입출력 채널을 연결할 수 있다. <화면 4>는 완료된 논리 데이터센터 다이어그램이다. 다이어그램을 정의하고 나면 논리 서버에 제약 조건을 추가할 수 있다. 예를 들어 AppServer가 SSL(Secure Socket Layer)을 사용하도록 해야 할 수도 있는데, AppServer를 선택한 후 Settings and Constraints 편집기를 열어 작업하면 된다.

사용자 삽입 이미지
<화면 4> 완료된 논리 시스템 아키텍처


시스템 디자이너
시스템 디자이너를 활용하여 응용 프로그램 연결 디자이너에서 이미 정의된 응용 프로그램의 시스템을 조직하고 구성할 수 있다. 분산 시스템 디자이너에서 시스템은 배포의 기본 단위이고, 하나 이상의 응용 프로그램이나 다른 시스템의 구성 단위로 인식된다. 하나의 시스템은 다른 시스템의 하위 시스템으로 구성될 수도 있기 때문에 매우 큰 분산 시스템을 정의할 수 있다.

응용 프로그램 설계자는 시스템의 nested 구조를 이용하여 복잡한 다중 시스템정의를 만들 수 있으며, 이러한 시스템 정의의 경우 응용 프로그램 연결 디자이너에서 표기된 개발 구성과 별도로 배포 구성을 정의할 수 있다. 즉 시스템 정의는 솔루션에 정의된 응용 프로그램 구성과 서로 다르게 디자인될 수 있고, 각기 다른 데이터센터 구성, 다른 지리적 배포 환경, 다른 고객에 대해서 계획된 다른 배포 구성을 정의할 수 있다.

사용자 삽입 이미지
<화면 5> 다중 시스템 정의 다이어그램


배포 디자이너
프로세스의 마지막 단계는 이전에 정의한 응용 프로그램을 새로 정의한 논리 시스템 아키텍처로 맵핑하는 작업이다. 개발 환경에서 사용된 구성이 배포에 필요한 구성이라 전제하고 시험 배포(Trial Deployment)가 되는 대상을 정의할 수도 있고, 계획한 배포에 맞는 특정한 설정을 구성할 수 있는 새로운 시스템을 명시적으로 만들 수도 있다.

대부분의 경우 먼저 시험 배포를 통하여 심각한 문제들을 제거한 다음 구성을 고정시키는 최종 단계로 시스템을 만든다. 그러면 시스템이 좀 더 안정적인 정의로 구성될 수 있어 대규모의 아키텍처 디자인에서 다시 사용될 수 있다.

이제 시험 배포를 만들어 보자. 응용 프로그램 연결 다이어그램에서 시험 배포 정의(Define Trial Deployment)를 선택한 다음, 팝업 대화 상자에서 이전에 만든 논리적 데이터센터 디자인을 선택한다. 논리적 데이터센터를 배경으로 나타내는 새로운 배포 다이어그램에서 배포 디자이너를 사용해 각 응용 프로그램을 논리 서버로 바인딩하고 배포할 서버의 유형을 나타낼 수 있다.

이렇게 하려면 간단하게 개요 컨트롤 또는 응용 프로그램 연결 다이어그램에서 직접 응용 프로그램을 끌어서 놓으면 된다. 만약 바인딩하려는 응용 프로그램과 서버가 호환되지 않는다면 no-drop 기호가 표시될 것이고, 프로세스가 각 응용 프로그램에서 반복되면서 시스템의 가상 배포를 만든다. 일단 모든 구성 요소를 해당 호스트로 맵핑하면 <화면 6>에 나타난 대로 맵핑의 유효성을 검사할 수 있다.

유효성 검사는 모든 바인딩을 검사하여 양쪽 다이어그램에 정의된 제약 조건을 확인하고, 응용 프로그램에 필요한 경로와 프로토콜을 지원하는 논리적 데이터센터에 통신 경로가 있는지를 확인한다. 오류가 발생할 경우 작업 항목이 비주얼 스튜디오 작업 목록에 추가되며, 오류 목록에서 해당 항목을 두 번 클릭하면 오류가 발생한 다이어그램과 구성 요소로 이동하게 된다.

예를 들어, AppServer가 ASP.NET을 사용하도록 하기 위해 논리적 데이터센터 디자이너에 제약 조건을 설정한다. 이 때 유효성 검사를 실행하면 오류가 발생하는데, 오류 항목을 두 번 클릭하면 선택한 끝점이 잘못되어 있는 응용 프로그램 연결 다이어그램으로 이동하게 된다. Settings 편집기에서 정확한 속성을 조정한 후, 값이 자동으로 web.config 파일에 기록되고 유효성을 다시 검사하면 모든 작업이 완료된다.

개발한 응용 프로그램을 실제로 운영하기 전 극도의 압박감에 시달리는 대신, 이러한 과정을 통해 배포하기 전(가능하면 핵심 개발이 시작되기 전)에 배포 관련 문제점을 발견할 수 있는 이점을 얻을 수 있다.

사용자 삽입 이미지
<화면 6> 하위 시스템 맵퍼


클래스 디자이너
이제 시스템의 외부와 내부를 세밀하게 계획하기 위해 클래스 디자이너를 사용하여 작업할 수 있는 개발자에게 디자인 작업을 넘겨줄 차례이다.

대부분의 객체지향 개발자들은 응용 프로그램 디자인을 위한 다이어그램을 만들고자 할 때
UML문서 양식을 종종 사용한다. UML은 응용 프로그램을 모델링하는 데 사용할 수 있는 여러 유형의 다이어그램을 정의한다. 일반적으로 가장 많이 사용되는 다이어그램 유형은 응용 프로그램의 각 클래스와 함께 다른 클래스에 대한 관계를 표시하는 클래스 다이어그램이며, 각 클래스는 필드와 메쏘드가 나열된 상자에 표시된다.

하지만 불행히도 UML은 닷넷 프레임워크와 같은 현재 기술에 뒤쳐지는 경향이 있다. 예를 들어, UML에는 비주얼 베이직 닷넷 및 C#의 내부 범위와 Friend에 대한 규정이 없다. 또한 닷넷 클래스에 대한 인터페이스의 핵심적인 부분인 속성 메쏘드 또는 이벤트를 나열하기 위한 적절한 방법도 없다.

클래스 디자이너는 비주얼 스튜디오 2005를 사용하는 객체지향 디자이너와 개발자를 위한 아주 좋은 도구이다. 클래스 디자이너는 닷넷 환경에서 비주얼 베이직 닷넷 및 C#의 모든 언어 기능을 반영할 수 있는 UML과 유사한 클래스 다이어그램을 제공한다. 이 클래스 디자이너를 사용하면 정확한 다이어그램을 만들 수 있을 뿐만 아니라 실시간으로 다이어그램과 코드의 동기화를 유지할 수 있다.

<화면 7>은 다이어그램을 위해 생성된 코드와 함께 비주얼 스튜디오 2005의 클래스 다이어그램 도구를 보여준다. 다이어그램이나 코드 중 어떤 것을 변경해도 양쪽 모두 자동으로 동기화 상태로 유지된다. 클래스 디자이너를 사용하려면 비주얼 스튜디오 2005에서 클래스 다이어그램을 프로젝트에 추가해야 하며, 이렇게 하려면 새 항목을 프로젝트에 추가하고 클래스 다이어그램 템플릿을 선택하면 된다.

Class Details 창에서 클래스의 인터페이스를 보고 변경할 수 있다. 이러한 작업에는 메쏘드, 필드, 속성 및 이벤트의 추가와 제거가 포함된다. 또한 이러한 요소들의 범위, 매개변수 및 반환 형식을 변경할 수도 있다. Class Details 창에서 이루어진 모든 변경 사항은 코드에 즉시 적용된다.

사용자 삽입 이미지
<화면 7> 클래스를 Class View에서 클래스 다이어그램으로 끌기


Team Developer
팀 디벨로퍼는 개발자가 제품의 개발 주기 내 초기 단계 또는 주기 내내 언제라도 품질 향상을 위해 코드 버그나 성능 문제들을 발견하고 보완할 수 있도록 통합된 분석 도구들을 제공한다. 개발팀은 이를 통해 SDLC(Software Development Life Cycle)를 효과적으로 관리할 수 있다.

분석 도구의 필요성
여러 다양한 분석 도구들 중에서 소프트웨어 분석 요건을 충족하는 동시에 예산 범위를 벗어나지 않는 도구를 선택하는 것은 항상 쉬운 일만은 아니다. 게다가 이러한 도구는 비주얼 스튜디오 IDE에 통합되지 않을 수도 있고, 능숙하게 사용할 수 있으려면 일반적으로 별도의 시간을 투자해 사용 방법을 습득해야 한다.

별도의 사용자 지정 분석 도구를 구현하는 작업도 쉽지 않은 작업으로 이를 위해서는 자원, 기술 및 경험이 요구된다. 하지만 현실적으로 대부분의 개발팀이 이 모든 것을 갖추기란 어려운 일이며, 이러한 방법으로 분석 도구를 선택할 수 있는 회사는 거의 없을 것으로 생각된다.

촉박한 마감 시간과 한정된 예산을 핑계로 분석을 수행하지 않고 코드를 제공하는 것 또한 현실적으로 타당한 방법처럼 보일 수 있으나, 응용 프로그램이 배포된 후에 오류가 발생하면 이를 수정하기 위해 필요한 비용은 배포 전 소요되는 비용보다 더 많은 비용이 들어갈 수 있다. 견고하고 안정적인 응용 프로그램 개발을 위해 팀 디벨로퍼는 다음 두 가지 범주의 분석 도구를 제공한다.

◆ 코드 분석 도구
◆ 성능 도구


코드 분석 도구
코드 분석 도구의 목표는 개발자가 응용 프로그램 개발 중 정적 분석을 통해 코드 결함을 발견하고 수정할 수 있도록 하는 것으로, 이를 위해 PREfast와 FxCop이라는 두 가지 도구가 제공된다.

Prefast는 C/C++ 소스코드에서 있을 수 있는 결함에 대한 정보를 개발자에게 제공해 주는 정적 분석 도구이다. Prefast가 보고하는 일반적인 코딩 결함에는 버퍼 오버런, 초기화되지 않은 메모리, null 포인터 역참조, 메모리 및 리소스 누수 등이 있으며, 개발자의 생산성 증대 측면에서 보다 편리하고 자연스럽게 분석 도구를 사용할 수 있도록 Prefast는 IDE 내에 통합된다.

<화면 8>에서 보는 바와 같이 개발자는 프로젝트의 ‘Property Pages’에서 ‘Yes(/prefast)’를 선택하여 Prefast를 간단하게 활성화할 수 있다.

FxCop는 관리되는 코드 어셈블리를 분석하고 어셈블리에 대한 정보(예 : 닷넷 프레임워크 디자인 지침 명시된 프로그래밍 및 디자인 규칙의 위반)를 보고하는 정적 분석 도구이다. FxCop는 분석 도중에 수행하는 검사를 규칙으로 나타낸다. 규칙은 어셈블리를 분석하고 발견된 사항에 대한 메시지를 반환하도록 관리되는 코드이다. 규칙 메시지는 관련된 모든 프로그래밍 및 디자인 문제를 식별하고, 가능한 경우 문제를 수정하는 방법에 대한 정보를 제공한다.

사용자 삽입 이미지
<화면 8> PREfast 활성화



사용자 삽입 이미지
<화면 9> FxCop활성화


성능 분석 도구
성능 도구를 사용하여 코드에 존재하는 성능 관련 문제들을 측정, 평가, 해결할 수 있다. 이러한 도구들은 IDE에 통합되어 사용자가 편리하고 원활하게 사용할 수 있으며, 샘플링 및 계측이라는 두 가지 프로파일링 방법을 지원한다.

샘플링 동안 데이터 수집 인프라는 실행되는 응용 프로그램을 정기적으로 중단하여 실행 중인 함수를 확인한 후 해당 함수의 샘플 계산을 증가시키며, 함수 호출에 이르기까지의 호출 스택에 대한 정보를 저장한다. 응용 프로그램이 종료하면 수집된 모든 데이터가 보고서 파일로 생성되며, IDE에 통합된 보고 기능을 사용하여 이 보고서를 편리하게 볼 수 있다.

샘플링은 응용 프로그램이 정기적으로만 중단되기 때문에 오버헤드가 적다는 이점이 있다. 따라서 응용 프로그램이 실제 사용에서와 흡사하게 동작할 수 있으나 이 방법은 샘플링된 함수에 대한 상대적인 성능 데이터만 얻을 수 있다는 단점도 있다.

계측은 응용 프로그램의 특정 부분에 대한 정확한 성능 데이터를 얻을 수 있다는 이점을 제공한다. 계측 도중에 응용 프로그램의 함수에 ‘시작’ 및 ‘종료’ 프로브(probe)가 삽입되는데, 이러한 프로브는 데이터 수집 인프라에 다시 보고됨으로써 함수를 실행하는 데 걸린 시간과 다른 수치를 사용자가 정확하게 파악할 수 있게 해준다.

응용 프로그램을 프로파일링하기 위해 선호되는 방법은 먼저 샘플링을 수행한 다음 샘플링으로 생성된 결과를 기반으로 응용 프로그램의 특정 측면을 계측하는 것이다. 응용 프로그램을 프로파일링하는 절차는 새 성능 세션을 만드는 간단한 방법으로 시작할 수 있으며, 성능 세션 마법사(Performance Session Wizard)를 사용하여 새 성능 세션을 손쉽게 만들 수 있다. 새 성능 세션은 수작업으로도 생성 가능하며 메뉴에서 ‘New Performance Session’ 명령을 사용하면 된다.

성능 세션을 만든 결과는 <화면 11>과 같이 성능 익스플로러(Performance Explorer)에 시각적으로 표시된다.

성능 익스플로러는 계층적 구조로 사용자에게 제공되며, 계층의 루트 노드는 성능 세션을 나타낸다. 이 노드의 속성은 성능 세션을 만들 때 사용자가 설정한 속성으로 사용자가 성능 세션 마법사를 사용하여 세션을 만든 경우 이러한 속성은 사용자가 마법사를 진행하면서 선택한 값이 반영된다. 사용자가 성능 세션을 수동으로 만든 경우 이러한 속성은 기본 값을 포함한다.

응용 프로그램 실행이 끝나면 성능 세션 보고서가 Reports 노드에 자동으로 추가되며, 보고서는 응용 프로그램을 실행하는 동안 가장 비용이 많이 드는 함수를 표시한다. 보고서는 요약 보기, 함수 보기, 호출자/호출 수신자 보기, 호출 스택 보기, 형식 보기 등을 통해 세부 정보를 제공한다.

사용자 삽입 이미지
<화면 10> Performance Wizard 시작


Team Test
팀 테스트는 새로운 테스트 도구 그룹으로 MS 내부에서 사용됐던 테스트 도구들이다. 이 새로운 테스트 도구들은 비주얼 스튜디오에 통합되어 자체 테스트 프레임워크뿐 아니라 완전한 SDLC 솔루션이 제공하는 확장된 프레임워크에도 사용될 수 있다.

품질 보증
모든 응용 프로그램과 웹 페이지의 품질 및 성능 목표치 달성을 위해서는 엄격한 테스트가 우선 선행돼야 한다. 최근 들어 많은 관심을 받고 있는 테스팅 분야는 과거 고급 개발자보다는 초급 개발자의 업무 영역으로 분류되어 가치를 제대로 평가받지 못했으나, 소프트웨어 공학의 전문화와 품질의 중요성이 부각되며 전 개발 공정 중 제일 비용을 효율화할 수 있는 과정으로 인식되고 있다.

사용자 삽입 이미지
<화면 11> Performance Explorer
비주얼 스튜디오는 소프트웨어 개발자를 위주로 하는 제품으로 개발 과정의 테스트 지원 기능을 중점적으로 제공하지는 않았다. 테스터로서 비주얼 스튜디오를 활용해 본인이 원하는 테스트를 수행하기 위한 코드를 작성할 수도 있겠으나, 특별한 목적의 테스트나 테스트를 관리하기 위해서는 써드파티의 전문 테스트용 제품을 필요로 했을 것이다.

더욱이 전문 테스터로서 자료 모델링, 발표, 지원 문서 체계화, 버그 트랙킹, BVT(Build Verification Test) 같은 테스트 세트를 생성해야 한다면 문제는 더욱 복잡해질 것이다. 테스트 툴셋들이 제공하는 결과물은 일반적으로 다양한 도구와 정보 공유를 위한 저장소간에 공유되지 못하는 불편을 준다.

팀 테스트는 비주얼 스튜디오 IDE에 통합되어 테스트를 생성하고 운영하는 데 보다 높은 생산성을 보장한다. 또한 테스트 결과물의 데이터베이스 저장, 경향 분석, 기록 보고서 생성 및 결과 자료의 차이를 비교할 수 기능을 지원한다.

팀 테스트가 지원하는 테스트 형식은 다음과 같다. 팀 테스트는 기존의 테스트 방식을 계속해서 사용할 수 있게 하거나 비주얼 스튜디오에 플러그인해 커스텀 형식의 테스트를 진행할 수 있도록 충분한 확장성을 제공한다.

◆ 단위 테스트 : 프로젝트의 함수나 메쏘드를 실행시키는 코드들로 구성되어 작은 단위의 소스코드를 테스트하는 데 사용됨

◆ 웹 테스트 : 브라우저 세션에서 만들거나 레코딩된 일련의 HTTP URL을 테스트함

◆ 일반 테스트 : 팀이 기존에 쓰고 있던 자동화 테스트와 도구를 사용할 수 있도록 함

◆ 부하 테스트 : 많은 사용자를 시뮬레이트하여 자동화 테스트를 실행함

◆ 매뉴얼 테스트 : 자동화하지 않은 테스트 과정을 단계적으로 수행하는 테스트

테스터 인터페이스
◆ 테스트 뷰 창 : 테스트 네비게이션 및 편집 기능 제공으로 테스트 작성 지원

◆ 테스트 탐색기 창 : 각각의 테스트를 분류하여 관리하는 기능 제공

◆ 실행 환경 설정 대화창 : 정확한 테스트 방법을 정의(<화면 13>)

◆ 테스트 결과 창 : 현재 진행 중인 테스트의 현황(대기, 진행, 미결, 통과, 실패)을 표시, 부하 테스트의 경우는 완료된 상황만을 표시(<화면 14>)

◆ 코드 커버리지 창 : 실행 환경 설정 대화창에서 코드 커버리지를 사용하면, 코드 커버리지 창을 통해 테스트가 진행되는 소스코드 모듈의 파일명, 네임스페이스, 클래스, 메쏘드 및 진행 범위를 표시



사용자 삽입 이미지
<화면 12> 테스트 환경 설정 창



사용자 삽입 이미지
<화면 13> 테스트 결과 창


Team Foundation
개발하는 소프트웨어의 규모가 커질수록 SDLC 초기에 정의한 요구사항이 설계, 개발, 배포, 유지보수 단계에서 제대로 이행되고 있는지 추적하는 것은 매우 어렵고 힘든 일일 것이다. SCM(Software Configuration Management)은훈련, 정책, 절차의 세트로 소스 파일의 제어, 작업 아이템의 생성과 관리, 제품 빌드 제작, 제품 배포 관리 등을 위해 사용되는 전략으로 SDLC에서 주요한 역할을 수행한다.

효과적인 SCM 전략은 마치 자신에게 편하게 잘 맞는 신발과도 같다. 시간이 지날수록 특정 프로젝트팀만의 독특한 필요에는 부합하나 다른 조직과는 공유할 수 없으며 그것이 없어지기 전에는 존재의 가치를 잊고 지내기 때문이다.

팀 시스템은 유연한 SDLC의 엔드 투 엔드 도구로서 설계자, 개발자, 테스터, 프로젝트 매니저, 문서 작성자 등이 함께 일할 수 있도록 도와주어 생산성을 극대화해 주고, 프로젝트의 상태와 결과를 예측 가능하게 한다. 팀 시스템의 중심은 SCM의 절차와 프로젝트팀 고유의 요구사항을 개발자의 일상적인 워크플로우에 반영하는 변경 관리 컴포넌트의 통합이다.

작업 아이템 추적, 소스코드 제어, 정책 지원, 통보와 리포트 생성 등을 지원하는 팀 파운데이션이 제공하는 기능은 크게 변화 관리, 보고서 관리, 통합 서비스, 작업 아이템 추적, 프로젝트 사이트, 프로젝트 관리로 구분된다.

작업 아이템 추적과 소스 코드 제어의 통합
팀 파운데이션은 개발 프로젝트 팀원들이 작업 아이템과 다른 시스템 구성 아이템 또는 산출물과 연관짓게 함으로써 소스코드 제어, 작업 아이템 추적, 빌드 관리간의 격리 현상을 제거했다. 작업 아이템은 프로젝트 팀원에게 할당되는 작업 단위로 적절한 권한을 가진 사람이 수정하거나 할당할 수 있다. 또한 개발 프로젝트마다 고유한 특성에 적합하도록 작업 아이템의 필드, 폼, 상태 변화와 규칙 등의 형식을 정의할 수 있다.

작업 아이템은 리포트로 보고되고 ‘마이크로소프트 프로젝트’를 이용하여 스케줄되며, 분석을 위해 작업 목록을 엑셀로 내보낼 수도 있다. 프로젝트팀원은 자신에게 주어진 일의 우선순위를 설정하거나 연관되는 것에 대한 참고 사항을 만들 수 있다. 버그 수정 완료 후에는 테스터에게, 기타 다른 정보가 필요할 때는 관련자에게 필요한 내용을 통보할 수 있다.

설계자, 개발자, 테스터, 문서 작성자 등은 이슈 사항을 관리하기 위하여 프로젝트 구성 아이템으로 작업 아이템을 만들고 할당할 수 있으며 이슈 사항을 결론짓기 위해 진행 상황을 추적할 수 있다. 팀 파운데이션 서버에 들어가는 일반적인 작업 아이템은 버그, 요구사항, 태스크, 리스크, 작업 스케줄 등이 해당된다.

소프트웨어 개발 프로젝트에서 성공적으로 협업하기 쉬운 방법 중의 하나는 공유 개발 리소스를 제어하는 것이다. 소스 제어는 팀 리소스가 사고로 지워진다든지 실수로 덮어쓰는 것을 막아주고, 여러 개발자가 같은 프로젝트 아이템을 작업하거나, 프로젝트를 동시에 여러 가지로 나누고, 모든 프로젝트 아이템을 버전별로 유지보수할 수 있게 해준다.

팀 파운데이션은 새로운 엔터프라이즈 수준 소스 제어 도구로, 안정적이고 빠르며 대용량 지원 및 보안이 강화됐다. 또한 확장이 가능하고 이미 널리 사용되는 비주얼 소스세이프의 거의 모든 기능을 포함하고 있다. 개발자는 IDE을 벗어나거나 다른 응용 프로그램을 열지 않고도 모든 소스의 제어 작업을 수행할 수 있다. 팀 파운데이션의 소스코드 제어 모듈은 SCM을 위해 독립적으로 사용될 수도 있고, 변화 관리를 위한 팀 시스템의 구성 항목으로 통합 사용될 수도 있다.

소프트웨어 프로젝트 관리
프로젝트 관리의 중요성은 소프트웨어 개발 경험을 갖고 있는 사람이라면 누구나 공감하는 사항일 것이다. 납기를 맞추고 한정된 예산 범위에서 초기 설정된 목표를 달성하기 위해서는 지속적인 모니터링과 적절한 시기에 적절한 리소스의 투입을 필요로 하게 된다.

팀 파운데이션의 프로젝트 관리 도구는 보다 나은 계획 수립, 일정 관리, 협업, 의사소통, 보고 및 프로세스 제어를 위한 도구로 IDE와 통합뿐 아니라 엑셀, 프로젝트, 워드, 셰어포인트 서버 등 프로젝트 관리자가 이미 익숙히 잘 활용하고 있는 제품들과도 통합되어 사용될 수 있다. 팀 파운데이션의 세 가지 주요한 기능은 다음과 같다.

◆ 팀원간 의사 교류 및 협업 : 프로젝트팀원간의 원만한 의사 교류 및 협업을 위해 작업 아이템 데이터베이스를 중앙에 유지하여 항상 작업 아이템의 최신 상태가 유지될 수 있다, 또한 체크인, 체크아웃 기능을 도입하여 해당 작업 아이템의 진행 상태를 모니터링할 수 있고 각 팀원의 작업 결과가 즉시 반영될 수 있도록 한다.

◆ 소프트웨어 프로세스 관리 : 소프트웨어 프로세스를 관리 도구에 반영하여 작업 할당과 작업 완료 여부가 자동화되어 프로젝트팀원간에 공유된다. 소프트웨어 프로세스 구성 항목은 문서 템플릿, 작업 아이템, 워크플로우, 보고서, 보안 그룹, 체크인 정책 및 프로세스 가이드 등으로 이들 항목들은 방법론 템플릿 형식으로 제공된다.

◆ 풍부한 리포트 관리 : 각 작업 아이템에 대한 진행 상황을 리포트로 생성하고, 해당 작업 아이템이 완료되었는지 추적하거나 결과가 어떻게 되었는지에 관련된 코드를 볼 수도 있다. 개발자는 또한 코드 체크인을 작업 아이템이나 그것이 필요한 빌드와 연관지을 수 있다.

만약 어떤 버그가 테스트에서 실패했다면 팀 파운데이션에서 테스트하는 동안 무엇이 잘못되었는지를 보여주고, 개발자가 손쉽게 수정 보완할 수 있도록 테스트 코드를 보여주며, 수정한 것이 테스트를 통과하는지 확인할 수 있다. 테스터가 버그를 올린 것에 대해 현재 버그가 어느 정도 발생되고 있는지, 계획한 분포를 따르고 있는지를 추적할 수 있으며, 성능 검사를 하거나 테스트 케이스를 실행했을 때 결과에 대한 정보를 그래프로 볼 수 있어 프로젝트 상태를 즉시 확인해 볼 수 있다.

프로젝트 매니저는 프로젝트가 정해진 날짜에 완료될 수 있는지 검사할 수 있으며, 이 모든 것이 한 곳에서 처리될 수 있다.


Do more with less
지금까지 팀 시스템이 제공하는 새로운 다양한 기능에 대해서 살펴봤다. 비용 측면뿐 아니라 효율적이고 생산적인 리소스 활용 측면에서 운영을 고려한 시스템 설계(디자인)가 중요하게 인식되고, 성공적인 소프트웨어 개발을 위해 프로젝트 팀원간의 다이나믹한 정보 공유 및 협업이 부각되며, 빈번하게 요청되는 다양한 보고서 생성을 위한 번거로운 수작업으로 불필요한 리소스를 소비하고 있다면 팀 시스템이 바로 문제의 답일 것이다.

기존의 비주얼 스튜디오 제품이 코드를 작성하는 개발 업무에 보다 초점을 두었다면 팀 시스템은 설계(디자인), 개발, 배포 주기 등 IT 라이프사이클 전 공정에서 개발 프로젝트팀원 전체를 위해 도구로 상호운영성과 개방형 표준을 지향하는 MS의 사상이 반영된 제품이기도 하다. ‘Do more With less(더 적은 자원으로 더 많은 것을)’, 이제는 실행에 옮겨야 할 때이다. @

* 이 기사는 ZDNet Korea의 자매지인마이크로소프트웨어에 게재된 내용입니다.

 

김현정 (한국MS)

2004/12/14

 

사용자 삽입 이미지

 

원문 :http://www.zdnet.co.kr/techupdate/lecture/dotnet/0,39024986,39132214,00.htm

  Comments,     Trackbacks