'볼거리, 읽을거리, 놀거리'에 해당되는 글 236건

  1. 2005.03.26 캐럿보이넷 :: 짠돌이 사이트
  2. 2005.03.26 캐럿보이넷 :: [UML 제대로 알기] ③ 개발 프로세스에 따른 UML 실전 모델링
  3. 2005.03.22 캐럿보이넷 :: [UML 제대로 알기] ② 초보자를 위해 다각도로 살펴본 UML
  4. 2005.03.15 캐럿보이넷 :: 키우면 좋은 환경을 만들어 주는 식물들
  5. 2005.03.15 캐럿보이넷 :: [UML 제대로 알기] ① 가능성·확장성 품고 등장한 UML 2.0
  6. 2005.03.13 캐럿보이넷 :: 이공계 기피 현상은 한국이 조선시대로 돌아가고 있다는 증거 2
  7. 2005.03.03 캐럿보이넷 :: 오래오래 연애 잘하는 법 3
  8. 2005.02.22 캐럿보이넷 :: 멋진 키스장면 모음
  9. 2005.02.19 캐럿보이넷 :: 학과별 대학생들의 비애
  10. 2005.02.14 캐럿보이넷 :: 교통 소통상황
  11. 2005.02.10 캐럿보이넷 :: [뉴스] '학·석사 통합' 2학기부터 도입, 석사 1년 먼저 딴다
  12. 2005.02.10 캐럿보이넷 :: [뉴스] 강원대 첫 '석사 학위 없는 박사' 배출
  13. 2005.02.10 캐럿보이넷 :: [뉴스] 삼성 "이공계 전공성적 좋으면 가산점"
  14. 2005.02.10 캐럿보이넷 :: 이성이 본 섹시한 신체부위와 옷차림
  15. 2005.02.08 캐럿보이넷 :: Weekend(Guitar Sound), 슈퍼마리오 일렉기타버젼
  16. 2005.02.08 캐럿보이넷 :: 이번에 설 끝나고 살것들.. 3
  17. 2005.02.08 캐럿보이넷 :: 우울하면 기타를 잡아라 2
  18. 2005.02.04 캐럿보이넷 :: 스트링을 char형 배열에 넣기 2
  19. 2005.02.04 캐럿보이넷 :: String table 리소스 사용하기
  20. 2005.02.03 캐럿보이넷 :: DLL의 모든 것
  21. 2005.01.30 캐럿보이넷 :: 학교 대사전
  22. 2005.01.29 캐럿보이넷 :: 웹에서 메시지 박스 띄우고 페이지 이동
  23. 2005.01.19 캐럿보이넷 :: LIVECD-HowTo 1
  24. 2005.01.19 캐럿보이넷 :: 버그 없는 깨끗한 프로그램 만들기
  25. 2005.01.13 캐럿보이넷 :: 화면 번쩍임 없애기 3
  26. 2005.01.12 캐럿보이넷 :: [뉴스]노래가사 홈피에 올려도 저작권위반 1
  27. 2005.01.12 캐럿보이넷 :: 운동 않고 게으른 사람이 장수한다
  28. 2005.01.06 캐럿보이넷 :: [데스크칼럼] 경쟁상대는 세계다 이 바보야
  29. 2005.01.06 캐럿보이넷 :: [뉴스]19세 컴퓨터 천재 빌 게이츠 왕국 넘봐 2
  30. 2005.01.05 캐럿보이넷 :: 각 데이터타입별 최대값, 최소값 2


요즘 신세대 알뜰족에게 최고의 인기를 얻고 있는 인터넷 초절약 사이트. 완전 공짜에서 할인 쿠폰, 그리고 반품 사이트까지…. 조금만 부지런하면 당신도 현명하고 행복한 짠돌이ㆍ짠순이가 될 수 있다.   한 번 클릭으로 부자되는 최소의 길로 당신을 안내한다.

에디터 | 박혜미



돌아온 거면 뭐 어때? 반품 사이트


반품 닷컴 (www.vanpum.com)

반품 리스트를 클릭하면 반품 사유까지 알 수 있어 제품을 안심하고 구입할 수 있는 사이트. 서울 삼성동 코엑스몰에 오프라인 매장도 갖고 있다. 재고 상품, 소비자 변심에 의해 반품된 상품, 매장 전시 제품 등으로 구분되어 판매되고 있으며, 제품 구매시 최소 3개월 이상의 A/S는 물론 100% 교환이나 환불까지 보증된다.


반품 럭셔리 (www.vpluxury.com)

유명 브랜드나 명품 중에서 반품과 매장 전시품을 골라 저렴하게 판매하는 사이트. 명품 감정사의 정품 검증 후 판매되므로 믿고 구입할 수 있다.

8만원 이하 구입시 3000원의 배송료가 부가되며, 3일 내 교환이나 반품 시 택배비 외에 4천원을 추가 지불해야 한다.


리퍼브 샵 (www.refurbshop.co.kr)

반품할인 뿐만 아니라 개인이나 단체에게 렌털했던 제품을 초저가인 9천 9백원에 판매하는 9900존 등이 있다.

정크존에서 구입한 제품 외의 모든 제품이 수령 후 3일 내에 교환 또는 환불이 가능하고 A/S도 보장된다.


유니즈 닷컴 (uniz.korea.com)

반품 및 이월상품을 전문적으로 파는 사이트. 유니즈가 강력하게 추천하는 베스트 반품 코너와 믿을 수 없는 가격의 헐값 땡처리 코너가 눈여겨볼 만하다.

분당 오리역 CGV 3층에 유니즈 닷컴 직영 매장도 있다.

조금씩 아끼는 재미, 쿠폰 사이트

메뉴판 (www.menupan.com)

먹을거리에 관한 한 이곳을 따를 수 없다. 맛있는 즐거움이 있는 메뉴판 닷컴.

할인 쿠폰은 물론 전국 최고의 맛집들에 대한 정보가 가득하다.


코코 펀 (www.cocofun.co.kr)

외식, 뷰티, 문화 등 다양한 카테고리의 쿠폰을 얻을 수 있다.

요일별 쿠폰과 모바일 프리미엄 서비스 외에도 매월 1일 오프라인으로 쿠폰 매거진 발행.


또오레 (www.ttoore.co.kr)

신촌, 홍대, 강남, 압구정을 비롯해 젊은이들이 많이 찾는 지역의 쿠폰이 있는 곳. 할인 쿠폰보다 조건부 무료 쿠폰이 많은 것이 특징.

배송료만 지불하면 쿠폰북 구독이 가능하다.


쿠폰 투유 (www.coupon2you.co.kr)

먹을거리, 볼거리 이외에 여행, 유학, 이사 등과 관련된 쿠폰이 많은 곳.

다양한 쿠폰을 온라인에서뿐만 아니라, 유명 주간지와 월간지에서 오프라인으로도 만날 수 있다.


씨티 스케이프 (www.cityscape.co.kr)

도시생활 정보와 함께 할인 쿠폰을 제공하는 사이트. 서울의 경우 업종별ㆍ지역별로 상세한 검색이 가능하다.

신속한 업데이트가 최고 장점이다.


한 푼도 낼 수 없다, 완전 공짜 사이트

* 무료 시사회로 감동 두 배


무비스트 (www.movist.com)

최신 영화 소개부터 20자 평까지 영화에 대한 모든 것을 제공하는 영화 전문 사이트.

전국 유명 극장 예매도 가능하고, 영화 관련 이벤트가 많아 여러모로 유용하다. 간단한 퀴즈만 풀면 개봉 예정작의 시사회에 자동 응모된다.


출발 비디오 여행 (www.imbc.com)

영화 정보 프로그램에서 진행하는 시사회 이벤트.

해당 프로그램의 방영이 끝나는 순간부터 이벤트가 진행되며, 별도의 사연 기재 없이 보고 싶은 영화만 클릭하면 된다. TV 프로그램이니만큼 좋은 영화가 많다.

* 공짜로 꾸미는 휴대폰


네이트 온 (nateon.nate.com)

가장 인기가 높은 무료 문자 사이트로 회원 가입만 하면 문자 메시지가 월 100회 무료.

물론 011이 아니어도 가입이 가능하다. 메신저 기능도 있는 네이트 온은 최근 싸이월드 미니홈피와 연계되어 더욱 편리해졌다.


벨소리 바다 (www.ringbada.com)

이벤트에 참여하면 벨소리가 무료다.

또는 이곳에 게재되어 있는 타 사이트 회원 가입 이벤트를 통해 포인트를 적립하여 해당 금액에 해당되는 벨소리나 컬러링을 구입할 수 있다.


구라 코리아 (www.gurakorea.com)

인기 유머부터 엽기 동영상, 최신 플래시까지... 재미있는 요소들이 많다.

무엇보다도 회원 가입을 하면 매일 3건의 문자가 무료로 제공되고, 벨소리와 컬러링도 무료 서비스도 곧 시행될 예정이라고 한다.

* 내 피부에 맞을까? 무료 화장품 샘플


DHC (www.dhckorea.com)

홈페이지에서 회원 가입만 하면 여성에게는 스베스베 샘플 4종 세트를, 남성에게는 DHC for Men 샘플 5종 세트를 무료로 보내준다.

3일 사용 분량으로 배송료도 없다.


이지함 (www.LJHmall.com)

구매 고객은 물론 신규회원에게도 클린징 젤과 선블록 로션을 비롯해 5종 세트로 구성된 샘플을 증정한다.

회원 가입 후 별도로 이벤트 메뉴에서 샘플 신청서를 작성하면 1회에 한해 샘플이 제공된다.

돈 버는 알뜰 정보 공유 카페

짠돌이 카페 (cafe.daum.net/mmnix)

국내 알뜰 카페의 전설인 회원 수 39만 7천 명의 짠돌이 카페. 알뜰 고수들의 수준 있는 절약 테크닉을 쉽게 배울 수 있다.

주부, 직장인, 학생 등으로 나누어 그에 알맞은 절약 노하우를 제시해 더욱 유익하다.


부자 클럽 (cafe.daum.net/3seoul)

회원 수 4천1백여 명의 알뜰하게 사는 방법이 가득한 다음 카페.

무료 문자와 벨소리는 물론 무료 시사회, 화장품, 만화, 운세까지 돈 한 푼 들이지 않고 모든 것을 누리는 노하우를 얻을 수 있다.


짠돌이 협회 (cafe.naver.com/zzandol2)

짠돌이 십계명이 인상적인 회원 수 9천 2백여 명의 짠돌이 협회 카페.

이곳 역시 학생과 직장인, 주부의 절약 연구소가 각각 만들어져 있으며, 1주일을 5천원으로 살아보는 ‘5천원의 행복’이란 메뉴가 재미있다.



Posted by 장안동베짱e :
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의 제휴매체인 마이크로소프트웨어에 게재된 내용입니다.
Posted by 장안동베짱e :
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의 제휴매체인 마이크로소프트웨어에 게재된 내용입니다.
Posted by 장안동베짱e :
쟈스민 : 겨울철에는 빛이 많이 필요하겠지만, 여름철이나 봄가을의 따사로운 햇살은 차광이 살짝되는 밝은 실내가 좋은 환경입니다. 물은 보통정도 관리를 요하고, 추위에는 엄청 약합니다.

로즈마리 : 조금 건조한 환경을 좋아하며 빛을 엄청 좋아하는 식물입니다.
빛이 약하면 웃자라거나 힘없이 쳐지며 향기도 줄어들게 되죠. 과습은 치명적이니 주의하시고, 약산성의 토양이 좋습니다.

산세베리아 : 공기정화로 요즘 인기가 엄청 좋지요. 산세베리아도 약산성 또는 중성토양이 좋으며, 건조한 환경이 좋습니다. 습기가 차면 절대 안되구요. 빛을 좋아합니다. 실내적응력도 좋지만, 되도록 밝은곳에 두시길...

이상을 종합하면, 실내 가장밝은곳에 두고 키우심 되겠지요.
쟈스민이나 로즈마리와 같은 종보다는 오히려 아이비, 산세베리아 등과 같은 관엽이 좋지않았을까 생각해봅니다. 스킨답서스도 좋고.. 양치식물류도 좋구요 ^^
Posted by 장안동베짱e :
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의 제휴매체인 마이크로소프트웨어에 게재된 내용입니다
Posted by 장안동베짱e :
출처 : http://monthly.chosun.com/board/view_content.asp?tnu=200405100065&catecode=B&cPage=1

「W 이론」의 창시자 - 서울工大 李冕雨 교수의 경고

理工系 기피 현상은 한국이 조선시대로 돌아가고 있다는 증거

근대화 시기의 理工系 선호는 예외의 시대 현상이었다

理工系 기피의 최종 피해자는 국민…있는 名門(서울大)도 없애겠다는 발상은 죽음에 이르는 病


李 冕 雨
1945년 개성 출생. 경기高·서울工大 섬유공학과 졸업. 美 미시간大 인간공학 박사. 서울工大 산업공학과 교수(1970~). 서울大 공학연구소 소장. 대한산업공학회 회장 역임. 저서로 「w이론을 만들자」, 「신사고이론20」, 「신창조론」 등. 상허대상(1993년), 세종문화상(1996년), 美 미시간大 100인의 우수박사상(1988년), 올해의 경기인 상(1993년), 미시간大 공대 우수동창상(1994년) 수상.

 

서울大는 관악산의 최고 대학
 많은 사람들이 理工系(이공계) 교육의 위기를 얘기한다. 정확히 말하면 理工系의 위기가 아니라 대한민국의 위기다. 이건 아주 간단명료한 문제다. 살고 싶으면 이 문제를 해결해야 하고, 죽고 싶으면 지금까지 그랬듯이 그냥 놔두면 된다.
 
  나는 1991년 「서울공대 白書(백서)」를 발간했다. 「서울대학은 국내 최고의 대학도 아니고, 세계 400위 안에도 못 드는 관악산의 최고대학」이라는 게 백서의 핵심 내용이었다. 지금까지 변한 것은 아무것도 없다. 서울대학은 지금도 관악산의 최고 대학일 뿐이다.
 
  2002년 大選 때 서울大 폐지 이야기가 나왔을 때 나는 어안이 벙벙했다. 아니 관악산 골짜기의 골목대장밖에 안 되는 대학을 없애서 무얼 어쩌겠다는 것인가?
 
  나는 「서울공대 白書」와 1992년에 펴낸 「W 이론을 만들자」에서 「오늘날 우리 공학교육의 위기는 5년 내지 10년 후 국가 전체의 위기로 냉큼 대두될 것이다」고 지적했다. IMF가 터지자 내 책을 읽은 많은 사람들이 『어쩌면 그렇게 족집게같이 예견을 했느냐』고 물었다. 그건 상식이 있는 사람이면 누구나 내다볼 수 있는 일이었다.
 
  理工系 교육이 왜 국가위기를 진단할 수 있는 지표가 되는가? 이유는 간단하다. 국가 경제를 지탱하는 바퀴는 두 개다. 하나는 국가 경쟁력이고 하나는 가계부 작성이다. 돈을 잘 벌어야 하고, 번 돈을 잘 써야 하는 이치다. IMF는 벌이는 없고 가계부 작성도 엉망이었기 때문에 온 것이다.
 
  IMF 외환위기 이후 가계부 작성을 투명하게 합리적으로 해야 한다는 사실을 우리는 뒤늦게 깨달았다. 엉망이었던 가계부 정리는 대충 끝났다. 구멍난 곳을 메우는 데 150조원이 넘는 돈이 들어갔다.
 
  벌이를 하려면 기술이 있어야 한다. 「W 이론」에서 나는 세계 1등 기술만이 생존할 수 있다고 했다. 국제사회에서의 경쟁은 고스톱 판과 포커 판의 게임처럼 1등이 모든 것을 가져간다. 2등이나 3등은 家産(가산)만 탕진할 뿐이다.
 
  당시에는 『도대체 무슨 얘기냐』는 사람들이 수두룩했지만, 이제 이 얘기에 이의를 제기하는 사람은 사라졌다. 예전에는 인구 1억 명이면 내수시장만으로 국가를 지탱할 수 있다고 했지만 요새는 인구가 문제가 아니다. WTO(세계무역기구), FTA(자유무역협정) 등 글로벌 네트워킹 때문에 인구가 10억 명이 넘어도 기술이 없으면 굶어야 한다.
 
  우리나라는 과학기술 이외에 팔아먹을 것이 없다.
 
  제주도를 天惠(천혜)의 관광지라고 하지만 1년에 비오는 날이 100일이 넘어 세계적인 관광지로는 부적격이다. 발리나 하와이에 가 본 사람들은 내 얘기에 금방 고개를 끄덕일 것이다. 관광국가로 먹고 살기에 우리의 문화유산은 너무 빈약하다.
 
  벌이가 없으면 아무리 가계부를 잘 써도 소용이 없다. 우리가 돈을 벌 수 있는 원천은 과학기술뿐이다. 대한민국의 대학이 과학기술을 제대로 생산해 낼 수 있는 시스템을 갖추고 있느냐, 학생들이 과학기술을 제대로 배우고 있느냐는 우리나라가 5년 후, 10년 후 어디로 갈 것인지를 보여 주는 가장 중요한 지표가 될 수밖에 없다.
 
  대한민국의 기업과 대학, 연구기관들은 세계에서 경쟁할 수 있는 源泉(원천) 기술을 연구 개발하고 있는가? 답은 너무나 절망적이다.
 
  삼성전자가 핸드폰을 하나 만들 때 퀄컴에 지불하는 로열티가 판매가의 15% 정도다. 반도체를 만들려면 설비와 부품을 일본에서 모두 수입해야 한다. 앞으로 남고 뒤로 믿지는 장사다. 그것도 삼성전자의 얘기다.
 
  정부는 「2만 달러 국민소득 달성을 위해 5大 성장전략 산업을 육성하겠다」고 한다. 독자적인 기술 없이 어떻게 5大 성장 전략 사업을 키우겠다는 말인가?
 
 
  미련한 최후의 변절자들
 
  지난해 서울공대생 23명이 사법고시에 합격했다.
 
  적어도 100명에서 150명의 工大生이 머리를 싸매고 골방에서 법전을 외워대고 있다는 증거다. 아마 그것보다 더 많은 수의 학생들이 『나도 늦기 전에 고시공부를 해야 하지 않을까』 하며 마음의 갈피를 못 잡은 채 考試공부의 언저리를 헤매고 있을 것이다.
 
  서울공대 학부생 5500명 가운데 10% 이상이 考試의 유혹에 시달리고 있다는 얘기다.
 
  서울大 물리학과에 다니던 한 학생이 다시 大入 시험을 봐서 서울의대에 입학했다. 면접장에서 제자를 만난 물리학과의 한 교수는 기가 막혀서 『(수능시험에서) 물리 과목은 다 맞았겠지』라고 했다고 한다.
 
  考試공부를 하고 있는 서울大 자연대 와 공대의 학생들은 고등학교 때부터 일찌감치 돈 잘 버는 의사·한의사·변호사가 되겠다고 작심한 아이들에 비교하면 미련한 「최후의 변절자」에 불과하다.
 
  나는 이 제자들이 딱하기만 하다. 눈치 빠르게 일찌감치 돈 버는 쪽으로 갈 것이지 서울공대에는 왜 들어왔다는 말인가.
 
  서울공대나 자연대학에 진학한 학생들은 모두 고등학교에서 수학과 과학을 특출나게 잘 했고, 과학기술을 연구해야겠다는 신념을 가졌던 친구들이다. 그런 아이들이 흔들리고 있다.
 
  이유가 뭘까? 우리 사회가 『이공계 공부해야 이렇게 비전이 없는데 그래도 고집을 부리면서 理工系 공부를 계속 할 거냐』면서 이 아이들을 끊임없이 고문하고 있기 때문이다.
 
  大田 대덕의 연구원들은 밤 12시까지 연구를 해야 한다.
 
  왜냐하면 세계 최고의 연구자 학자들과 치열한 경쟁을 해야 하기 때문이다. 이들이 20代, 30代에 습득한 기술과 이론들은 순식간에 과거의 것이 되고 만다. 理工系 연구인력의 停年은 대부분 40代다.
 
  理工系 인력은 과학기술의 발전 속도에 뒤지지 않기 위해 끊임없이 노력해야 한다. 그런데 이들을 기다리는 건 「사오정」이라는 운명이다. 과학기술 인력을 바라보는 우리 사회의 눈길에는 존경과 냉소가 뒤섞여 있다.
 
  이들이 한국을 이끌어 가는 견인차라는 걸 어렴풋이 인식한다. 하지만 이들의 연구활동을 지탱하기 위해 무엇을 해야 할 지에 대해서는 생각하기 싫다. 국민의 이해부족과 낮은 지위와 보수 때문에 이공계 출신들은 절망의 늪에 빠져 있다.
 
  이런데도 당신들은 자식들을 이공계에 보낼 것인가?
 
  의대와 한의대에, 법과대학과 상과대학에 자녀들을 보내는 것은 인지상정이고 합리적인 판단이다. 개인차원의 합리적인 선택이 모여 사회차원의 非합리적 선택이 되는 현상을 미리 알고, 차단하는 것은 국가 지도자의 몫이다.
 
 
  재벌 총수들 『공장이 없으면 파이낸싱이 안 되잖아』
 
  두 재벌기업 총수에게 『왜 기술력도 확보되지 않은 공장들을 자꾸 늘려가느냐』고 물은 적이 있다. 두 사람의 대답이 똑같았다.
 
  『李교수, 그러니까 理工系 출신들이 눈치 없다는 얘기를 듣는 거요. 공장이 없으면 파이낸싱이 안 되잖아』
 
  두 총수가 이끌던 거대 재벌기업 두 개는 IMF 전후에 무너졌다.
 
  그때 한 재벌 총수는 내게 이런 얘기를 했다.
 
  『생산성 향상, 그거 별 의미가 없어요. 5~6% 이윤이 남는데 30% 생산성 향상시켜 봐야 기껏 2% 포인트 이윤을 더 남기는 겁니다. 공무원들하고 골프 치고, 술 먹고 해서 큰 프로젝트 하나 따오면 20%, 30% 이윤이 남아요. 로비 잘하는 게 생산성 향상시키는 것보다 열 배는 쉽게 돈 버는 일입니다』
 
  공장을 세워서 은행 돈을 빌리고, 그 돈을 부동산에 투자하고, 덩치를 키워 정부의 특혜를 받고…. 그런 식으로 기업들은 살아왔다. 그 체질이 지금도 과히 많이 바뀌지 않았다. 서울大 법대와 상대를 나온 사람들은 재벌기업의 비서실, 기획실, 마케팅실에 근무하면서 정·관계에 포진한 동문들과 네트워크를 형성했다.
 
  지금도 理工系 졸업생들은 『당신들이 중요하다』는 말만 듣지 계속 벽지 공장을 돌게 된다. 理工大 졸업생들의 좌절은 여기서 시작한다. 엔지니어들이 말도 못 하고 속을 끓이는 사이에 몇 년 후배인 法大·商大 출신들은 쭉쭉 승진을 한다.
 
  理工系 졸업생은 승진에 한계가 있다. 경영진에 많이 기용되지를 못한다. 벽지의 공장에 처박혀 있으니까 「촌닭 같아서」임원으로는 못 쓰겠다는 것이다.
 
  그래도 과거에는 엔지니어들에게 프라이드가 있었다. 공장에서 생산성을 향상시켰다고, 품질개선을 했다고 총수와 간혹 악수할 기회도 있었다.
 
  1960년대, 1970년대에 기업들이 외국 기술과 기계를 도입하면, 영문 매뉴얼을 보고 가동시키는 일을 서울공대 출신들이 했다. 복잡한 영어 매뉴얼을 보고 다들 기겁을 하는데 그나마 서울공대생들이 그걸 해낼 수 있었다.
 
  요즈음은 그 일을 외국에서 공부한 교포 출신들이 대체한다. 영어 실력이 서울공대생들보다 월등하기 때문이다. 기업 내부에서 『서울공대 나온 친구들이 기술을 알면 얼마나 더 아나, 교포 2세가 낫다. 미국에서 대학교 2학년 다니다가 왔다는데도 또랑또랑하고 매너 좋고, 아무나 만나도 섭섭하게 안 하고…』 이렇게 되는 것이다.
 
 
  理工系가 아니라 理理系
 
  왜 대학들은 이렇게 기술 경쟁력이 없는 공대생들을 양산하고 있을까?
 
  서울工大는 물론이고 대다수 공과대학이 이론 교육에 치중한다.
 
  강의 시간에 외국 이야기만 들으니 학생들은 감흥이 일지 않는다. 학생들이 『우리가 직접 실험하려면 어떻게 하면 됩니까』 하고 물으면 교수들은 『여기서는 못해』하고 의욕을 꺾어 버린다. 학생들은 교수들로부터 「너희는 안 된다」는 메시지를 계속 받는다.
 
  서울工大 교수의 학위논문 80% 가까이가 이론이다. 理工系가 아니라 理理系(이이계)인 셈이다. 우리 공대생들은 실험을 해 본 적이 없기 때문에 유학 가면 다 촌닭이 된다.
 
  이런 현실에 대해 교수들은 『실험실습비도 없고, 실험장비도 없다, 어차피 나만의 책임은 아니지 않느냐』며 항변한다.
 
  그러니 理工系 출신들은 유학 가서도 다 이론 쪽으로 간다.
 
  기업은 해외(주로 일본)에서 기술을 들여오고, 理工系 대학은 해외 학계의 발전 내용을 어학실력이 닿는 대로 번역해서 가르치고 있다. 産學(산학)협동이 있을 수 없다. 수요도 없고 공급도 없다. 기업과 대학 사이에 오가는 연구비는 기업들이 理工系 학생들을 조달하려는 차원에서 에이전시한테 주는 커미션일 뿐이다.
 
  최근 들어 서울工大의 커트라인이 웬만한 지방의 의과대학보다 떨어진다. 『공대 지원자가 정원에 미달한다는 사실이 신문에 자꾸 보도되니까 공대가 더 죽는다』며 정원 미달 사실을 숨기는 것을 대책으로 들고 나오는 교수도 있다.
 
  입학생들의 실력이 떨어져 수학·과학 「보충반」을 편성해야 할 지경이다.
 
  『이런 수준의 학생들을 데리고 도대체 어떻게 교육을 하라는 말이냐』고 한탄하는 동료 교수들에게 나는 『대한민국 최고 수준의 학생들이 들어왔을 때 과연 우리가 그 아이들에게 세계 최고 수준의 공학교육을 했느냐』고 묻는다.
 
  최근 정부에서 「理工系 학생들에게 장학금을 지원하겠다」, 「병역 혜택을 주겠다」고 나섰다. 나는 이런 대중적 구호를 보면 옛날 전봇대에 붙어있던 술집 여종업원 호객 구호가 생각난다.
 
  「침식 제공, 선불 가」
 
  정상적인 사람이라면 이런 구호를 보면 『아, 저곳은 절대로 가서는 안 되는구나』 하고 판단을 내릴 것이다.
 
  「국민을 먹여 살리는 건 산업기술이고, 그것을 이끌어 가는 것이 理工系 교육」이라는 사실에 대한 근원적인 인식의 전환이 없이 몇 개의 사탕을 나눠 주는 것으로 理工系 교육을 살려낼 방도는 없다.
 
  내 실험실의 졸업생들 중 11명이 국제학회에서 최우수 논문상을 받았다. 세계에서 유례가 없는 일이다. 그럼에도 졸업생들은 물론 교수인 나 역시 자부심보다는 미래에 대한 불안한 마음과 국가에 대한 서운한 마음이 먼저 드는 것, 이것이 우리 理工系의 현주소다.
 
 
  이공계 기피의 역사적 뿌리
 
  우리 사회는 기술을 賤視(천시)하던 조선조의 문화로 회귀하고 있다.
 
  기술을 중시하고 理工系가 우대를 받았던 1960년대 이후의 시기는 기술을 냉대한 긴 역사에서 잠시 반짝한 예외적인 시기였다. 역사 속에서 내 선배 과학자 기술자들은 모두 처절한 최후를 맞았다.
 
  신라 無影塔(무영탑: 경주 불국사의 석가탑)의 전설은 아주 로맨틱하다.
 
  탑 만들기에 동원된 石工(석공)은 오랫동안 아내와 떨어져 살아야 했다. 아내는 남편이 너무나 그리운 나머지 스스로 물에 빠져 죽고 만다. 이 이야기가 전하는 메시지는 간단하다.
 
  「탑 만드는 데 동원되면 죽도록 고생만 하고, 가정이 파탄난다」
 
  佛事(불사)에 동원된 석공들에게 오두막 하나씩 지어 주고 거기서 아내가 밥을 지어 주게 했을 법한데도 위정자들은 전혀 신경을 쓰지 않았다. 무영탑의 전설이 주는 교훈은 「石工에게 시집가면 죽는다」였을지 모른다.
 
  에밀레종 설화도 마찬가지다.
 
  共鳴(공명) 설계는 컴퓨터 기술로도 파악하기가 어렵다. 신라 시대에 종을 만들려면 보통 고생이 아니었을 것이다. 시행착오를 거듭하는 과정에서 얼마나 독촉과 질책을 받았으면 끓는 쇳물에 제 아이를 넣어 볼 생각을 했을까?
 
  아브라함은 아들 이삭을 제물로 바치는 흉내만 냈는데도 하나님으로부터 『대대손손 축복을 내리겠다』는 약속을 얻었다. 아들을 제물로 바쳐 맑고 그윽한 소리를 만들어낸 신라의 종 만드는 기술자가 그 후 행복하게 잘 살았다는 얘기는 전해지지 않는다.
 
  이 설화 역시 「주조 기술자가 되려면 자식을 제물로 바칠 각오를 해야 한다」는 메시지를 새벽 안개처럼 은은하게 사방에 퍼지게 했을 것이다.
 
  조선시대 기술직에 있던 사람들은 모두 천민 계층이었다.
 
  장영실을 보자. 관노 출신 천민인 장영실은 당시 지극히 예외적으로 從 6품까지 벼슬이 올랐다. 세종이 신임을 하니 문반들의 시기 질투가 대단했다. 문반들은 「천민이 從 6품까지 올라가는 것을 좌시하면 안 된다」는 공감대 아래 세종에게 온갖 간언을 했으나 세종이 듣지 않았다.
 
  그러다 장영실이 관리 책임을 맡고 있는 공주의 가마 손잡이가 부러져 공주의 가마가 구르고 말았다. 왕족의 신체에 상처를 입히면 모반죄에 해당하는 것이어서, 세종도 감싸줄 수가 없었다. 아마도 누군가가 가마 손잡이에 미리 톱질을 해 놓았을 것이라는 소문이 당시 돌았다고 한다. 중요한 것은 그 후 아무도 장영실이 어떻게 됐는지를 모른다는 것이다. 이 일화는 「과학 기술자로 출세하면 죽는다」는 메시지를 남긴다.
 
 
  官尊民卑
 
  국내의 몇 개 안 되는 과학관에 가서 보면 서양 과학자들은 출생연도와 사망연도가 전부 기록돼 있는데 우리나라 과학 기술자들은 하나같이 출생연도만 밝혀져 있을 뿐 사망연도는 물음표로 처리돼 있다. 과학 기술자들의 말로가 안 좋았다는 증거다.
 
  나는 1990년대에 「손빨래 세탁기」, 「골고루 전자레인지」, 「따로따로 냉장고」 등을 개발해서 「올해의 히트상품」으로 선정된 제품 6개를 만들었다. 이 덕에 1996년에 문화관광부에서 주는 세종문화상(기술부문)을 받았다.
 
  시상식 전날 예행연습이 있다고 해서 불려갔다. 단상에 올라가는 걸음걸이가 씩씩하지 못하다는 이유로 몇 번을 단상에 오르락내리락했다. 연습하러 나온 女高 합창대원들 앞에서 서울工大 교수의 자존심은 말이 아니었다.
 
  이튿날 시상식장에서의 상황 역시 마찬가지였다. 당시 시상을 맡은 李壽成(이수성) 국무총리는 나와 함께 서울대학 교수로 일했던 분이다. 그의 연설이 이어지는 10여 분 내내 나는 객석을 등진 채 그를 바라보고 서 있어야 했다. 시상식의 주인은 상을 받는 사람이 아니었다.
 
  기념 사진을 찍으려고 맨 앞에 앉아 사진기를 들고 있던 아내는 나의 뒤통수만 실컷 바라보고 있어야 했다. 상품 개발로 산업발전에 기여한 공로로 상을 받는 나는 수상 소감 한 마디 못해 보고 단상을 내려와야 했다.
 
  조선 시대 장영실의 얘기가 아니라, 1996년 서울工大 교수가 겪은 일이다. 「이러니 다들 관료가 되려고 하지 누가 과학기술자가 되려고 하겠나」 하며 씁쓸했던 기억이 난다.
 
 
  十面楚歌
 
  나는 1986년부터 우리의 경제가 위기에 처했다고 떠들고 다녔다.
 
  1992년 「W 이론을 만들자」에서 우리 경제가 十面楚歌(십면초가)에 둘러싸여 있다고 주장했다. 당시 우리의 산업구조는 선진국에서 도입한 낙후기술과 설비에 低임금을 결합한 허약 체질이었다.
 
  주문자 상표를 부착한 얼굴 없는 수출로 우리 상품은 저급품으로 분류돼서 외국의 低소득층에 팔려 나갔다. 유통망과 애프터 서비스 시스템이 없어 단골을 확보하지 못했다. 이런 악순환이 이어져 실속 없는 산업팽창이 이뤄졌다.
 
  1975년을 기점으로 우리 산업의 틀을 바꿔야 했다.
 
  1975년까지만 해도 「低임금 양산조립」은 한국에게 보장된 독무대였다. 그렇지만 기술도입과 단순 모방만으로는 한계에 직면했고, 값싼 임금과 풍부한 노동력을 앞세운 중국이라는 넘을 수 없는 산이 눈앞에 있었다.
 
  1975년의 기술도입료가 전년도에 비해 갑자기 4배나 늘어났다. 이때부터 독자적인 기술개발에 중점을 두었어야 했는데 우린 그걸 하지 못했다. 기술 도입료와 로열티가 계속 올라가자 기업들은 현장 작업자들만 다그쳤다.
 
  지금도 관료와 기업인들은 『高임금 低효율이 해소되어야 경제위기가 해소된다』며 허리띠를 졸라매라고 한다. 허리띠만 졸라매면 위기가 해소된다는 말인가? 이웃집에서 카시미론 솜 이불을 팔아대는데 낡은 솜틀 기계의 생산성을 높인다고 경쟁에서 이길 수는 없다.
 
  이것은 1975년식 사고방식이다.
 
  제조업은 기술정보, 상품기획, 연구개발, 설계, 설비계획, 부품조달, 생산, 판매기획, 판매, 사후관리 등 대략 10단계의 과정으로 이뤄진다. 우리의 제조업은 상품기획과 연구개발 설계는 해외기술의 도입으로 대체했고, 판매 및 事後관리 단계는 외국 바이어들에게 기대 왔다. 우리 손으로 직접 담당하였던 것은 생산부분뿐이다.
 
  우리 제조업이 살아남을 수 있는 응급 처방은 무엇일까.
 
  우선 선진 제품의 모방에 심취했던 逆개발을 당장 중단해야 한다. 독자적으로 상품을 기획하고, 창의적인 연구개발의 주도권을 확보하려고 목숨을 걸어야 한다. 우리 기업들은 본격적으로 상품 기획을 해 본적이 없다.
 
  선진기업에서 만든 제품을 도입하고 모방설계를 했으며, 세계시장에서 소비자 구매욕이 입증된 상품만 골라 뒤늦게 기획에 착수하였다.
 
  나는 1989년 산학협동을 통해 「하이 터치」 프로그램을 수행했다. 아직까지 본 적이 없는 상품을 개발하자는 게 목표였다.
 
  1989년에 만든 입체형 컴퓨터 키보드는 손목의 피로를 덜어 주는 제품이었다. 1993년에 출시되어 1조원 이상 팔린 맥킨토시 키보드보다 4년 앞선 기획 상품이었다. 한국의 대기업은 「이제까지 이런 제품을 본 기억이 없다」는 이유로 대량생산을 망설였다.
 
  『그렇게 좋은 키보드라면 왜 IBM에서 아직까지 개발을 하지 않았겠는가』가 업체의 공통된 반응이었다. 우리 기업은 남의 것을 모방만 해왔기 때문에 남이 안 하는 것을 만들면 큰일이 나는 줄 안다.
 
  비슷한 시기에 나는 리모콘으로 조정하는 자동 진공청소기를 개발했다. 최근 필립스가 제작해 국내에서 한 대에 200만원 이상으로 팔리는 자동 진공청소기와 똑같은 모양과 기능의 제품이다. 차이가 있다면 필립스는 진공청소기에 자동 감지장치를 장착했다는 것뿐이다.
 
  자동 진공청소기의 기획 아이디어를 냈지만, 어느 전자제품 업체도 받아들이지 않았다.
 
  나는 산학협동을 추진하면서 한국 기업인들 머리 속에 뿌리깊게 박혀 있는 「三不可(삼불가) 이론」을 발견했다.
 
 
  경영혁신은 죽지 않으려고 하는 일
 
  신제품 개발을 위한 상품기획 과정에서 새로운 아이디어가 나올 때마다 기업의 관리자들이 세 가지 이유를 들어 개발을 기피한다.
 
  첫째, 새로운 아이디어를 받아들이면 가격 상승 요인이 발생한다는 이유다. 새로운 기능을 첨가하면 제품 원가가 올라가고 판매가도 높아지기 때문에 가격경쟁력이 떨어진다는 얘기다.
 
  두 번째는 量産(양산)에 지장을 초래한다는 이유가 나온다.
 
  나는 직육면체로 만든 제품의 모서리를 소비자들의 취향에 맞게 곡선으로 처리하자고 제안한 적이 있다. 기업 쪽에서 벌떼같이 들고 일어났다. 곡면으로 바꾸면 생산성이 저하된다는 것이다.
 
  세 번째는 신뢰성을 보장할 수가 없다는 논리다. 새로운 기능이 첨가되면 부품이 늘어나고 고장률이 높아진다는 말이다. 새로운 아이디어를 낼 때마다 기업 측에서는 「三不可 이론」으로 신제품 개발에 반대했다.
 
  어떤 기업이 일류기업인가?
 
  일류기업은 누구보다 먼저 새로운 산업분야를 개척하고 최고 혹은 최초의 기술과 상품을 만들어 내야 한다. 둘째, 이 기업을 모방한 다른 기업들이 덩달아 돈을 벌어야 한다. 즉 보고 따라 하는 二流기업들이 있어야 한다는 얘기다.
 
  그렇다면 초일류기업이란 무엇인가?
 
  국적과 사업 분야를 막론하고 全세계의 일류기업들이 초일류 기업의 기술과 상품 경영철학을 본받아서 큰 이익을 내야 한다. 초일류로 분류될 수 있는 기업은 全세계에 몇 개 밖에 없다. 이런 기준대로라면 한국에는 불행하게도 초일류 기업이 없다.
 
  삼성은 일류기업이지 초일류기업이 아니다.
 
  삼성이 「新경영」을 추진할 때 삼성 임원들의 방마다 「잭 웰치」의 책이 꽂혀 있었다.
 
  나는 삼성 임원들에게 『삼성은 아무리 몸부림을 쳐도 잭 웰치를 쫓아갈 수 없다』고 얘기했다.
 
  삼성 사람들이 『왜 안 되냐』고 묻기에 나는 이렇게 설명했다.
 
  『잭 웰치는 현재 1등이거나 가까운 장래에 1등이 될 수 있는 2등을 빼놓고는 다 잘라냈다. 삼성이 그렇게 할 수 있나? 삼성그룹이 공중 분해되어도 좋은가? 잭 웰치가 한 번에 10만 명을 감원했다. 한국적 정서를 이겨내고 수만 명을 감원시킬 자신이 있나? 잭 웰치는 아침부터 저녁까지 나와서 직접 서류 나르고 재떨이 던지며 경영혁신에 달라붙었다. 당신 회사의 회장이 그렇게 할 수 있나?』
 
  삼성 관계자들은 『新경영을 하려는 총수의 강력한 의지를 확인할 수 있었다. 분위기가 사뭇 달라졌다』고 항변했다. 나는 『경영 혁신은 총수의 의지를 확인하려고 하는 것도 아니고, 회사의 분위기를 바꾸려고 하는 것도 아니다. 안 하면 죽기 때문에 하는 것이 경영혁신』이라고 했다.
 
  그러면 삼성 관계자들은 대개 이런 질문을 던졌다.
 
  『죽기 살기로 경영혁신을 안 하는데 왜 삼성은 안 죽습니까?』
 
  내 대답은 이렇다.
 
  『지금 사방에 암 걸려서 링거 꼽고 누워있는 환자들이 수두룩한데 폐병 걸린 환자를 죽일 수는 없지 않나?』
 
  한국에서 경영혁신을 하겠다는 기업들은 대개 「전담추진반」을 둔다.
 
  전담추진반은 보통 상무급이 팀장이 된다. 이 사람들이 어떻게 상급자인 사장들의 목을 자르겠는가?
 
 
  IMF 경영혁신의 최대 피해자는 연구인력
 
  IMF 이후 제일 먼저 잘려나간 것이 「전담추진반」에 연줄을 확보하지 못한 연구소의 연구인력들이었다.
 
  총수가 직접 나서서 「우리 기업이 죽지 않으려면 어떻게 해야 하는가」를 밤새워 고심했다면 연구인력은 제일 마지막 감원대상이 되었을 것이다. 패러다임 전환의 대상이 되어야 할 사람들이 패러다임 전환을 주도했다.
 
  이게 대한민국 기업의 비극이고, 나라의 비극이다.
 
  한국은 기업의 회장이 구설수를 외면하기 때문에 직접 나서서 구조조정을 하지 않는다. 그러나 잭 웰치는 「전담추진반」을 두면 안 된다는 걸 알기 때문에 자신이 직접 감원대상을 고르고, 자르고, 불필요한 부서와 인력을 잘라 냈다.
 
  1997년 초 한 경영자 모임에서 내게 강연을 요청했다.
 
  당시 「가격 경쟁력만이 살길이다」는 구호가 위력을 떨치던 시절이었다. 나는 강연을 하면서 『아직도 가격 경쟁력을 강조하는 정부 관료와 기업 경영자는 머리에 총상을 입은 사람들』이라고 직설적으로 얘기했다.
 
  기업활동에서 가능한 한 끝까지 피해야 할 것이 바로 경쟁사와 가격경쟁을 벌이는 것이다. 가격경쟁이란 최후의 승자 하나만이 남을 때까지 출혈을 하면서 계속해야 하는 죽음의 경기이기 때문이다. 그런데 모두가 나서서 「죽음의 경기만이 우리가 살길」이라고 아직도 외치고 있다.
 
  우리의 제품들은 제조원가가 높은 반면에 판매가가 낮아서 가격 경쟁력을 따질 시기를 지난 지 오래다. 우리 제조업은 미국, 일본, 싱가포르, 대만에 비해 높은 금융 비용과 부동산 가격, 물류 비용, 로열티, 실질 임금 등이 높아 「5高」에 시달리고 있다.
 
  우리 기업들은 울타리를 친 내수시장에서 국내 가격을 높게 받아 연명해 왔다. 마치 친척들에게는 비싼 값을 받고 일반인에게는 싼 값에 물건을 팔아 이윤을 남긴 것과 같다.
 
  운동경기에서 우리 팀이 계속 실점을 하면 관중들은 『작전을 바꾸어야 한다』고 충고한다. 우리의 과거 작전은 가격 경쟁력이었으나, 가격 경쟁력 작전으로 가서는 중국은 물론 대만, 홍콩, 싱가포르와 상대가 될 수 없다.
 
  우리가 살길은 가격을 높여서 받을 수 있는 「가격 결정권」을 확보하는 길뿐이다. 제품가격을 높이고도 물건을 파는 방법은 독특한 제품, 경쟁상대가 없는 高附加(High Touch) 제품을 만드는 수밖에 없다.
 
  세계 초일류기업이 되겠다고 몸부림을 쳐야 한다.
 
  중국에는 풍부하고 저렴한 노동력은 물론 화상 네트워킹과 마케팅 능력이 있고, 일본에는 기술력이 있는데 우리가 무슨 근거로 가격 결정권을 가질 수 있을까?
 
  해답은 창의력에 있다.
 
  우리에게 창의력이 있다고 주장하는 데 두 가지 근거가 있다.
 
  첫 번째는 우리 민족이 지금까지 모든 걸 해봤는데 아직까지 안 해 본 것이 바로 창의력이다. 혹시 창의력이 있을지 모른다. 두 번째는 나 스스로 경험을 통해 우리가 창의력이 많다는 결론에 도달했다.
 
  창의력을 가지고 소규모 실험을 해서 세계시장에 성공여부를 타진한 다음 군단 병력에게 파는 식으로 가야 한다. 우리의 3大 효자 상품인 휴대폰, LCD, 자동차 산업은 5년 안에 중국의 추격을 받아 자멸할 운명이다.
 
 
  「가격 결정권」만이 살길이다
 
  글로벌 마켓에 진출하는 것이 문제가 아니라, 글로벌 마켓을 독점 내지 선점해야만 살아남을 수 있다. 가격 결정권만 가지면 우리는 동양의 맹주가 될 수 있다.
 
  우리 기업이 가격결정권을 가지려면 패러다임을 전환해야 한다.
 
  내가 내놓은 아래의 물음들에 독자들이 응답을 해주었으면 한다.
 
  「정부가 5년 이내에 理工系 기피문제에 대한 바람직한 대책을 내놓을 확률이 몇 퍼센트라고 생각하는가?」
 
  「기업이 5년 이내에 정부지원 없이 국제경쟁력 강화를 위한 방안을 추진할 확률은 몇 퍼센트라고 보는가?」
 
  「대학이 5년 이내에 스스로 교육개혁을 추진할 확률은 몇 퍼센트일까?」
 
  「학부모들이 내 자식만은 편안한 직업을 가져야 한다는 생각을 바꾸고, 자녀에게 理工系 대학 진학을 권유할 확률은 몇 퍼센트라고 생각하는가?」
 
  어떤 항목이든 『10% 이상』이라고 대답한 사람은 응급실로 가야 한다. 온전한 정신이 아니기 때문이다. 패러다임의 전환에는 자기혁신이 필요하다. 패러다임을 바꾸지 않으면 모든 노력은 무위로 돌아갈 것이다.
 
  우리 산업은 도시가스에 밀려 설 자리를 뺏긴 구공탄 공장에 비유될 수 있다.
 
  생산성을 향상해 하루에 구공탄을 10%씩 더 찍으면 구공탄 공장은 살아날 수 있을까? 구공탄 공장의 「高임금·低효율」이 해소되면 구공탄 공장은 살아남을 수 있을까? 대답은 둘 다 『아니오』이다.
 
  도시가스가 도입되는 초기에 『도시가스로 업종을 전환하라』고 했다면 연탄공장 사장은 이렇게 대답했을 것이다.
 
  『패러다임의 변화, 웃기지 마라. 온돌방이 존재하는 한, 겨울철이 존재하는 한 구공탄은 영원하다』
 
  연탄공장은 그렇게 戰意(전의)를 불 태우다가 흔적도 없이 사라졌다.
 
  얼음가게와 냉장고, 우마차와 용달차, LP와 CD 모두 똑같은 원리다. LP 5000장을 모은 음악 애호가에게 CD로 바꾸라고 한다면 쉽게 바꿀 수 있겠는가? 오스트리아에 여행 갔을 때 밥 굶으면서 산 오페라 판, 유학할 때 아내에게 잔소리 들어가며 산 클래식 전집, 눈물이 앞을 가릴 것이다.
 
  그래서 음악 애호가도 이렇게 외친다.
 
  『클래식이 존재하는 한, 아니 오페라가 존재하는 한 LP는 영원하다』
 
  그러나 지금은 축음기 생산이 중단되어 더 이상 LP를 들을 수 없게 되지 않았는가.
 
  과거의 산업구조가 일직선인 走路(주로)를 눈감고 뛰기만 하면 되는 마차 경주였다면, 지금의 산업구조는 폴로 게임이다. 말의 눈을 절대 가리면 안 되고 走路도 일직선이 아니고 그라운드다. 어디로 갈지 모르며 빨리 달리는 게 능사가 아니라 빨리 설 줄 알아야 하고 세 박자 쉬었다가 달릴 수도 있고, 세 걸음 뛰다가 정지도 해야 하는 복잡한 게임이다.
 
  그런데 우리나라는 마차 경주 챔피언들이 폴로 복장을 하고 나와서 설치고 있는 형국이다.
 
  요즈음 우리의 국가 목표는 국민소득 2만 달러 달성이다.
 
  GNP로 국가의 비전을 내세우는 나라는 찾아보기 어렵다. 우리의 의식은 거의 필리핀 수준이다.
 
  우리에게는 「이웃을 돕겠다」, 「인류에 혹은 국제사회에 기여하겠다」는 정신이 희박하다. 패러다임의 전환을 시도하기 조차 힘들다. 원래 패러다임의 전환은 극히 일부가 시도하는 것이고 시도한 사람 중에 극히 일부가 성공한다. 그러나 패러다임 전환이 이뤄지지 않으면 우리 모두가 죽는다.
 
 
  理工系 기피의 최종 피해자는 국민
 
  조선조의 한 왕이 정승들에게 『광풍이 몰아치는 벌판에서 초가삼간을 유지하는 방법이 무엇이냐』고 물었다. 영의정은 이렇게 대답했다.
 
  『사방의 문을 활짝 열어 놓고, 광풍이 쇠잔해지기를 기다리면 됩니다』
 
  이 얘기는 우리나라 지도계층의 철학을 잘 보여 준다.
 
  사방의 문을 열어 놓으면 초가집은 무너지지 않겠지만, 방 안에 있던 民草(민초)들은 다 어떻게 될 것인가? 모두 바람에 날려가서 죽지 않았을까? 우리는 그런 방식으로 끈질기게 버텨왔다. 7년 전쟁에서 절반에 가까운 민초들이 사라진 임진왜란이 대표적인 예가 아닐까?
 
  理工系의 위기는 역사적 뿌리가 깊다.
 
  理工系의 위기에는 기업과 대학, 사회 전체가 복잡하게 얽혀 있다. 잭 웰치의 얘기에서 거론했듯이, 理工系의 위기는 해결하지 않으면 우리가 죽는다는 각오로 달라붙어야 할 문제다. 정책 구호나 유인책 몇 가지로 해결될 수 없는 문제다. 理工系 기피현상은 대학이나 理工系 대학생들의 문제가 아니다. 국가와 기업, 우리 사회 전체가 理工系 기피현상의 최종 피해자가 될 것이기 때문이다.
 
  결론은 간단하다. 살고 싶으면 해결해야 하고, 죽고 싶으면 지금까지 그랬듯이 그냥 놔두면 된다.●

 

Posted by 장안동베짱e :
출처 : DELPAI.COM ( http://delpai.com/tt/index.php?pl=390&ct1=-1 )
오래 사귀었음에도 불구하고 유난히 다정한 커플을 보면 인연이란 저런 거구나 하는 생각이 절로 든다.

그들은 정말 궁합이 잘 맞아서 그런 걸까. 아님 특별한 연애비법 이라도 알고 있는 걸까. 오래되고 의좋은 연인들의 연애법을 분석해 그들의 장수비결을 배워 보도록 하자.




1.싸울 일을 만들지 말 것

장수하는 커플의 첫 번째 특징은 바로 웬만해선 안 싸운다는 거다. 그들이 특별히 성격이 잘 맞아서? 도무지 싸울 일이라곤 없어서? 아니다.

똑 맞아떨어지는 친구 사이도 자주 만나다 보면 다툴 일이 많아지는 법. 잘 지내는 커플은 일단 싸울 일 자체를 안 만든다는 점이 일반 연인과 다른 점이다.

좀 사귀다 보면 누구나 내 애인이 싫어할 만한 행동이나 말투 습관 등이 있기 마련이다. 문제는 뻔히 다 알면서도 실수를 반복한다는 거다. 애인이 죽으라고 싫어하는데도 절대 굴하지 않고 고집을 피우다 보면 천하의 잉꼬커플도 싸우기 마련. 사소한 다툼이 쌓이다보면 나도 모르는 사이 이별이 다가오게 된다.




2.나를 더 사랑할 것

오래된 커플이 겪게 되는 위기 중 하나가 권태감이다. 특별한 이유도 없이 연애가 시들해지고 애인에게 별 감흥을 못 느끼게 되는 것 말이다.

연애 초반에 에너지를 너무 쏟는다거나 특별한 환상을 가지고 이성을 사귀게 됐을 경우 이런 무료함은 더 빨리 찾아온다.

특히 일방적으로 사랑을 퍼주기만 했다거나 반대로 넘치는 사랑을 받기만 했을 경우 연애성장률은 급속도로 하강한다. 가진 거 다 주고 보일 거 다 보였을 때의 허탈함과 비슷한 거다. 자,내가 있어야 애인도 있고 사랑도 하는 것이라는 것을 꼭 명심하자.

애인에게 관심과 사랑을 퍼붓기 전에 먼저 스스로를 가꾸고 조금 만 더 자신을 사랑할 것. 매력 넘치는 애인을 떠날 사람 누구랴.





3.적당한 거리를 둘 것

바늘과 실처럼 꼭 붙어 다녀야 애정이 다져지는 건 절대 아니다. 오히려 적당한 사랑 의 거리는 감정을 더 애끓게 만들기도 한다 이 말씀. 연애만 하면 친구고 일이고 다 팽개치고 애인 꽁무니만 쫓아다니는 사람을 보라. 쉽게 타오른 만큼 불도 금세 꺼지지 않던가. 연애는 물론 각자의 생활에도 충실하고 서로를 발전 시키도록 노력하는 지혜를 갖자.
또 절절한 연애감정이 죽을 때까지 지속될 거라 기대도 꿈도 꾸지 마시라.

연애시기별로 다 그에 맞는 자연스러운 감정의 변화가 오는 법. 경솔하게 사랑이 식었니 어쩌니 하면서 호들갑 떨지 말고 더 깊고 넓은 감정으로 상대를 바라보도록 하자.




누누이 말하지만 사랑에 전문가는 없다. 특별한 경우를 제외하고는 딱히 못되거나 모자란 사람은 없는 법.

다 자기가 요리하기 나름인 거고 딱 자신의 역량만큼 보고 담을 수 있는 것이리라.
조금만 사귀다 보면 싫증 느끼고 변덕부리는 사람들은 상대 방을 탓하지 말고 자신의 태도를 먼저 반성하도록 하자. 도대체 나는 누군가를 만날 마음의 준비가 되어 있는지 단지 외로워서 이성을 찾아 헤매는 건 아닌지 말이다.

정말 진실한 사랑을 하고 싶다면 사람을 찾기 전에 스스로를 가다듬는 일이 먼저다.
끼리끼리 어울리는 법이니까
Posted by 장안동베짱e :
박신양-김정은 <파리의 연인>



비-송혜교 <풀하우스>



조현재-김태희 <구미호 외전>



전진-김태희 <구미호 외전>



이서진-이은주 <불새>



에릭-이은주 <불새>



이정진-수애 <4월의 키스>



이정진-이보영 <백수탈출>



권상우-최지우 <천국의 계단>



권상우-한가인 <말죽거리 잔혹사>



이정진-한가인 <말죽거리 잔혹사>



송승헌-정다빈 <그 놈은 멋있었다>



송승헌-손예진 <여름향기>






이완-김정화 <백설공주>






조한선-김정화 <논스톱3>



조한선-이청아 <늑대의 유혹>



한예슬-봉태규 <논스톱4>



장근석-오승은 <논스톱4>





김재원-장나라 <내 사랑 팥쥐>



연정훈-장나라 <사랑을 할거야>



연정훈-한가인 <노란손수건>



김호진-추상미 <노란손수건>



신현준-추상미 <퇴마록>



신현준-김희선 <비천무>



고수-김희선 <요조숙녀>




박정철-김민희 <순수의 시대>



구본승-소유진 <쿨>



박광현-소유진 <내 인생의 콩깍지>



정민-소유진 <내 인생의 콩깍지>



김재원-소유진 <라이벌>



김재원-김하늘 <로망스>



김재원-한채영 <북경내사랑>



김석훈-한채영 <情>



김석훈-송윤아 <폭풍속으로>



김민준-엄지원 <폭풍속으로>



김민준-이미희 <디카CF>



이정재-이미숙 <정사>



박신양-염정아 <범죄의 재구성>









조인성-전도연 <별을 쏘다>



조인성-손예진 <클래식>



조인성-신민아 <마들렌>



장혁-신민아 <화산고>



주진모-신민아 <때려>




김민종-한지혜 <섬마을 선생님>



송일국-한고은 <보디가드>



지진희-김현주 <10억만들기>



권상우-명세빈 <태양속으로>



류수영-최강희 <맹가네전성시대>



최수종-채림 <저 푸른 초원위에>



최수종-김유미 <태양인 이제마>



김태우-한고은 <그여자 사람잡네>



박용하-유진 <러빙유>



조민기-오연수 <거침없는 사랑>



서태화-송선미 <거침없는 사랑>



이지훈-정선경 <귀여운 여인>





안재욱-황신혜 <천생연분>



안재욱-오승현 <천생연분>






김성택-장서희 <인어아가씨>



김남진-장서희 <회전목마>



김남진-배두나 <봄날의 곰을 좋아하세요>



김남진-성유리 <천년지애>



정준호-김효진 <천년호>



탁재훈-김효진 <누구나 비밀은 있다>



배용준-송윤아 <호텔리어>



배용준-최지우 <겨울연가>



이병헌-최지우 <누구나 비밀은 있다>



이병헌-최지우 <아름다운 날들>



이병헌-송혜교 <올인>



지성-박솔미 <올인>



지성-박선영 <화려한 시절>



오지호-신애 <은장도>



류승범-공효진 <잡지 화보>



류승범-이미숙 <고독>



류승범-임은경 <품행제로>
(봄날) 조인성ㅡ고현정

Posted by 장안동베짱e :
“물리치료학과인데 보는 어르신마다 무조건 어깨를 주무르라고 하십니다. 어르신들! ‘물리치료학과’는 어깨 주무르기 배우는 과가 아니거든요 (훌쩍).”

물리치료학과에 다니는 한 대학생의 푸념이다. “단지 물리치료학과에 다니는 이유만으로 만나는 사람들마다 나에게 안마를 부탁한다”며 그는 연신 “물리치료학과는 결코 마사지나 안마 과가 아님”을 강조한다.

최근 웹상에서는 ‘학과별 애로사항’이라는 제목의 글이 화제가 되고 있다. 각 학과별로 학생들이 학과의 명칭 때문에 겪는 어려움 또는 웃지 못할 에피소드를 모아 놓은 것이다. ‘그 학과 학생이라서 어떠한 오해를 받고 있는 지’를 실제 경험담도 모아 놓은 이 글은 게시판에 올라올 때 마다 수많은 네티즌들의 댓글이 잇따른다.

다음카페 ‘연이말(http://cafe.daum.net/nowwetalk)’에서는 이 글이 올라오자 많은 댓글이 달리며 “게시물에 공감한다”는 글이 쏟아지기도 했다.

‘학과별 애로사항’은 지난 2004년 7월, ‘그림자’님이 유머사이트 심심이(http://www.simsimi.com)에 ‘저는 러시아과입니다’라는 게시물을 올린 것이 발단이 됐다.
‘그림자’님은 전공이 각각 러시아어, 토목, 어류양식학, 컴퓨터공학인 네티즌의 '애로사항'을 올렸는데 이 게시물에 수많은 네티즌들이 공감한다면서 ‘우리 과는 이런 애로 사항이 있다’는 댓글들이 줄을 이었다.

예를 들어 동양학과에 다니는 한 여대생은 “사람들이 동양학과는 국악 틀어 놓고 그림 그리는 줄 알았다고 합니다. 가끔 한복 입고 그리냐고 묻는 사람도 있어요. 또 연말이면 연하장에 ‘난’ 그려 달라고 졸라대서 아주 귀찮습니다”라며 전공이 ‘동양학과’여서 겪게되는 초난감한 점들을 털어왔다.

다음은 사이트 심심이에 ‘그림자’님이 올린 글 ‘저는 러시아과입니다’ 전문.

▽저는 러시아과 입니다
저는 러시아어 과입니다. 저보고 예쁘고 섹시한
러시아 무용수를 소개 시켜 달랍니다. -_-;

게다가 요사인 어디서 구했는지
징그러운 러시아포르노를 가지고 와서는
해석해 달랍니다.
무슨 해석이 필요하다고…. -_-;;;;;;;

뭡니까~ 이게 러시아 포르노 나빠~요!

▽전 그냥 토목과입니다만
뭐 다들 부럽군요. 다들 뭔가 특기가 있어 보이지 않습니까??
전 토목과입니다만.
왜 맨날....
"우와 그럼 술 잘 마시겠네요?"
토목과가 술 마시는 과입니까...
아~! 억울. ㅜ_ㅜ

▽어류양식학 전공입니다.
보통 줄여서 양식과 양식과 부르죠.
제 동기중에 한명은 신검 받을때 자기 전공적는 란에다가 양식과 적었다가
지금 취사병으로 군복무 하고 있습니다.-_-;
특히나 간부식당 취사병으로 빠지는 비율이 그렇게 높다네요.

전 참고로 부대 금붕어 관리병도 잠깐 했었다는~

▽컴공의 비애..ㅠ.ㅠ
컴퓨터 공학과의 비애
- 컴퓨터에 관한한 만능이어야 된다.
- 모든 컴퓨터부품 시세를 꿰뚫고 있어야 한다.
- 컴퓨터 에러에 관한한 해박한 지식을 갖추어야 한다.

컴퓨터 공학과는 모든 통신사의 통신라인을 깔아줄 수 있어야 되고 설정 방법 또한 능통
해야 된다. 특히 허브나 라우터를 통한 인터넷공유기술은 반드시 익혀야 한다 -_-..

친구 : 우리집 인터넷 갑자기 안 되는데 왜 그래?
나 : 그... 글세..?..?
친구 : 컴퓨터 공학과가 그것도 몰라?
나 : -_-....

친구 : 그럼 우리 집에 와서 좀 고쳐줘
나 : -_-.......

컴공 욕보이지 않게 하려면 가서 고쳐줘야 된다..
그런데 가서 본다고 뭐 뾰족한 방법이 있나.
그냥 어쩌다 될 수도 있고 안 될 수도 있는 거다.

(집에 가서 랜카드랑 랜선을 만지작 거리던 중 -_-;;)
친구 : 어? 이제 되네. 와 고마워. 근데 이왕 온 김에 인터넷 공유 좀 시켜줘
나 : 어..?... -_-;;

친구 : 저 방에 있는 컴터는 인터넷 안되잖아.. 어디서 보니까 뭐 달면 그냥 다같이 인터넷
도 쓰고 그러던데 나도 그거 해줘.
나 : 그거... 회사에다가 다중연결신청해.
친구 : 돈 더 내야 되잖아! 그냥 좀 해줘! 컴퓨터공학과가 그것도 못 해주냐! "
나 : -_-.........(난감하다)

- 모든 컴퓨터부품 시세를 꿰뚫고 있어야 한다.
친구 : 야! 나 RW 하나 살려고 하는데 그거 얼마냐? "
나 : 글세 -_-?.. 왜 나한테 묻지..?
친구 : 야! 컴퓨터공학과가 그런것도 모르냐!! "
나 : -_-;;;

또다른 친구는...
친구 : 나 컴퓨터 살려고 하는데 얼마 있어야 돼?
나 : 음 한 100~150만원 정도 있음 되지 않을까?
친구 : 니가 최대한 싸게 살수 있게 좀 해줘
나 : 최대한 어떻게 싸게 -_-;;;?.


- 컴퓨터 에러에 관한한 해박한 지식을 갖추어야 한다.
친구 : 야 프로그램 실행시키니까 에러래. 에러 안 나게 좀 해봐라.
나 : -_-... 무 무슨 프로그램인데.. -_-...

친구 : 어 게임인데 자꾸 에러나 고쳐줘.. "
나 : 내가 무슨수로 -_-....
친구 : 컴퓨터 공학과가.!!..................... (중략)

▷출처 :http://www.simsimi.com/nori/board_nori_view.php?id=fun&code=25466&page=1&st=off&sc=on&key=토목과&premium=


위 게시물은 당시 큰 화제를 모으며, 각 포털 사이트 게시판으로 퍼져나갔고 댓글로 계속 ‘각 학과별 네티즌들의 애로사항’이 올라오자 게시물의 양도 조금씩 늘어나고 있다. 또, 언제부턴가는 제목도 ‘학과별 애로사항’으로 바뀌었다.

▽“원자력 공학과입니다. 다들 애 못 낳는다고 그러는데... ㅠ.ㅠ 털썩!”
▽“저는 경제학과입니다. 친구들이 주식 사달랍니다”
▽“저는 고분자 공학과입니다. 흔히들 고자라고 부르더군요. -.-;”
▽“저는 사회학과입니다. 결혼식이나 행사만 있으면 사회보라고 합니다.”
▽“신방관데 신방과면 PD 될 꺼니까 자기 딸 좀 자기아들 좀 눈도장 찍겠다고 항상 말씀하시는 이웃 아주머니들! 신방과라고 다 PD되고 방송국 가는 거 아니걸랑요? ㅠ_ㅠ (요샌 오히려 못 간다고 -_-)”
▽“아는 동생이 게임과 다니는데 아주 울분을 토합니다. 녀석이 가장 싫어하는 말이 게임과라고 하면 ‘스타 잘 하겠네요’라는 거라고 하더군요.



위의 댓글에서 보는 것 처럼 네티즌들은 이런 게시물이 올라오면 자신이 다니는 과에 관한 재미 있는 댓글을 많이 올린다. 주로 일반인의 선입견, 쓴웃음이 나오게 하는 에피소드 등이지만 태권도를 전공한다는 한 남성 네티즌은 “사체과 태권도 전공인데 맨날 여자애들이 호신술 가르쳐 달라고 하네요”라는 조금은 행복한(?) 고민을 올려놓아 눈총을 받기도 했다.

도깨비뉴스 리포터=미스터 봉구 mrbong@dkbnews.com


맨날 컴퓨터 고쳐달라는 사람들 때문에 미치겠다;
물론 나는 컴퓨터를 오래 사용 했기 때문에 요구하는 것들은 대부분 고칠수 있다.
그런데 컴퓨터 학과니깐 뭐 좀 고쳐봐라, 해봐라 이런건;;
그리고 우리가 배우는 건 주로 프로그램개발및 제작인데,
집에오면 엑셀, 파워포인트, 한글 이런거 세부기능 모른다고 무지하게 야단 맞는다;
컴퓨터 학과가 그것도 모르냐고;
가르쳐 주지 않으니 당연히 모를수 밖에;;
배운거라곤 1학년 입학했들때 전교생이 다듣는 실용전산?
그것도 대충 사용방법만 배웠지. 세부기능 까진 가르쳐 주지 않는다.
아마 대학교에서 세부기능 가르쳐 주는 과는 1%도 안되지 싶다.
왜냐하면 가르칠 필요도 배울 필요도 없기 때문이다.
배울 필요가 없다는 말은 그런게 쓸모 없는 기술이란 얘기가 아니라,
학원가서 배우면 초등학생도 배울수 있는 하급기술이기 때문이다.
(지금 술먹고 글을써서 그런지 글이 술술 써지는듯한 느낌이 드는건 왜일까..?)
아무튼 상-중급자에겐 그냥 자신이 필요할때 필요한 기능만 습득해서 쓰면 되는기술이다.

체육과 출신의 수영선수가 꼭 태권도까지 잘 할 필요가 없는것과 비슷한 예이다.
분명,
이 수영선수도 체육과 출신인지라, 자신이 필요한때(예를 들어 불가피하게 아마추어태권도 대회에 출전해야 할때) 조금만 배우면 일반인보다 금세 태권도 기술을 습득할수 있을것이라 생각한다.

세상 사람들아 제발 고정관념을 버려라.
못한다고 따지지말고!!
못하는게 아니라 할 필요가 없어서 안하는거다.
Posted by 장안동베짱e :
출처 : http://www.roadplus.com (로드플러스)
Posted by 장안동베짱e :
출처 : http://news.naver.com/news/read.php?mode=LSS2D&office_id=038&article_id=0000268966§ion_id=102§ion_id2=250&menu_id=102

이르면 2학기부터 4년제 대학 신입생 및 재학생은 학교에 설치된 학ㆍ석사 통합과정을 신청해 이수할 수 있다. 이렇게 되면 양 과정을 합친 기간보다 1년 먼저 석사학위를 딸 수 있게 된다. 교육인적자원부는 10일 “고등교육법 개정안이 지난 7일 국무회의에서 의결돼 국회에서 통과되는대로 시행할 계획”이라고 밝혔다.

개정안에 따르면 학부과정 4년, 대학원 과정 2년인 전공은 대학 입학 후 5년 내에, 학부과정이 5년인 건축은 6년, 학부과정이 6년인 의학은 7년만에 석사학위 취득이 가능토록 했다. 현행 고등교육법은 ‘학사 4년 이상, 석사 2년 이상’ 등으로 각 과정 수업연한을 따로 규정하고 있어 대학이 학사와 석사가 연계된 교육과정의 효율적인 운영이 불가능했다.

개정안은 또 학ㆍ석사 통합과정을 마치고 학칙이 정하는 요건을 충족하면 석사학위를 취득할 수 있도록 하되 중도 탈락해 학사학위 취득조건만 만족시킬 경우 학사학위만 수여토록 했다.

교육부 관계자는 “학ㆍ석사 통합과정이 운영되면 우수학생의 대학원 진학, 교육과정에 대한 학생만족도가 높아지고, 전공교육의 연속성이 확대되는 등 가시적 효과가 나타날 것”이라고 기대했다. 그러나 일각에서는 이 제도가 우수학생들의 타 대학 석사과정 진학을 막거나 이미 시행중인 의대와 일부 공과대학 등의 석ㆍ박사과정과 충돌하는 부작용을 우려하는 목소리도 적지않다.

김진각 기자 kimjg@hk.co.kr
Posted by 장안동베짱e :
출처 : http://news.naver.com/news/read.php?mode=LSS2D&office_id=001&article_id=0000905028§ion_id=102§ion_id2=250&menu_id=102

(춘천=연합뉴스) 고미혜 기자 = 석사 학위 없이 8학기 만에 바로 박사 학위를 취득하는 석.박사 통합과정 졸업생이 강원대학교에서 처음으로 탄생했다.

오는 22일 강원대 학위수여식에서 박사 학위를 받는 대학원 생화학과의 민정기(31)씨는 강원대 석.박사 통합과정의 첫 졸업생.

민씨는 2001년 이 대학 생화학부를 졸업한 후 "어차피 박사 학위까지 취득할 결심이 섰으니 시간을 조금이라도 단축하자"는 생각에 곧바로 석.박사 통합과정에 지원했다.

이번에 '혈관 신생 및 혈관 염증의 유도와 억제에 관한 조절기전'이라는 논문으로 박사 학위를 취득하게 된 민씨는 8학기 동안 외국 저널 등재 논문 6편을 발표하는 성과를 거뒀다.

특히 2003년에는 한국 생화학분자생물학회에서 우수 논문상을 수상하기도 했고 지난 달에는 지도 교수와 함께 한국과학재단 산하 생물학연구정보센터로부터 '한국을 빛내는 사람들'로 선정되기도 했다.

민씨는 "지도 교수님이셨던 권영근.김성완 교수님 덕분에 좀더 빨리 학위를 딸 수 있었던 것 같다"며 "졸업 후 일단 연세대에서 포스트닥 과정을 밟고 전공분야에서 좀더 경험을 쌓은 후 학생들을 가르치고 싶다"고 포부를 밝혔다.

국내에서는 지난 96년 포항공대가 처음으로 도입한 석.박사 통합과정은 강원대에는 지난 2000년 도입됐지만 그해 합격자가 나오지 않아 이듬해 유일하게 합격한 민씨가 이 대학 석.박사 통합과정의 첫 졸업생이 됐다.
Posted by 장안동베짱e :
출처 : http://news.naver.com/news/read.php?mode=LSS2D&office_id=038&article_id=0000268926§ion_id=101§ion_id2=261&menu_id=101

삼성그룹이 이공계 대졸 신입사원 1차 서류심사 때 전공성적이 우수한 응시자에게 가점을 주는 방안을 추진중이다.

삼성은 올 하반기 삼성전자의 연구개발 및 기술 직군을 중심으로 ‘이공계 전공 우수자 가점제’를 실시한 뒤 다른 계열사로 확대할 방침인 것으로 10일 알려졌다. 이는 지난해 말 정보통신부와 11개 대학 공대 학장, 삼성전자 등 9개 주요 기업이 이공계 대학생들의 전공역량을 강화하는 방안을 협의한 뒤 나온 것이다.

삼성 관계자는 “지난해 하반기 삼성전자 이공계 신입사원 채용 과정을 분석한 결과 전공과목 평점이 높거나 전공 이수학점이 많을수록 면접 성적도 우수했다”며 “전공성적 우수자 뿐만 아니라 전공과목 이수학점이 높은 응시생에게도 가점을 주는 방안이 검토되고 있다”고 말했다.

지난해 하반기 삼성 공채에는 5,000명 모집에 5만5,000여명이 응시해 11 대1의 경쟁률을 기록했으며, 2만여명이 1차 서류심사에서 탈락했다.


김동국 기자 dkkim@hk.co.kr
Posted by 장안동베짱e :
출처 : http://news.naver.com/news/read.php?mode=LSS2D&office_id=001&article_id=0000908465§ion_id=103§ion_id2=245&menu_id=103

(부산=연합뉴스) 민영규 기자 = 나의 신체부위중 어디가 가장 섹시해보이고 가장 섹시해보이려면 옷을 어떻게 입어야 할까?
10일 경성대 의상학과 이정민씨의 석사학위 논문 `섹시한 신체부위와 섹시디자인의 인지도에 관한 성별 비교'에 따르면 부산에 거주하는 성인 여성 303명은 남성의 가슴이 가장 섹시하게 느껴진다며 5점 만점에 3.73을 부여했다.

여성 응답자들은 이어 남성의 어깨선(3.50), 팔(3.42), 등(3.41)의 순으로 섹시함을 느낀다고 응답했다.

여성의 섹시한 신체부위에 대한 설문에 응한 부산지역 성인 남성 265명도 여성과 마찬가지로 가슴(4.34)을 으뜸으로 꼽았으며 다음으로는 허리선(3.99)과 엉덩이 옆선(3.62), 다리(3.73)순으로 높은 점수를 줬다.

남성의 옷차림에 대한 설문조사에서 여성들은 니트(3.50)를 입었을 때 가장 섹시하다고 느꼈고, 단추가 열린 셔츠(3.42)와 민소매(3.30), 찢어진 청바지(3.15) 등이 뒤를 이었으며 타이트한 상의(3.14)도 섹시한 옷차림으로 지목했다.

반면 여성의 옷차림에 대해 남성들은 미니스커트나 핫팬츠(4.06)에 가장 높은 점수를 줬고, 다음으로는 옆부분이 트인 스커트(4.05)와 속이 비치는 상의(3.77), 가슴이 드러나게 만든 웃옷이나 어깨부분이 끈으로 된 원피스(3.74)를 들었다.

섹시한 색상에 대한 설문조사에서 남성은 빨강색(3.69)과 검정색(3.52), 흰색(3.49)순으로 높은 점수를 부여했고, 여성은 검정색(3.99)과 와인색(3.70), 빨강색(3.64)순으로 섹시한 느낌을 받는다고 응답했다.

이씨는 논문에서 "섹시하다고 느끼는 신체부위와 그 부위를 강조하는 의상사이에 밀접한 관계가 있는 것으로 나타났다"면서 "남성이 여성보다 속이 비치는 옷차림이나 타이트한 복장에 섹시함을 더 많이 느끼는 경향이 있다"고 설명했다.

youngkyu@yna.co.kr (끝)
Posted by 장안동베짱e :
출처 : 不褪之昏彬、( http://blog.naver.com/intokira )




Posted by 장안동베짱e :
물론 지금 살돈 있다;

설때 돈 긁어모아서 살거라는 생각따윈 하지도 않는다;;

단지 명절이라 지금 주문하면 물품분실우려가 있지 않을까 싶어서..

(난 어른이야~ ㅡㅡ;; )



음을 더 뽀대나게 해줄 앰~프~!!


케이스가 프라스틱 사출이 아닌 나무케이스라 미니 앰프임에도 가장 좋은 사운드를 내주고 있습니다.

여러 미니앰프중 최고라 말할 수 있습니다.





빈티지 타입의 디자인으로, 노브도 빈티지 노브를 사용하였습니다.



3W POWER,GAIN & TONE CONTROL,CLEAN & OVERDRIVE SWITCH

3 1/2" SPEAKER

WOOD CABINET

H,160mm x D,95mm x W,190MM







음을 더욱 정확하게 튜닝해줄 튜너~
내가 절~대~음~감~이 아니기에ㅋ; 하나 사야겠다.
이것보다 싸고, 평 좋은거 있었는데, 품절이다ㅠ


KORG Gutar/Bass Auto Tuner GA-30

코르그의 기타, 베이스 튜너 GA-30은 튜너 GA-20의 업그레이드 버젼입니다.
디자인부터 산뜻하게 업그레이드 되었으며 기존의 GA-20의 단점이었던 건전지 교체시 뒤
커버가 잘 열리지 않았던 점을 매우 쉽게 커버가 열리도록 보완하였으며,
내장된 마이크의 감도가 매우 뛰어나 튜닝하려는 악기와 튜닝기의 거리가 멀어도 튜너가
민감하게 반응하여 쉽게 튜닝이 가능합니다.
또한 기존에 GA-20에는 없었던 피치파이프와 소형 스피커가 내장되어 튜닝하려는 음을
직접 들으면서 보다 쉽고 빠르게 튜닝을 하실 수 있습니다.
이 제품은 오토매틱 기타 베이스 튜너로 사용이 매우 간편합니다.

그럼 GA-30에 대해 자세히 알아보도록 하겠습니다.

1. Power Switch : 파워를 On/Off 할 수 있는 스위치 입니다.
2. Input : 기타와 연결되는 잭을 꼽는 단자입니다.
3. Display 액정화면 :
이 액정화면의 왼쪽 상단에는 튜닝하고 있는 줄의 번호와 음정이 표시되며, 그 바로 옆에는
반음식 내려 튜닝시에 플랫 표시를 나타내어 줍니다. 기타 튜닝시에는 액정의 오른쪽상단에
GUTAR 라고 표시되도록 GUTAR/BASS 버튼을 눌러 설정하시고 베이스 튜닝시에는 BASS 라고
표시되도록 같은 버튼을 눌로 설정하시고 튜닝하시면 됩니다.
4.GUTAR/BASS 스위치 :
기타 튜닝시에는 액정의 오른쪽상단에 GUTAR 라고 표시되도록 GUTAR/BASS 버튼을 눌러
설정하시고 베이스 튜닝시에는 BASS 라고 표시되도록 같은 버튼을 눌로 설정하시고
튜닝하시면 됩니다.
5. FLAT 스위치 :
스위치를 한번 누를때 마다 반음씩 내려 튜닝이 가능하며 2음 반까지 음을 내려 튜닝하실
수 있습니다.
6. SOUND 스위치 :
튜닝을 하려는 각 음마다 사운드를 출력하여 주며, 여기서 다시 FLAT 스위치를 누르면
반음씩 낮아지는 음까지도 사운드를 출력하여 줍니다. 이는 기존의 튜너에서는 볼 수
없었던 기능입니다.
7. MIC :
내장되어 있는 마이크로 잭을 꼽지 않아도 튜닝을 할 수 있으며 감도가 매우 좋아 악기와의
거리가 멀어도 민감하게 반음하여 어쿠스틱 기타의 튜닝시에 매우 효과적입니다.
8. Speaker : 내장된 피치 파이프의 소리를 출력해 주는 역할을 합니다.
9. Tuning guide LED :
튜너의 왼쪽 상단에 위치한 LED 램프로 튜닝하려는 음보다 낮으면 b램프가 켜지고 높으면
#램프가 켜지며, 정튜닝이 되면 가운데의 녹색 LED 램프가 켜집니다.
# 건전지 AAA 2개가 포함되어 있습니다.

제품 상세 스펙

Tuning: 12 note equal-tempered Detection
range: 23.12Hz - 1975.54Hz
Guitar Reference tone: 7B-6E-5A-4D-3G-2B-1E
Bass Reference tone: LB-4E-3A-2D-1G-HC
Built-in Speaker
Tuning modes: Meter (auto guitar/bass) and Sound (auto guitar/bass)
Flat tuning: 1 - 5 semitones "Quinta Flat"
Tuning accuracy: +/-1cent
Sound accuracy:+/-1.5cent
Connection jack: Input jack (1/4" mono)
Power supply: Two AAA batteries 3V
Battery life: Approximately 100 hours
Dimensions: 4.1"(104mm) Wide x 2.52"(64mm) Deep x 0.6(15mm) High
Weight: 2.86 oz (81g) (Including batteries)
Included items: Owner's Manual, (2)AAA batteries


이건 심심할때 한옥타브 높여 칠려고..
왠지 고음이 더 뽀대 나는 것 같아,,,ㅎㅎ


★ Gyser Flat Capo
* Acoustic, Electric 기타에 사용 가능합니다.
* 빠르고 쉽게 부착 할 수 있습니다.
* 위, 아래 어느 플렛에도 부착이 가능합니다.

Capo 제대로 사용하기
먼저 카포는 카포타스토(Capotasto)의 준말로 기타의 여섯줄을 눌러 코드 전체의
음정을 조절할 수 있도록 도와주는 기구입니다.

카포의 종류에는 고무줄식, 용수철식, 나사식, 지랫대식, 집게식이 있는데 이중에
집게식이 제일 무난하고 사용하기도 편합니다.

카포는 사용하는 플랫만큼 음정이 올가가게 되는데, 기타는 한 플랫이반음이므로
카포를 2플랫에 설치하고 C코드를 잡게되면 D코드의 소리가 나게 됩니다.

카포는 운지가 어려운 Gm코드, Eb같은 코드가 나올경우 카포를 3째칸에 설치하고
Gm코드는 Em코드로 운지하고 Eb코드는 C코드로 운지하면 코드의 누르는 폼은
바뀌었지만 코드의 음정은 바뀌지 않게 됩니다.

이밖에도 카포는 자신이 부르고자 하는 노래가 높거나 너무 낮아서 부르기가 곤란한
경우, 카포를 사용하면 쉽게 자신의 음정에 맞는 음역대로 바꿀수가 있습니다.

몇 가지 예를 보면 자신의 음역대가 부르고 싶은 노래에 비해 많이 낮을때는 3~6번
플랫에 카포를 사용하고 조금 낮을때는 1~3번플랫에 사용해서 노래할수 있습니다.

그리고 이와 반대로 노래가 너무 높을때는 1~3번플랫에 사용하고 조금 높을때는
3~6번플랫에 사용하여 노래를 부를수 있습니다.

이밖에 카포를 이용해서 2대의 기타가 서로 듀엣을 하고자 할때 한 기타는 낮은
포지션과 나머지 다른 기타는 높은 포지션에서 연주하면 멋진 화음을 만들어 낼수
있습니다.
Posted by 장안동베짱e :

근호 님의 말 :
 므시또 그래 우울하노
[**] 우울,우울,우울, 님의 말 :
 흠.;
[**] 우울,우울,우울, 님의 말 :
 그냥 사는게 우울하죠
근호 님의 말 :
 ㅋㅋㅋ
근호 님의 말 :
 글루미 에브리데이 ;;
[**] 우울,우울,우울, 님의 말 :
 ㅎㅎ
근호 님의 말 :
 우울하면 기타를 잡아라
근호 님의 말 :
 흐흐흐
근호 님의 말 :
 파워코드 잡고 막 갈기면 존내 시원해진다 ;;


기타를 잡아야겠다. 저말 들으니, 뮤지션의 피가 끓어 오른다..

근데.. 아직 코드 잡는것도 너무 어렵다...ㅠ




Posted by 장안동베짱e :
엄청 자주 써먹는 기능인데 잘 잊어 버려서...흠흠..


[CODE] CString str("흐흠.."); char charArr[SIZE]; // 요기 // 이근호님께서 잘못될 수도 있는 부분을 지적해주셨음ㅋ strncpy(charArr, (LPCTSTR)(LPSTR)str, SIZE<str.length()?SIZE:str.length()); [/CODE]
Posted by 장안동베짱e :

[CODE]char msg[BUFERSIZE];[/CODE]
//LoadString(핸들, 리소스ID, msg, BUFFERSIZE);
[CODE]LoadString(GetModuleHandle(NULL), IDS_STRING1, msg, MAX_PATH); printf(buff);[/CODE]
Posted by 장안동베짱e :
출처 : http://blog.naver.com/xinfra.do?Redirect=Log&logNo=80008191117

Win32 아키텍처 완전 해부 ?
DLL의 모든 것
이번 호에서는 DLL에 관한 전반적인 내용을 살펴보기로 한다. DLL을 사용하기 위해 알아야 할 일반적인 내용과 DLL의 생성 및 사용법을 알아보고, 필자가 코딩한 FTP 프로그램을 통해 어떻게 DLL을 exe 프로그램에서 사용할 수 있는지 살펴보겠다.

마이크로소프트의 윈도우 오퍼레이팅 시스템을 사용하는 사람이라면 DLL, 즉 Dynamic Linking Library를 모르는 사람이 거의 없을 것이다. 필자가 사용하는 윈도우 NT 4.0의 winnt\system32 및 winnt\system 디렉토리에는 200개가 넘는 DLL이 있으며, 윈도우 98 윈도우 디렉토리에 자그마치 450여 개의 DLL들이 있다. 물론 윈도우에서 DLL을 사용하는 응용프로그램들의 종류에 따라 차이가 있겠지만 우리가 사용하는 DLL의 수는 이보다 많을 수도 있다. 이렇게 많은 수의 DLL을 사용하고 있지만 정작 DLL에 대해 충분한 지식을 가진 사람은 그리 많지 않다.
이 글을 통해 어떻게 하나의 DLL이 생성되는지, 그리고 라이브러리 파일(.LIB) 및 실행파일 (.EXE)과는 어떻게 연동되는지에 대한 구체적인 내용을 살펴보겠다. 이것은 DLL과 실행 파일의 개발자, 테스터, 시스템 관리자, 윈도우 32 플랫폼 사용자 등 모든 윈도우 사용자에게 필요한 도움을 줄 것으로 생각한다. 이 글을 통해 윈도우에서 사용되는 DLL의 개발 과정, 윈도우 실행 프로그램과의 연동을 비롯하여 DLL에 관한 제반 사항들을 이해하게 될 것이다. 여기서는 DLL의 개념과 장점, 자원공유, DLL의 사용법 등 DLL을 사용하는데 알아야 할 일반적인 내용을 살펴보겠다.

DLL의 정의와 사용법
흔히 말하는 DLL이란 실행파일이 요구하는 함수, 변수, 또는 데이터를 담고 있는 프로그램을 의미한다. 보통 윈도우 32 플랫폼과 같은 프로세스 내에 존재하는 실행 프로그램의 필요에 따라 동적으로 사용되도록 하는데 그 목적이 있다. DLL은 흔히 같은 시스템 내에 존재하기 마련이지만 COM DLL과 같이 COM 클라이언트를 위해 만들어진 DLL도 있다. 어느 DLL이나 그 개념은 동일하므로 여기서는 윈도우 32 환경에서 사용되는 일반적인 DLL에 초점을 맞추어 설명하도록 하겠다. DLL은 공통된 프로그램만 하나의 파일 형태로 묶어 놓았으므로 사용할 때 다음과 같은 여러 이점이 있다.

·공통 프로그램은 다시 코딩할 필요가 없으므로 개발자의 개발 시간을 단축한다.
·해당 exe 파일의 크기가 축소되므로 하드디스크를 보다 효율적으로 사용할 수 있다.
·같은 프로세스 내에서는 동일한 DLL을 여러 번 메모리에 올리지 않아도 되므로 시스템의 메모리를 절약할 수 있다.

DLL과 자원 공유
DLL을 사용할 때 비록 같은 시스템이라도 다른 프로세스에 의해 사용되면 같은 DLL이 여러 번 메모리에 올라가게 된다. 윈도우 32는 다중 프로세스 환경을 지원하는데, 이는 여러 프로세스가 하나의 시스템에서 작동할 수 있음을 의미한다. 이 때 각 프로세스는 자신만의 가상 메모리 영역을 차지하게 되며 특별한 코딩 없이는 프로세스간의 메모리 영역은 침범할 수 없도록 되어 있다.
따라서 윈도우 32 환경에서 DLL이 필요한 어느 한 실행 프로그램을 사용자가 두 번 실행했다면 두 개의 프로세스가 생성되며, 각 프로세스는 자신의 가상 메모리 영역 내에서 같은 DLL을 따로따로 자신의 메모리 영역에 올리게 된다. 또한 DLL은 새로운 윈도우를 생성하지 않고 메시지 처리에 관한 코딩을 하지 않는다. 이 두 가지 작업은 모두 사용자 윈도우에서 처리해야 할 사항들이다.
윈도우에서 없어서는 안될 중요한 DLL 세 개를 꼽는다면 Kernel32.dll, user32.dll, 그리고 gdi32.dll이다. Kernel32.dll은 윈도우 파일 시스템, 메모리 관리 등에 관련된 기능을 가지고 있으며, user32.dll은 사용자 인터페이스와 관련된 함수를, 그리고 gdi32.dll은 그래픽에 필요한 제반 함수를 담고 있다.
다음에 나열된 .LIB 파일들은 필자가 본 글과 관련된 예제 프로그램을 링크하기 위해 사용한 DLL의 이름이다. 이들 중 wininet.lib를 제외한 모든 프로그램들은 Visual C++의 Win32로 링크하는 경우 기본적으로 따라오는 라이브러리들이다. wininet.lib을 제외한 다른 모든 .lib 파일들은 Visual C++에서 윈도우 32 프로그램을 만들 때 기본적으로 포함되는 DLL들을 사용할 수 있게 해주며, wininet.lib은 인터넷 서비스를 담고 있는 DLL을 사용할 수 있게 해 준다.

kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib
odbc32.lib odbccp32.lib wininet.lib
물론 여기의 링크 리스트에 포함되었다고 해서 이들 DLL이나 DLL에 포함되어 있는 함수들을 사용할 수 있는 것은 아니다. 이들 함수를 사용하기 위한 환경을 만들어 주는 적절한 헤더파일과 이에 해당하는 DLL 파일들이 제 위치에 존재하고 있어야 한다.
예를 들어 kernel32.lib에서 제공되는 함수들은 윈도우 NT 4.0의 경우 681개이다. 여기에는 LoadLibraryA, LoadLibraryExA, LoadLibrary ExW, LoadLibrar yW 등을 포함한 수많은 함수가 제공되고 있다.
앞으로 나오게 될 LoadLibrary를 예로 들어보자. LoadLibrary를 사용하기 위해서는 이 함수를 담고 있는 DLL, 즉 Kernel32.dll이 우선 시스템 내에 존재하고 있어야 하며 Kernel32.dll을 가리키는 Kernel32.lib 파일이 또한 존재해야 한다. 그리고 이 DLL을 사용하는데 필요한 준비를 하기 위해 헤더파일을 소스 프로그램에 첨부하여 컴파일하고 링크해야 비로소 알맞은 버전의 LoadLibrary를 시스템에서 사용할 수 있게 된다.
이렇게 한번 메모리에 적재된 DLL은 같은 프로세스 내의 어떠한 exe 파일에서도 접근이 가능하며 자유롭게 사용할 수 있다. DLL에 내장된 이런 함수들은 시스템의 여러 다른 프로그램들에 의해 계속 사용되며, 사용이 끝나면 프로세스의 메모리에서 삭제되어 시스템으로 자원을 환원하므로 불필요한 자원의 사용을 피하게 된다.

프로그램에서 DLL 사용하기
DLL을 우리가 만드는 exe 프로그램에서 사용하기 위해서는 우선 DLL 코드를 메모리에 적재 또는 매핑해야 하는데, 여기에는 implicit와 explicit의 두 가지 방법이 있다. implicit은 본 예제 프로그램과 같이 DLL에 내장된 함수를 exe 프로그램에서 그냥 사용하는 것이며, explicit은 LoadLibrary나 LoadLibraryEx를 사용하여 프로그래머가 직접 메모리에 올려주는 방법이다. 어떤 방법을 사용하든지 해당 DLL을 필요한 시기에 메모리로 올려주며 사용한 DLL의 사용 회수를 증가시킨다는 점에 있어서는 다를 바 없으나 운영에는 다소 차이가 있다.

Implicit Linking
Implicit은 정확하게 표현하면 Implicit 로더 타임 링킹이라 할 수 있는데, 이는 해당 exe 프로그램에서 사용될 DLL 정보를 exe 코딩에 내장하는 방법이다. 이렇게 하면 윈도우가 하나의 exe 파일을 실행할 때 어떤 DLL이 필요한지 알려주어 exe 파일이 착오 없이 실행된다. 이런 상태에서 exe 프로그램이 DLL에 내장된 어느 함수를 부르면 오퍼레이팅 시스템은 해당 함수가 실린 DLL을 정해진 알고리즘에 의해 찾아서 프로세스의 메모리 공유 지역에 적재하여 함수의 사용이 가능하게 된다. Implicit linking을 사용하기 위한 절차는 다음과 같다.

1. 원하는 함수가 적재하고자 하는 DLL에 내장되어 있음을 확인한다.
2. 원하는 함수가 다음과 같은 위치에 존재하고 있음을 확인한다.
·원도우 등록기의 KnownDlls 폴더의 값은 그림 1과 같이 윈도우 등록기의 “/HKEY_LOCAL_MACHINE/System/CurrentControl Set/Control/SessionManager/knownDlls” 폴더에 명시되어 있다.
·exe 실행 파일과 같은 디렉토리
·프로세스의 현재 디렉토리
·윈도우 시스템 디렉토리나 DLL 디렉토리이다. DLL 디렉토리는 보통 %systemRoot%를 의미하며 윈도우 NT 4.0의 경우 이 디렉토리는 위에서 언급한 등록기에 명시되어 있는데, 이 값은 특별히 관리자가 변동시키지 않았다면 WinNT/System32가 된다.
·윈도우 디렉토리이다. 윈도우 NT 4.0의 경우 이 값은 WinNT이다.
·PATH 환경 변수가 가리키는 디렉토리이다. 이 때 필요한 DLL을 항목 2에 명시한 위치의 어느 곳에서도 찾을 수 없다면 시스템은 오류 메시지가 담긴 다이얼로그 박스를 사용자에게 보여주고 해당 프로그램을 완전히 취소하게 된다.
3. 프로그램에서 필요한 함수를 불러 사용한다.
4. 해당 프로세스의 소멸과 함께 DLL 또한 메모리에서 소멸되며 프로그램의 실행이 종결된다.

Explicit Linking
Explicit linking은 Implicit linking에 비해 그 사용이 조금 까다롭지만 원하는 시점에 마음대로 올리고 내릴 수 있다는 점에서 관리가 훨씬 자유롭다. Explicit linking은 LoadLibrary나 LoadLibraryEx에 의해 처리되며, 프로그램에서 이러한 함수들을 호출함과 동시에 알고리즘에 의해 필요한 DLL을 찾은 후 해당 DLL을 프로세스의 메모리에 매핑하여 실행을 위한 준비를 끝낸다. 여기서 사용되는 LoadLibrary는 DLL의 이름을 LPCTSTR 타입의 인자로 받으며, 실행이 성공하면 HINSTANCE를, 실패하면 NULL을 각각 반환한다.
LoadLibrary와 비슷하지만 좀 더 많은 인자를 요구하는 함수가 LoadLibraryEx이다. 이 함수는 DLL이 프로세스의 메모리에 매핑되는 구체적인 방법을 명시하는 dwFlag가 DWORD 형태로 요구된다는 점 이외에는 LoadLib rary와 같은 일을 한다. 즉 LoadLibraryEx를 사용하면 DONT_RESOLVE_DLL_REFERENCES, LOAD_LIBRARY_AS_DATAFILE, 그리고 LOAD_WITH_ALTERED_SEARCH_ PATH와 같은 다양한 방법으로 DLL을 프로세스의 메모리에 매핑할 수 있다.

·DONT_RESOLVE_DLL_REFERENCES : 이 옵션은 윈도우 NT에서만 사용할 수 있으며 DllEntryPoint를 부르지 않을 때 사용한다. DllEntry와 DllExit 코드는 DllMain을 설명할 때 함께 하기로 하고, 지금은 Dll의 Entry Point에서 명시된 코드를 실행하지 않을 때 이 옵션을 사용한다는 것만 이해하도록 하자.
·LOAD_LIBRARY_AS_DATAFILE : 이 옵션은 DLL 파일을 하나의 단순한 데이터 파일로 이해하고 적재하도록 하는데 그 목적이 있다. 실행 코드가 전혀 없는 DLL들은 시스템에서 DLL의 실행을 위한 특별한 준비가 필요하지 않으므로 실행 시간을 절약할 수 있다.
·LOAD_WITH_ALTERED_SEARCH_PATH : 이 옵션을 사용하면 위에서 언급한 DLL을 탐색하는 경로를 LoadLibraryex(LPTCSTR)에 명시된 대로 바꿀 수 있다는 이점이 있으나 아직 필자도 이 옵션은 사용해 보지 않았다.

이렇게 LoadLibrary나 LoadLibraryex로 프로세스의 가상 메모리에 적재된 DLL은 사용이 끝나면 ‘BOOL FreeLibrary (HINSTANCE hInstDll)’을 사용하여 풀어주면 된다. 이상에서 설명한 Implicit linking과 Explicit linking의 과정을 종합하면 그림 2와 같다. DLL은 시스템에서 사용되는 하나의 자원으로서 독립된 카운터를 가진다. DLL이 메모리에 적재될 때, 그리고 사용 후 메모리에서 풀어줄 때 카운터의 값이 이에 따라 바뀌게 된다. 이 때 카운터가 0이면 해당 DLL은 더 이상 사용되지 않으므로 시스템은 자동으로 이 DLL을 메모리에서 삭제하게 된다.


Implicit linking으로 DLL을 사용하고자 할 때는 해당 LIB을 링크 옵션에 더해준 뒤 헤더파일을 소스코드에 포함시키고 원하는 함수를 사용하면 되므로 간단하다. 하지만 Explicit linking으로 DLL을 사용하고자 할 때는 몇 가지 과정이 더 포함되어야 한다. 이에 대한 자세한 내용은 ‘DLL의 생성과 사용’에서 다루어 보기로 하겠다.

DLL의 구현
여기서는 실제 DLL을 구현하는 과정에 대해서 살펴보기로 하겠다.
DLLMain
DllMain은 함수를 DLL을 통하여 export 할 때 적용할 수 있으며, 이 DllMain은 어떤 DLL 프로그램에 있어서 시작점이면서 또한 끝나는 점이기도 하다. 즉 DLL이 사용될 때와 풀어질 때 시스템은 DllMain을 거치도록 되어 있다. DllMain은 프로그래머가 생성해 주지 않을 때는 다음과 같은 기본값이 시스템에 의해 제공되지만, 스레드나 프로세스 레벨에서 DLL의 코드 실행과 관련된 초기화 작업이 필요하면 DllMain의 인자 중 하나인 ‘ul_reason_for_call’을 분석하여 필요한 초기화 작업을 처리해 줄 수 있다.

BOOL WINAPI DllMain (HANDLE hInst,
ULONG ul_reason_for_call,
LPVOID lpReserved)
{
return TRUE;
}
‘ULONG ul_reason_for_call’은 네 개의 옵션을 가지며 다음과 같은 방법으로 사용할 수 있다.

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved )
{
switch( ul_reason_for_call ) {
case DLL_PROCESS_ATTACH:
...
case DLL_THREAD_ATTACH:
...
case DLL_THREAD_DETACH:
...
case DLL_PROCESS_DETACH:
...
}
return TRUE;
}
이 코드에서 DllMain의 두 번째 옵션인 ul_reason _for_call을 분석하여 스레드와 프로세스 레벨에서 필요한 초기화 작업을 수행할 수 있다. DLL_PROC ESS_ATTACH 옵션은 새로운 프로세스가 기본 스레드와 함께 생성되면서 DLL을 사용할 때 시스템이 DllMain을 부르기 위한 옵션이다. 따라서 이 옵션은 프로세스 레벨에서 필요한 초기화 작업에 유용하게 사용할 수 있다. 예를 들어 프로세스 레벨에서 정의된 하나의 변수를 해당 프로세스에 속한 모든 스레드가 사용하고자 할 때 같은 변수지만 각 스레드마다 다른 값을 독립적으로 저장하도록 하기 위해 우리는 Thread Local Storage를 사용한다. 이 때 변수는 프로세스 레벨에서 정의되고 그 값은 스레드마다 독립되므로 초기화해 줄 수 있는 좋은 예가 된다. DLL_THRE AD_ATTACH 옵션은 기본 스레드 외에 다른 스레드가 새롭게 생성되어 DLL을 필요로 할 때 시스템이 사용하는 옵션이다. 이 옵션 역시 스레드 레벨에서 초기화하고 싶은 작업을 수행하기에 좋다. DLL_PROCESS_DETACH 및 DLL_THREAD_DETACH는 프로세스와 스레드가 사용 중인 DLL을 그만 사용하고자 할 때 시스템이 DllMain을 부르는 옵션으로 초기화된 데이터나 변수를 원래 값으로 환원할 때 사용한다.
시스템이 exe 실행 파일의 WinMain 직접 부르지 않는 것처럼 DllMain 함수 역시 시스템에서 직접 부르는 것이 아니다. DLL의 Attach 및 Detach 이벤트가 발생하면, 즉 DLL이 프로세스의 가상 메모리에 매핑이 되면 시스템은 dll의 시작을 위해 만들어진 DLL CRT startup 함수를 부른다. 이 DLL CRT 함수는 C Run-Time에 필요한 초기화 작업들을 수행하며, 이 DLL CRT startup code가 DllMain()을 실행하도록 되어 있다. DllMain에서 작업이 끝나면 exit 값을 다시 CRT startup code로 반환하여 DLL의 실행이 끝난다.

DLL의 생성과 사용
DLL 파일은 다른 exe 프로그램에서 사용할 여러 함수를 내장하고 있으며 exe 파일들은 필요한 함수를 DLL에서 불러와서 사용한다. 즉 DLL 파일은 함수를 export하게 되며, exe 파일은 함수를 import하는 방식이 된다. 물론 DLL 함수를 부르는 것이 반드시 exe 프로그램만은 아니다. 하나의 DLL이 또 다른 DLL을 부르는 경우도 많다. 중요한 것은 공유하는 함수를 제공해 주는 것은 export로, DLL에서 제공하는 공유 함수를 가져와서 사용하는 경우는 import라는 개념으로 정의한다는 것이다.
DLL 파일은 필요하다면 DllMain과 다른 여러 가지 함수를 export하기 위해 정의해 주게 되는데, 다음으로 DLL에서 어떻게 함수들을 export하기 위해 준비하는지 알아보도록 하겠다. 심볼 import와 export 테이블에 대한 보다 자세한 내용은 ‘DumpBin으로 WinInet.dll 보기’를 참조하기 바란다.

심볼 export
많은 경우 시스템에서 제공되는 DLL의 함수를 import하여 사용하지만 공통된 기능을 사용하는 여러 가지 프로그램이 포함된 큰 프로젝트를 만들 때는 자체적으로 필요한 함수를 정의하여 DLL 실행 파일로 만들어 export 할 수도 있다. 우선 하나의 함수를 DLL로부터 export하기 위해서는 특별한 정의가 필요한데, 이것이 바로 __declspec (dllexport)이다. 예를 들어 BOOL processData라는 함수를 DLL을 사용하여 다른 DLL이나 exe 파일에서 사용이 가능하도록 export하려면 다음과 같이 정의할 수 있다.

__declspec(dllexport) BOOL processData (DWORD, DWORD);

컴파일러에서 __declspec(dllexport)로 정의된 함수나 변수를 보면 .obj 파일에 특별한 정보를 첨부하여 export를 위한 함수라는 것을 표시한다. 이 정보는 링크로 인해 해당 DLL 파일과 같은 이름의 .LIB 파일을 생성하도록 해준다. 이 때 많은 함수가 DLL 파일로부터 export 되도록 정의되었다면 링크는 export 되는 모든 함수의 이름, 즉 심볼들을 알파벳 순서대로 저장한다. DLL을 만들 때 한 가지 유의할 점은 Visual C++로 만든 DLL의 심볼을 다른 컴파일러로 만든 exe나 DLL에서 export 할 때 심볼 이름의 차이점을 이해하는 일인데, export와 import에서 모두 같은 컴파일러를 사용한다면 걱정할 필요가 없다.
하지만 현재 우리는 다양한 종류의 컴파일러를 사용하고 있으므로 누가, 언제, 어떤 컴파일러로 export된 DLL 함수를 사용하게 될지 알 수 없다. 필자도 그렇게 다양한 컴파일러를 사용하는 편은 아니다. 윈도우 32 프로그램의 컴파일에는 주로 Visual C++와 Borland C++를 사용하고 있으며, 노벨 NLM의 컴파일에는 왓캄이나 코드와리어를 사용한다. 자바를 사용하기는 하지만 주로 JDK 레벨에서 사용하므로 특정 벤더의 자바 컴파일러를 사용하지는 않는다. 그렇다 하더라도 역시 다른 컴파일러에 의해 생성된 심볼의 통일성 문제에서 완전히 자유롭지는 않다. 어떤 이유에서건 하나의 DLL을 export 할 때 우리는 직접 만든 DLL이 어떤 컴파일러에서도 import 되도록 할 필요가 있다.

심볼 import
DLL에서 export 된 심볼을 다른 DLL이나 exe 파일에서 import하여 DLL 함수의 공유가 이루어진다. 하나의 exe 프로그램을 만들 때 지역 변수나 지역 함수들은 우리가 흔히 사용하는 방법대로 필요한 장소에 정의해 주면 된다. 하지만 DLL의 함수나 변수를 사용할 때는 컴파일러에게 특정한 정보를 제공할 필요가 있는데, 이것이 바로 심볼 export에서 사용한 것과 비슷한 방법인 __declspec (dllimport)이다. 따라서 위에서 export한 심볼을 import 하기 위해서는 다음과 같이 정의해 주면 된다.

__declspec(dllimport) BOOL processData (DWORD, DWORD);
컴파일러가 이 코드를 처리하면서 .OBJ 파일에 특별한 정보를 넣어 두는데, 이 정보는 링크가 EXE 파일을 만들 때 어떤 DLL의 함수를 .LIB 파일에서 찾을 수 있는지를 알려주는 역할을 한다. 링크가 .LIB 파일에서 import 심볼들을 발견하면 링크는 이러한 import 심볼들을 exe 파일의 import 심볼 테이블에 삽입하여 링크가 exe 파일을 하드디스크에 쓰기 위한 작업을 마치게 된다. 이렇게 준비된 exe 파일은 import된 심볼을 어떤 DLL에서 export하고 있는지 알고 있으므로 Implicit 또는 Explicit 링크 프로세스에 의해 함수의 사용이 요구되었을 때 해당 DLL을 현재 실행 중인 프로세스의 가상 메모리에 즉시 올릴 수 있게 된다.

DLL 헤더파일 만들기
심볼의 import, export를 위해 헤더파일이 반드시 필요한 것은 아니다. 하지만 import와 export 프로세스를 쉽고, 간편하게 코딩하기 위해 헤더파일을 사용하기도 한다. import 및 export 프로그램에서 정의된 ‘__declspec() ...’를 #include ‘myDll.h’와 같이 간단하게 정의할 수 있다고 해보자. 이렇게 하면 myDll.h 파일을 다음과 같이 만들 수 있다. EXPORTAPI를 DLL 파일에 정의한 후 본 헤더파일을 첨가하여 같은 파일을 import와 export 프로그램 모두에 사용할 수 있다.

#if !defined (EXPORTAPI)
#define EXPORTAPI __declspec(dllimport)
#endif
위의 헤더파일을 사용하기 위해 DLL의 export 파일에 있는 함수들을 #define EXPORTAPI로 정의하고 다음 줄에 #include “myDll.h”를 써주면 된다. import 프로그램에서는 EXPORTAPI를 정의할 필요 없이 바로 #include “myDll.h”를 사용하면 된다. 심볼을 import, export 하기 위해 각 함수를 __declspec(dllimport), 그리고 __declspec(dllexport)으로 정의한다고 언급한 바 있다. 이렇게 헤더파일을 사용하여 하나의 헤더파일을 import와 export 프로그램에 모두 사용할 수 있다. 수정이 필요할 때는 import와 export 모두를 수정할 필요없이 헤더파일 하나만 수정하면 되므로 프로그램의 관리가 용이하다.

DumpBin으로 WinInet.dll 보기
DumpBin.exe 프로그램은 마이크로소프트의 비주얼 C++ 컴파일러와 함께 제공되는 프로그래밍 툴이다. 이 툴은 주로 기존의 DLL에서 제공되는 함수들을 파악하고자 할 때 사용할 수 있고 실행에 필요한 다양한 옵션을 제공하고 있는데, 필자가 DLL DumpBin 실행 결과를 출력하기 위해 사용한 옵션은 다음과 같다.
DumpBin.exe /imports /exports /out:wininet.txt c:\winnt\
system32\wininet.dll
이 명령의 실행 결과로 윈도우의 C:\WinNT\Sys tem32 디렉토리에 위치하는 WinInet.DLL의 import와 export 함수들은 다음과 같다.

Dump of file c:\winnt\system32\wininet.dll
File Type: DLL
Section contains the following Imports
SHLWAPI.dll
70BD75E0 D2 StrCmpNIA
70BD2720 D6 StrCpyNW
. . .
ADVAPI32.dll
77DC208E E9 GetTokenInformation
77DD9815 19C RegOpenKeyA
. . .
KERNEL32.dll
77F0D109 23D ReadFile
77F1B2C1 1D0 IsBadReadPtr
. . .
USER32.dll
77E71BF1 15A GetWindowLongA
77E72575 218 SendMessageA
. . .
Section contains the following Exports for WININET.dll
ordinal hint name
115 0 CommitUrlCacheEntryA (00004C42)
116 1 CommitUrlCacheEntryW (0004F103)
. . .
Summary
3000 .data
4000 .reloc
A000 .rsrc
60000 .text
이 데이터를 살펴보면 import, export, 그리고 summar y 부분으로 크게 나눌 수 있고, import 부분은 다시 DLL 별로 구분되어 해당 DLL로부터 import 되는 모든 함수들을 심볼 주소, 인스턴스 핸들, 그리고 심볼 이름의 순으로 나열되어 있다.
따라서 우리는 WinInet.DLL이 StrCmp NIA, StrCpyNW 등의 함수들을 SHLWAPI.dll로부터, GetTokenInformation, RegOpenKeyA 등은 ADVAP I32.DLL로부터, ReadFile, IsBadReadPtr 등은 Kernel32.DLL로부터, 그리고 GetWindowLongA, SendMessageA 등은 USER32.DLL로부터 각각 import 하고 있음을 알 수 있다. Export 부분은 차례순, 인스턴스 핸들, 알파벳순으로 나열된 심볼 이름을, 그리고 괄호 속에는 심볼의 주소를 기록해 놓았다. 따라서 WinInet.DLL에서 export하는 많은 함수들 중에 CommitUrlCache EntryA, CommitUrlCacheEntryW 등이 포함되어 있음을 알 수 있다.
마지막으로 summary 부분을 보면 먼저 숫자가 나오고 점으로 시작하는 문자열이 나열되어 있는데, 처음 나오는 숫자는 16진법의 바이트의 크기를 나타내고 뒤따르는 문자열은 데이터 형태를 나타낸다. 모든 DLL이나 exe 이미지 파일은 정해진 특별한 부분, 즉 섹션들로 나누어지는데 이에 해당되는 부분은 DLL 이미지의 summary 부분에 나타나도록 되어 있다.
즉 .data는 초기화된 데이터를, .reloc은 relocation size를, .rsrc는 리소스를, 그리고 .text는 프로그램 코드를 저장하는 부분을 각각 나타내며 그 외에도 WinInet.DLL에서 사용하지는 않지만 .bss는 초기화되지 않은 데이터를, .rdata는 런타임 데이터, .edata는 export된 함수 이름의 테이블, .xdata는 예외 처리(exception handling) 테이블, .idata는 import 된 함수 이름 테이블, .CRT은 C 런타임 데이터, .debug는 디버깅 정보, 그리고 .tls는 thread local storage의 데이터를 각각 나타낸다.
이와 같이 이미 정해진 섹션 이름들이 있지만 필요하다면 프로그래머의 재량에 따라 임의로 이름을 정해주고 그 섹션으로의 접근을 Read, Write, Execute, Shared의 네 개의 모드(Access Mode)로 접근 권한을 조정할 수 있다.
임의로 섹션 만들기에 대해 간단하게 설명하도록 하겠다. 윈도우 프로그램에서 임의로 섹션을 만드는 것은 그리 어려운 일이 아니다. 프로그램의 소스 코드를 만들 때 다음과 같은 두 가지 지시어를 사용하여 섹션을 생성하고 필요한 권한을 부여할 수 있다.
첫째, 원하는 데이터를 #pragma data_seg()라는 명령어로 묶는다. 예제에서 보는 것과 같이 int global Counter=0;을 섹션 이름 “my_section”으로 표시하고자 한다면 다음과 같이 할 수 있다.

#pragma data_seg(“mysection”)
int globalCounter = 0;
#pragma data_seg()
이렇게 하면 컴파일러는 #pragma data_seg (“mys ection”)와 #pragma data_seg() 사이에 있는 초기화된 모든 변수를 새로운 섹션인 “.mysection” 내에 저장하게 된다.
이 때 globalCounter 변수가 초기화되지 않았다면 .bss 섹션으로 저장이 되므로 지정한 섹션으로 변수를 저장하기 위해서는 반드시 초기화하는 작업이 필요하다.
둘째, 이렇게 정해진 섹션에 필요한 접근 권한을 부여해 준다. 앞서 언급한 것처럼 프로그래머는 생성된 섹션에 읽기(Read), 쓰기(Write), 실행하기(Execute), 그리고 공유(Share) 권한을 부여할 수 있는데, 위에서 생성한 globalCounter에 읽기, 쓰기 및 공유 권한을 부여하고자 한다면 #pragma data_seg() 아래에 다음과 같은 명령어를 사용하면 된다.

#pragma comment(linker, “/section:mysection, RW”)
이렇게 하면 mysection은 다른 여러 프로세스가 읽고, 쓰고, 공유할 수 있게 되므로 프로세스간의 데이터 공유가 가능해진다.

예제 프로그램 이해하기
마지막으로 윈도우 32 API를 간략하게 소개하고, 필자가 코딩한 인터넷 FTP 프로그램을 살펴보도록 하자.

DLL과 관련된 윈도우 32 API
여기 소개된 윈도우 32 함수들은 예제 프로그램에서는 잘 사용하지 않은 API들이다. 이번 기회에 이러한 함수들을 본 예제 프로그램에 첨가하여 사용법을 익히고 반환값을 살펴보기 바란다.

·HINSTANCE LoadLibrary(LPCTSTR lpLibFileName) : LoadLibrary는 DLL의 이름을 입력받아 핸들을 반환하도록 되어 있다. 반환된 핸들은 GetProcAddress API를 사용하여 해당 DLL이 가상 메모리에 올려진 주소를 알려준다. LoadLibrary 실행 후 오류가 발생하면 NULL을 반환하며, 이 때는 GetLastError를 불러 오류의 종류를 알아볼 수 있다.
·HINSTANCE LoadLibraryEx(LPCTSTR lpLibFileName, HANDLE hFile, DWORD dwFlags) : LoadLibraryEx는 모든 면에서 LoadLibrary와 그 성격이 동일하지만 dwFlags를 통해 DLL을 메모리에 올릴 때 여러 가지 옵션을 사용할 수 있다는 점이 다르다.
·BOOL FreeLibrary(HMODULE hLibModule) : FreeLibrary를 사용하므로 DLL의 사용 횟수를 한번 줄여주고, DLL 사용 회수가 0이 되면 시스템은 DLL이 사용하고 있는 메모리를 풀어서 다시 시스템으로 환원해 준다. FreeLibrary 실행이 성공하면 TRUE를, 실패하면 FALSE를 반환하도록 되어 있다.
·HMODULE GetModuleHandle(LPCTSTR lpModuleName) : GetModuleHandle은 DLL 이름을 변수로 입력해 줌으로써 메모리에 올려진 DLL의 핸들을 반환해 준다. GetProcaddress를 사용하여 시스템에 올려진 메모리의 값을 알아낸다는 점은 LoadLibrary와 동일하나 DLL 사용 횟수를 변경하지 않는다는 점이 LoadLibrary와 다르다. 실행이 성공적이면 DLL의 핸들을 반환하지만 실패하는 경우는 NULL을 반환한다.
·DWORD GetModuleFileName( HMODULE hModule, LPTSTR lpFilename, DWORD nSize ) : 이 함수는 모듈 핸들에 해당하는 파일 이름을 알고자 할 때 사용한다. hModule의 값으로 NULL을 입력하면 현재 실행 중인 모듈의 파일 이름을 반환하게 된다. 인자로 모듈의 핸들, 스트링 포인터, 그리고 DWORD 사이즈를 받으며 실행 후 DWORD를 반환한다. hModule은 모듈 핸들을 입력하며 nSize는 lpFileName으로 복사하게 될 문자의 수를 입력한다. 이 핸들을 받아 시스템은 lpFileName 버퍼에 모듈에 해당되는 파일 이름을 채워주고, lpFileName으로 복사한 문자의 수를 반환해 준다.
·VOID FreeLibraryAndExitThread( HMODULE hLibModule, DWORD dwExitCode ) : 이 함수는 FreeLibrary(hLibModule)와 ExitThread (dwExitCode)를 순차적으로 실행시켜 준다. 따라서 이 함수를 사용하면 시스템에서 사용 중인 DLL의 사용 회수를 한 번 감소시키고 즉시 해당 스레드를 끝낸다.
·FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName) : 하나의 DLL에서 export된 함수의 메모리 위치를 알기 위해 사용하는 API이다. 즉 hModule에 DLL 이름을, lpProcName에 DLL이 export하는 함수의 이름을 인자로 입력하여 실행하면 lpProcName에 해당하는 메모리의 주소를 반환해 준다.

예제 프로그램
여기 소개하는 예제 프로그램은 마이크로소프트의 WinInet.DLL의 함수들을 사용한 FTP 프로그램이다. WinInet.DLL에서 export하는 함수들을 본 예제 프로그램이 LoadLibrary() 함수를 통해 import하는 과정을 참조하기 바란다. 사실 DLL은 윈도우의 어느 프로그램에서나 사용하므로 필자는 간단한 인터넷 FTP 프로그램을 코딩하면서 DLL을 사용하는 방법을 소개하고자 한다.
본 예제 프로그램의 사용법은 간단하다. 우선 소스로 제공되는 6six.exe를 실행하면 그림 3과 같은 FTP 콘솔 화면이 나타난다. 이 콘솔에는 ‘Run Program’, ‘About’, 그리고 ‘Quit’ 같은 세 개의 메뉴가 나타나는데, ‘Run Program’ 메뉴를 실행하면 FTP를 실행할 수 있는 다이얼로그 화면이 그림 4와 같이 나타난다. 여기에 FTP 서버의 주소를 입력하고 ‘File for FTP Manipulation’의 파일 형태를 수정한 후 GETter/PUTter 옵션을 선택하면 된다. 이 때 FTP 된 파일을 목적지에서 삭제하고자 한다면 ‘Delete the copy after GET/PUT operation’ 박스에 체크해 주면 된다. 그리고 끝으로 ‘Run’ 버튼을 누르면 FTP 세션이 시작된다. FTP 세션이 시작되면 이 다이얼로그 박스는 ‘Close’ 버튼으로 닫아도 프로그램이 계속되며, 모든 FTP 진행 상황은 FTP 콘솔 윈도우로 출력이 된다. FTP 프로그램의 소스코드는 리스트 1과 같다.


리스트 1 : FTP 프로그램 소스코드
/* ************************************************************
프로그램 이름 : FTP 클라이언트 프로그램
저자 : 성철기
*************************************************************/
#include
#include // FTP 함수 불러오기
#include “resource.h”

/* ************* Protocol type definitions ****************** */

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
// 메인 윈도우 메시지 펌프
BOOL CALLBACK dlgProc (HWND, UINT, WPARAM, LPARAM) ;
// FTP 다이얼로그 메시지 펌프
BOOL CALLBACK aboutProc (HWND, UINT, WPARAM, LPARAM) ;
// About 다이얼로그 메시지 펌프
DWORD WINAPI ftpThread(LPVOID lpParam); // FTP 세션을 위한 스레드
void ToConsole(); // FTP 콘솔로 상태 보고를 위한 출력 코딩
void CloseAll(); // 윈도우 핸들 및 인터넷 연결 종결
HINTERNET GetFirstFile(HINTERNET hFtp);
// 인터넷의 FTP 서버에서 처음 보여지는 파일 가져오기
HANDLE GetWinFirstFile();
// 지역 디렉토리에서 첫 파일을 가져와서 PUT을 위한 준비를 한다

/********************** Global Variables **********************/
// 전역 변수들을 정의하고 초기화한다
//static int InetServiceType = INTERNET_SERVICE_FTP;
HINTERNET hInternet, hFtp, hFile;
HINSTANCE ghInst;
HANDLE ghwnd, gdlghwnd, hWinFile;
HWND hCheckBox, hRadioButton1, hRadioButton2;
int iCheckBox, iRadioButton1, iRadioButton2;
static TCHAR * szTitle = TEXT(“FTP 프로그램”);
static TCHAR szBuffer[80];
static RECT rectScroll ;
static WIN32_FIND_DATA finddata;
/* ************* Input Storage from a Dialog Box ************* */
// 다이얼로그 박스의 FTP 세션에 필요한 변수들을 초기화한다
static TCHAR FtpServerAddr[40] = “www.pserang.co.kr”;
static TCHAR UserName[40] = “anonymous”;
static TCHAR Password[40] = “”;
static TCHAR FilePattern[40] = “*.*”;
static int FtpPort = INTERNET_DEFAULT_FTP_PORT; //21

/************************** WinMain ***************************/
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
/* 지역 변수들을 정의하고 필요하다면 초기화한다 */
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
ghInst = hInstance;
ghwnd = hwnd;
/* 예제 프로그램을 등록하기 위한 준비를 갖춘다 */
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_WINLOGO) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground=(HBRUSH) GetStockObject(WHITE_BRUSH) ;
wndclass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
wndclass.lpszClassName = szTitle ;
// 프로그램을 등록한다
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT
(“본 프로그램은 윈도우 32 플랫폼에서 실행됩니다.”),
szTitle, MB_ICONERROR) ;
return 0 ;
}
// FTP 프로그램의 상태를 보고하게 될 윈도우를 열어 둔다
hwnd = CreateWindow (szTitle, TEXT (“Console for FTP Thread”),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL) ;
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
// 메인 윈도우의 메시지 펌프
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
}
return msg.wParam ;
}

/**************** 인터넷과 관련된 모든 핸들을 종료한다 ****************/
void CloseAll()
{
wsprintf(szBuffer, “Fail: Getting first file.
Exiting”);ToConsole();
InternetCloseHandle(hFile);
InternetCloseHandle(hFtp);
InternetCloseHandle(hInternet);
}

/* ****** 윈도우의 버퍼에서 받은 메시지를 화면에 출력한 후 재페인팅 한다 ****** */
void ToConsole()
{
InvalidateRect(ghwnd, NULL, FALSE);
}

/* ****** FTP의 GET에 사용될 첫 번째 파일을 가져오기 위해 준비한다 ****** */
HINTERNET GetFirstFile(HINTERNET hFtp)
{
wsprintf(szBuffer, “FTP서버 %s:%u의 현재 디렉토리에서 첫 번째 파일을 가져옴”,
FtpServerAddr,FtpPort);
ToConsole();
hFile = FtpFindFirstFile(hFtp, FilePattern,
&finddata, 0, 0);
return hFile;
}

/************ FTP의 PUT에 사용할 첫 번째 파일을 준비한다 ************* */
HANDLE GetWinFirstFile()
{
wsprintf(szBuffer, “Browsing for the first file in the current local directory.”);ToConsole();
hWinFile = FindFirstFile (FilePattern, &finddata);
return hWinFile;
}
/************** FTP 세션을 위해 스레드를 따로 마련해 둔다 **************/
DWORD WINAPI ftpThread(LPVOID lpParam)
{
BOOL bSuccess;
TCHAR prevFileName[80]=”test”;
BOOL endOfFileList;
/* FTP 다이얼로그 박스의 컨트롤 핸들을 준비한다 */
hCheckBox = GetDlgItem (gdlghwnd, IDC_CHECK1);
hRadioButton1 = GetDlgItem(gdlghwnd,IDC_RADIO1);
hRadioButton2 = GetDlgItem(gdlghwnd,IDC_RADIO2);
wsprintf(szBuffer, “인터넷을 열기 위한 준비를 한다...”);
ToConsole();
hInternet = InternetOpen(szTitle, INTERNET_OPEN_TYPE_
PRECONFIG, NULL,NULL, INTERNET_FLAG_ASYNC);
// 인터넷 준비가 실패하면 열린 핸들을 닫고 스레드를 종료한다
if(hInternet == NULL)
{
wsprintf(szBuffer, “Error (%i) InternetOpen.
Exiting Program ...”, GetLastError());
ToConsole();
CloseAll();
ExitThread(0);
return 0;
}
wsprintf(szBuffer, “done.”);ToConsole();

wsprintf(szBuffer, “Trying Ftp Open ...”); ToConsole();
// 인터넷의 FTP 연결을 시도한다
hFtp=InternetConnect(hInternet, FtpServerAddr, FtpPort,
UserName, Password, TERNET_SERVICE_FTP, 0, 0);
/* FTP 연결이 실패하면 기존의 윈도우 핸들들을 닫고 스레드를 종결한다 */
if(hFtp == NULL)
{
wsprintf(szBuffer, “Error (%i)
InternetConnection for FTP. Exiting ...”,
GetLastError()); ToConsole();
CloseAll();
ExitThread(0);
return 0;
}
/* 연결이 성공하면 메시지를 윈도우 화면으로 출력한다 */
wsprintf(szBuffer, “Success: Ftp Sessions
Open.”);ToConsole();
// 1초 동안 쉰다.
Sleep(1000);

/* FTP 다이얼로그 박스에서 꼭 필요한 컨트롤이 체크되었는지 확인하고 그 상태를
기억한다. Radio 버튼은 둘 중 하나는 반드시 선택하여야 하므로 whileloop을
통해 사용자가 체크할 때까지 기다린다 */
do
{
iRadioButton1 = SendMessage (hRadioButton1,
BM_GETCHECK, 0, 0);
iRadioButton2 = SendMessage (hRadioButton2,
BM_GETCHECK, 0, 0);

if ( (iRadioButton1 || iRadioButton2)
== BST_CHECKED)
{
break;
}
else
{
wsprintf(szBuffer, “GET 또는 PUT 중
하나를 꼭 선택하셔야 합니다.”);ToConsole();
Sleep(1000);
}
} while(1);

iCheckBox = SendMessage (hCheckBox, BM_GETCHECK, 0, 0);

/* 사용자가 GET을 선택하면 원격 FTP 서버에서 파일을 가져온다 */
if(iRadioButton1==BST_CHECKED)
{
hFile = GetFirstFile(hFtp);
if(hFile == NULL)
{
CloseAll();
ExitThread(0);
return 0;
}
}
/* PUT이 선택되었으면 지역 디렉토리의 파일을 원격 FTP 서버로 올린다 */
else if(iRadioButton2==BST_CHECKED)
{
hWinFile = GetWinFirstFile();
if(hWinFile == NULL)
{
CloseAll();
ExitThread(0);
return 0;
}
}

do
{ /* GET을 선택했을 때, 다음 파일을 원격 FTP 서버에서 가져온다 */
if(iRadioButton1)
{
wsprintf(szBuffer, “Getting a next file ...”);
ToConsole();
bSuccess = FtpGetFile (hFtp, finddata.cFileName,
finddata.cFileName, FALSE, FILE_ATTRIBUTE_NORMAL,
FTP_TRANSFER_TYPE_BINARY, 0);
if(bSuccess)
{
wsprintf(szBuffer, “Done “);ToConsole();
}
else
{
wsprintf(szBuffer, “Failed “);ToConsole();
}
Sleep(1000);
/* 만약 파일 지움 박스에 체크가 되었으면 지금 가져온 파일을 즉시 지워준다 */
if(iCheckBox && bSuccess)
{
wsprintf(szBuffer, “Deleting file (%s) at the local
drive.”, finddata.cFileName); ToConsole();
DeleteFile(finddata.cFileName);
}
}
/* PUT을 선택하였으면 원격 FTP 서버에서 다음 파일을 가져온다 */
else if(iRadioButton2)
{
wsprintf(szBuffer, “Putting %s “, finddata.cFileName);
ToConsole();
bSuccess = FtpPutFile(hFtp, finddata.cFileName,
finddata.cFileName, FTP_TRANSFER_TYPE_BINARY, 0);
if(bSuccess)
{
wsprintf(szBuffer, “Done “);ToConsole();
}
else
{
wsprintf(szBuffer, “Failed “);ToConsole();
}

Sleep(1000);
/* 다음 파일의 복사가 성공적으로 끝나고 파일 지움 박스가 체크되었으면
지금 복사한 파일을 지워준다 */
if(iCheckBox && bSuccess)
{
wsprintf(szBuffer, “Deleting file (%s) at %s.”,
finddata.cFileName, FtpServerAddr); ToConsole();
FtpDeleteFile(hFtp, finddata.cFileName);
}
}

Sleep(1000);

/* 더 이상 가져올 파일이 없으면 메시지를 화면으로 출력한다 */
if( lstrcmp(prevFileName, finddata.cFileName) ==0 )
{
wsprintf(szBuffer, “End of File List”); ToConsole();
endOfFileList=TRUE;;
}

lstrcpy(prevFileName, finddata.cFileName);
Sleep(1000);

/* 모든 파일의 복사가 끝나면 열었던 핸들들을 닫아준다. */
if(endOfFileList==TRUE)
{
endOfFileList=FALSE;

if(iRadioButton1)
{
InternetCloseHandle(hFile);
hFile = GetFirstFile(hFtp);
if(hFile == NULL)
{
wsprintf(szBuffer, “Fail: Getting the first file”);
}
}
else if(iRadioButton2)
{
CloseHandle(hWinFile);
hWinFile = GetWinFirstFile();
if(hWinFile == NULL)
{
wsprintf(szBuffer, “Fail: Getting the first file”);
}
}

Sleep(1000);
wsprintf(szBuffer, “One Cycle has been completed.”);
ToConsole();
}

else
{
if(iRadioButton1)
{
InternetFindNextFile (hFile, &finddata);
}
else if(iRadioButton2)
{
FindNextFile(hWinFile, &finddata);
}
}

Sleep(1000);

} while(1);
return 0;
}

/* ******* About 다이얼로그 메시지 엔진 ******* */

BOOL CALLBACK aboutProc (HWND hwnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
switch(message)
{
case WM_INITDIALOG:
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
EndDialog(hwnd, 0);
return TRUE;
}
}
return FALSE;
}

/* ******* FTP 다이얼로그 메시지 엔진 ******* */

BOOL CALLBACK dlgProc (HWND hwnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
TCHAR * param = “this is a test”;
DWORD dwCreationFlags=0;
DWORD dwThreadId;
HANDLE hThread;
TCHAR * temp = “test”;

gdlghwnd = hwnd;

switch(message)
{
/* 다이얼로그 박스가 열리기 직전에 필요한 초기화 작업을 한다 */
case WM_INITDIALOG:
SetDlgItemText(hwnd, IDC_ADDR, FtpServerAddr);
SetDlgItemText(hwnd, IDC_USER, UserName);
SetDlgItemText(hwnd, IDC_PASS, Password);
SetDlgItemText(hwnd, IDC_PATTERN, FilePattern);
SetDlgItemText(hwnd, IDC_PORT, “21”);
return TRUE;


case WM_COMMAND:
switch(LOWORD (wParam))
{
case IDC_CLOSE:
EndDialog(hwnd, 0);
return TRUE;

/* Run 버튼을 눌렀을 때 FTP 다이얼로그 박스에 입력된 데이터를 모아 FTP
세션을 시행한다 */
case IDC_RUN:
GetDlgItemText(hwnd, IDC_ADDR, FtpServerAddr,
lstrlen(FtpServerAddr)+1);
GetDlgItemText(hwnd, IDC_USER, UserName,
lstrlen(UserName)+1);
GetDlgItemText(hwnd, IDC_PASS, Password, lstrlen
(Password)+1);
GetDlgItemText(hwnd, IDC_PATTERN, FilePattern,
lstrlen(FilePattern)+1);
GetDlgItemText(hwnd, IDC_PORT, temp, lstrlen(temp)+1);
FtpPort = atoi(temp);

if(hInternet)
{
CloseAll();
}
/* FTP 세션을 위한 스레드를 하나 따로 생성해 준다 */
hThread = CreateThread(NULL,0, ftpThread, (LPVOID)
param, 0, &dwThreadId );
CloseHandle (hThread);

return TRUE;
}
}
return FALSE;
}

/* ******* Message Engine for Main Window ******* */

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,
LPARAM lParam)
{
static int cyClient;
static int cyChar;
static int cLines = 0;
static BOOL isNewLine;
static RECT rectAll;
HDC hdc ;
PAINTSTRUCT ps ;
TEXTMETRIC tm ;
ghwnd = hwnd;

switch (message)
{

case WM_COMMAND:

switch(LOWORD (wParam))
{
case IDC_QUIT:
CloseAll();
SendMessage(hwnd, WM_DESTROY, wParam, lParam);
return 0;
/* Run 메뉴를 선택했을 때 다이얼로그 박스를 화면으로 출력해 준다 */
case IDC_RUNPROGRAM:
DialogBox(ghInst, MAKEINTRESOURCE(IDD_DIALOG1), hwnd,
dlgProc);
InvalidateRect(hwnd, NULL, FALSE);
return 0;

case IDC_ABOUT:
DialogBox(ghInst, MAKEINTRESOURCE(IDD_DIALOG2), hwnd,
aboutProc);
return 0;
}

case WM_PAINT:

GetClientRect(hwnd,&rectAll);
cyClient = rectAll.bottom;
rectScroll = rectAll;

rectScroll.top = rectScroll.top+(cyChar*cLines);
hdc = BeginPaint (hwnd, &ps) ;
SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
SetBkMode (hdc, TRANSPARENT) ;

GetTextMetrics (hdc, &tm) ;
cyChar = tm.tmHeight ;
TextOut (hdc, 0, cyChar*cLines, szBuffer, lstrlen
(szBuffer)) ;
ZeroMemory(szBuffer, lstrlen(szBuffer));

cLines++;
EndPaint (hwnd, &ps) ;

if(cyChar*cLines+cyChar > cyClient)
{
isNewLine=TRUE;
cLines = 0;
}
if(isNewLine)
{
isNewLine=FALSE;
rectScroll.top = 0;
InvalidateRect(hwnd, &rectScroll, TRUE);
}

return 0 ;

case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
Posted by 장안동베짱e :

학교대사전(클릭)



- 추천사-

감히 아무도 할 수 없었던 일

이 책은 학교에서 접할 수 있는 여러 사물에 대한 정감과 소회를 명쾌한 분석과 재치있는 표현으로 승화시킨 책이다. 작가의 예리한 통찰력을 바탕으로 한 가히 학교의 진정한 백과사전이라 할 만하다.
언젠가 그 누군가가 했어야 할 일을 앞장서서 한 ㅇㅇ군에게 깊은 경외를 표하며 이 책에 조금이라도 보탬이 된 듯한 느낌이라 뿌듯하다
통쾌한 웃음을 선사할 뿐 아니라 학교나 다른 사물들에 대한 새로운 각도에의 접근과 그 안에서의 자신을 돌아볼 수 있도록 하는책, 이 책을 강력히 추천하는 바이다.
2004년 4월, ㅁㅁ고에서 감수 ㅇㅇㅇ

Posted by 장안동베짱e :

[CODE] <IMG class=ib onclick="if (confirm('이동하시겠습니까?\t')) location.href='이동할주소'" alt="" src="이미지"> <a onclick="if (confirm('이동하시겠습니까?\t')) location.href='이동할주소'" alt="">이동</a> [/CODE]





예제)


이동


Posted by 장안동베짱e :
출처 : http://wiki.kldp.org/wiki.php/LiveCD-HOWTO


(열기)
Posted by 장안동베짱e :

보러가기


요즘은 저작권개정안 무서워서 글도 함부러 못퍼겠다..;


Posted by 장안동베짱e :
1. 프로젝트유도
2. 비트맵에 배경그리기
* Resource Tab -> 프로젝트명에서 오른쪽 버튼 클릭 -> Insert -> Bitmap -> new버튼 클릭
글로 설명한 것들은 아래 그림과 같다.



*위의 과정의 하게되면 무슨 바둑판 같은 것이 나오게 된다. 그 바둑판같은 네모난 것은 안쪽에서는 포인터가 펜이나 아니면 드럼통같은 것인데 맨바깥부분으로 가면 그게 화살표로 바뀌는 부분이 있다. 그때 그 네모난 것을 더블클릭한다. (Bitmap Properties 나오게 하려고 하는 과정이다.)
그럼 아래과 같은 창이 나오는데 ID와 Width, 그리고 Height를 아래와 같이 설정해 준다.




네모난거 오른쪽 도구상자에서 페인트통 같은걸 선택해 주고 배경색을 빨간 색으로 준다. (그림판과 사용방법이 비슷함)
* 비트맵 2개더 추가(과정은 위와 동일함)
ID : IDB_BITMAPCar Width : 50 Height : 50
ID : IDB_BITMAPMonster Width : 50 Height : 50
처음에 비트맵은 자동차 그림을 그려주고 두 번째 비트맵은 괴물 그림을 그려준다.




3. Class View로 간다.

CDC m_BackDC; // back
CBitmap m_BackBit;

CDC m_CarDC; // car
CBitmap m_carBit;

CDC m_CarDC; // Mem
CBitmap m_MemBit;


4. [WM_CREATE]

int CA520View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
CClientDC dc(this);

// 물리적 메모리 준비
m_MemDC.CreateCompatibleDC(&dc);
m_MemBit.CreateCompatibleBitmap(&dc, 500, 500);
m_MemDC.SelectObject(&m_MemBit);

// 배경준비
m_BackDC.CreateCompatibleDC(&dc);
m_BackBit.LoadBitmap(IDB_BITMAPBack);
m_BackDC.SelectObject(&m_BackBit);

// Car 준비
m_CarDC.CreateCompatibleDC(&dc);
m_CarBit.LoadBitmap(IDB_BITMAPCar);
m_CarDC.SelectObject(&m_CarBit);

// 몬스터 준비
m_MonDC.CreateCompatibleDC(&dc);
m_MonBit.LoadBitmap(IDB_BITMAPMonster);
m_MonDC.SelectObject(&m_MonBit);


m_CarPos = CPoint(100, 100);

m_MemDC.BitBlt(0, 0, 500, 500, &m_BackDC, 0, 0, SRCCOPY);
m_MemDC.BitBlt(200, 200, 50, 50, &m_MonDC, 0, 0, SRCCOPY); // 몬스터
m_MemDC.BitBlt(m_CarPos.x, m_CarPos.y, 50, 50, &m_CarDC, 0, 0, SRCCOPY);

return 0;
}


5. [OnDraw]

void CA520View::OnDraw(CDC* pDC)
{
CA520Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
pDC->BitBlt(0, 0, 500, 500, &m_MemDC, 0, 0, SRCCOPY);
}


6. [WM_KEYDOWN]

void CA520View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
switch (nChar)
{
case VK_LEFT:
m_CarPos.x -= 10;
if(TRUE==uIsColl())
{
m_CarPos.x += 20;
}
break;
case VK_RIGHT:
m_CarPos.x += 10;
if(TRUE==uIsColl())
{
m_CarPos.x -= 20;
}
break;
case VK_UP:
m_CarPos.y -= 10;
if(TRUE==uIsColl())
{
m_CarPos.y += 20;
}
break;
case VK_DOWN:
m_CarPos.y += 10;
if(TRUE==uIsColl())
{
m_CarPos.y -= 20;
}
break;
default:
break;
}

m_MemDC.BitBlt(0, 0, 500, 500, &m_BackDC, 0, 0, SRCCOPY);
m_MemDC.BitBlt(200, 200, 50, 50, &m_MonDC, 0, 0, SRCCOPY); // 몬스터
m_MemDC.BitBlt(m_CarPos.x, m_CarPos.y, 50, 50, &m_CarDC, 0, 0, SRCCOPY);

m_MemDC.MoveTo(0,0); // Line
m_MemDC.LineTo(m_CarPos);

m_MemDC.TextOut(100, 100, "Press any key"); // Text



CRect rc(0, 0, 500, 500);
InvalidateRect(&rc, FALSE);


CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
Posted by 장안동베짱e :
(::저작권법 16일시행 네티즌들 대혼선::)

‘좋아하는 노래 가사를 인터넷 홈페이지에 올려놓는 것도 저작 권법 위반.’ 오는 16일 저작권법 개정안 시행을 앞두고 네티즌들이 크게 반 발하고 있다. 지금까지는 저작물의 주요 권리인 전송권(저작물을 일반인들이 송신하거나 제공하는 권리)을 저작권자인 작사·작 곡자에게만 인정해 왔지만 저작권법 개정안이 시행되면 가수와 연주자, 음반제작자에게까지 전송권을 확대, 인정하게 된다.
이처럼 저작물의 전송권이 확대, 인정되면 앞으로 개인 이용자의 저작권법 위반행위에 대한 단속이 크게 강화되고 소송도 급증할 것으로 보인다. 여기다가 일부 네티즌들이 이번 개정안 시행으 로 개인홈페이지 등에 음악파일을 올려놓는 것이 불법행위가 됐 다는 잘못된 정보까지 나돌면서 네티즌들의 반발은 더욱 거세지 고 있다. 개인 홈페이지나 블로그에 올려놓는 음악파일의 경우, 현 행 법으로도 저작권 침해로 인정된다. 인터넷 포털사이트 ‘네이 버’ 게시판에 글을 올린 한 네티즌은 “(이번 법개정은) 결국 블로그나 미니홈피 서비스를 하는 포털사이트나 음반사 관계자들 만 배불리자는 속셈”이라며 목소리를 높였다.

또 다른 네티즌은 “개인 홈페이지까지 단속하는 것은 전국민을 범법자로 만들겠다는 것”이라고 주장했다. 실제로 한국 음원제 작자협회 윤성오 법무실장은 “이번 법 개정을 계기로 상업 사이 트는 물론 개인 홈페이지와 블로그에 대한 무단 저작물 도용 행 위에 대해서도 지속적인 단속을 해나갈 계획”이라며 “네티즌들 의 저작권에 대한 인식이 여전히 낮은 게 문제”라고 말했다.

한편 주무부처인 문화관광부측은 네티즌들의 반발에 적잖이 당황 해하는 눈치다. 저작권법 개정안 시행 이전에도 개인 홈페이지와 블로그의 저작물 무단 인용은 저작권법 위반이었다는게 문광부 측의 설명. 문광부에 따르면 ▲저작권자의 허락없이 인터넷상에 음악파일을 올려놓는 행위 ▲구입한 CD로부터 음원(MP3 파일 등) 을 추출해 홈페이지에 올려놓는 행위 ▲다른 사이트 올려놓은 음 악파일 소스를 인터넷상에 링크시키는 행위 ▲노래의 가사를 인 터넷상에 올려놓는 행위 등은 모두 저작권법 침해에 해당한다.

그러나 자신이 구입한 CD로부터 음원을 추출하는 행위 자체는 저 작권 침해 행위가 아니다.

이동현기자 offramp@
Posted by 장안동베짱e :
10일 영국에서 출간된 '게으름의 기쁨(The Joy of Laziness)'이라는 신간이 논란을 일으키고 있다. 게을러야 오래 산다는 것이 책의 주장이기 때문이다.
독일 풀다 대학에서 건강 과학을 가르치다 은퇴한 페터 액스트 박사와 그의 딸이 집필한 이 책은 무리한 운동보다는 나태한 생활이 장수의 비결이라고 강조한다.

왜냐하면 "삶의 에너지"가 한정되어 있기 때문이다. 그 에너지를 소비하는 속도가 수명을 결정하는데 빨리 소비할수록 더 빨리 사망한다는 것이 저자들의 설명이다. 비유하자면 인간은 충전이 안 되는 일회용 배터리와 같은 존재인 것이다.

반대로 격렬한 운동을 할수록 프리 래디컬(free radicals)라는 유해 산소 성분이 많이 생겨 오히려 노화를 촉진하게 된다고 저자들은 경고한다.

또한 저자들은 달리기 등 과격한 운동을 하면 혈압을 상승시켜 심장과 동맥에 손상을 입힐 호르몬이 분비된다는 지적도 덧붙인다. 대신 천천히 걷는 운동을 하면서 저 탄수화물과 고 단백질 음식을 먹으면 건강한 체형을 유지하는 것이 충분히 가능하다고.

기존 의학계에서는 액스터 박사의 주장에 대한 격렬히 비판하고 있다. 터무니없는 이론이라는 것이다. 하루 30분 내외의 운동은 심장 혈관의 기능과 면역력을 높일 뿐 아니라, 건강한 마음을 유지하는데 필수적이라는 것.

팝뉴스 이고원 기자
Posted by 장안동베짱e :
인천에서 비행기로 불과 1시간 30분 거리인 중국 상하이에 가보면 우리가 우물 안의 개구리 아닌가 하는 생각에 한숨이 절로 나온다. 큰 강과 바다를 끼고 눈 부시게 발전하는 포동지역은 서울과 비교가 되지 않을 정도로 활기가 넘친다. 기업을 도와주려는 중앙정부의 열의 또한 한국과 비교된다. 이곳에 주재하는 어느 대기업 현지법인 사장은 한국의 동북아허브계획에 대해 “어디서 허브라 는 말은 들어가지고…”라며 이젠 거의 끝난 게임이라고 단언했다.
수도이전에 대한 헌법재판소의 결정이 잘된 일인지 아닌지 아직 판단하기는 이 르다. 하지만 수도이전 추진과정을 보면 답답하기 짝이 없다. 국토 균형발전과 지방분권이 물론 중요하지만 선진국이 되려면 서울이 동아시아 중심도시로서 베이징, 상하이, 도쿄, 홍콩 등과 경쟁해야 한다. 좁은 국토에서 수도권과 비 수도권으로 나눠 싸우는 사이 외국 경쟁도시들은 세계를 향해 내달리고 있다. 수도이전보다 더 중요한 일은 서울을 어떻게 하면 한국의 대표선수로 키우느냐 다.

얼마 전 파이낸셜타임스(FT)에는 ‘어떻게 하버드가 앞서게 됐나’라는 제목의 커버스토리가 실렸다. 이 신문은 세계 최고의 대학이던 영국 옥스포드는 모든 대학을 똑같이 지원해야 한다는 평등주의 때문에 하강곡선을 그린 반면 미국 하버드는 재원마련, 최고의 학생, 최상의 교수진을 확보하기 위해 치열한 경쟁 을 벌였고, 이 경쟁이 미국대학들을 세계 최고로 끌어올렸다고 분석했다. 미국 대학의 캠퍼스를 걸으면 밤새 불이 켜져 있는데 옥스포드에는 식탁에나 불이 켜져 있을 정도란다. FT는 “가난한 집 자녀도 최고의 교육을 받을 수 있는 평 등주의적 꿈을 실현한 것은 하버드의 경쟁적인 시장제도이지, 국가가 아니다” 라고 지적했다.

요즘 논란이 되고 있는 대입 개선안도 그렇다. 조선시대처럼 대문을 걸어 잠그 고 우리끼리 오손도손 살 수 있다면 서울대학을 없애도 되고 로또식으로 대학 신입생을 뽑아도 된다. 하지만 한국대학의 경쟁상대는 미국의 하버드대, 일본 의 동경대, 중국의 베이징대나 칭화대이다. 서울대의 국제경쟁력은 전세계 대 학 중 고작 150위권 정도(중국 상하이 자오퉁대 조사)에 불과하다. 서울대 위 기는 국가 장래를 짊어질 엘리트육성의 위험신호인 동시에 장기적으로 국가경 쟁력 추락으로 이어질 것이다.

평등의 원칙은 ‘같은 것은 같게, 다른 것은 다르게’대우하는 것이다. 같은 것을 다르게 대우하는 것도 잘못된 일이지만 다른 것을 같게 취급하는 경우에 도 명백히 차별이며 사회정의에 역행한다. 미래학자 앨빈 토플러는 한국은 교 육부터 혁명을 해야 한다고 일침을 놓은 적이 있다. 답은 매일경제신문이 2000 년 5월 발표한 학습혁명보고서에 나와 있다. 이 보고서는 창조적 인재국가가 되기 위해서는 교육(Teaching)이 아닌 학습(Learning) 중심, 시장주의(국가통 제로부터 학교독립), 기업이 교육주체로 참여하고 교육부와 노동부를 통·폐합 시켜 평생학습고용부를 신설하는 내용을 담고 있다.

한국이 선진국이 되려면 각 부문에서 세계 일류와 경쟁해서 이겨야 한다. 삼성 전자, 포스코, 현대자동차, 현대중공업, SK텔레콤 등 대표선수들이 세계 1위가 되면 그게 바로 선진국이다. 세상이 광속으로 빠르게 바뀌는데 개혁이라는 미 명으로 좁은 땅에서 도토리 키재기 하듯 왈가왈부하는 것은 코미디적인 발상이 다.

지금처럼 1등을 끌어내리는 평준화로는 미래가 없다. 사회주의가 우월한 이념 이지만 나라 살림이 거덜난 이유는 경쟁없이 평등 타령만 했기 때문이다. 한국 은 소득 2만달러 달성은커녕 자꾸 못사는 쪽으로 달려가고 있다. 지뢰밭보다 더 무서운 평등화의 덫에서 탈출하는 길 외에는 대안이 없어 보인다.

<윤영걸 주간국장>



━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
전적으로 동감한다.
자본주의 국가에서 중고등학교, 대학, 기업들이 평등하게 대우를 받는다는건 말도 안된다.
평등 보다는 능력에 맞는 대우와 지원이 필요하다.
그리고 평등이란 말의 의미도 그런곳에 갖다붙일 성격의 단어가 되진 않는다.
그것에 평등이란 말을 같다 붙이는 행위는 똑같은 시험치르고 어떤 놈은 10개 다 맞고 어떤 놈은 5개밖에 안맞았는데 '평등하게 둘다 100점 달라'라고 주장하는 것과 다르지 않다.

애시당초 처지는 놈들은 마이너리그로, 잘뛰는놈은 올림픽에 출전 시켜야 한다.
처지는 놈에게 평등하게 올림픽출전권을 줄수는 없다.

그게 싫다면 공산주의 국가로 가던가..
그것도 싫다면 죽기 살기로 뛰어라 !

『세상은 원래 불공평하다.. 하지만 노력으로 그차이를 메꿀뿐이다..』
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Posted by 장안동베짱e :
10대 천재 소년이 난공불락의 마이크로소프트(MS) 왕국을 무너뜨릴 수 있을까.

영국 일간 더 타임스는 4일 미국 마이애미에 사는 블레이크 로스(19)가 새로운 무료 인터넷브라우저를 고안, 빌 게이츠 MS 회장을 악몽으로 몰아넣고 있다고 소개했다.

로스가 만들어낸 브라우저 ‘파이어폭스’는 지난해 11월 공개된 후 약 1천5백만명이 다운로드할 만큼 인기를 끌고 있다. 웹브라우저 시장을 독점하다시피 해온 ‘MS 인터넷 익스플로러’의 위상을 위협하고 있다는 게 업계의 평가다.

업계 분석가들은 파이어폭스의 장점으로 ▲속도가 빠르고 ▲창 하나에 여러 사이트를 탭 형식으로 띄울 수 있으며 ▲바이러스·광고 차단 기능이 우수한 점 등을 들고 있다. 파이어폭스는 특히 인터넷상에서 무료로 구할 수 있고 소스코드와 기술이 공개된 ‘오픈 소스’ 소프트웨어다.

‘소프트웨어의 천재’로 불리는 로스는 피아노를 잘 치고 글솜씨도 빼어나다. 그의 어머니는 “이 아이는 무엇을 하든 잘 한다”고 자랑스러워 했다. 로스는 7살 때부터 컴퓨터 게임에 빠졌고 10살 때 자신의 웹사이트를 만들었다.

인생의 전기를 맞은 것은 14살 때 브라우저 업체인 넷스케이프사에서 인턴십을 하게 되면서다. 여기서 그는 오픈 소스 운동을 주도하는 비영리단체인 모질라 재단을 소개받았다.

모질라는 당시 익스플로러에 대항하는 대안브라우저의 개발을 시도하고 있었다. 로스와 그의 친구인 데이비드 하얏트도 이 작업에 합류, 사용자에게 초점을 맞춘 브라우저 개발에 들어갔다. 시험용 프로젝트로 나온 ‘작품’이 파이어폭스였다.

로스·하얏트 콤비는 대학에 진학하는 바람에 파이어폭스의 완성을 보지는 못했다. 하지만 모질라는 이들을 작업과정에서 획기적 돌파구를 연 ‘위대한 공헌자’로 대우하고 있다.

현재 스탠포드대에서 컴퓨터공학을 전공중인 로스는 아무런 물질적 보상도 없이 오픈 소스 소프트웨어 개발에 ‘자원봉사’하고 있다.

〈김민아기자 makim@kyunghyang.com〉

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
파이어 폭스 나온지가 언젠데 이난리야.. ㅡ,ㅡa;;

아무튼..개발한 녀석이 10대라니 좀 의외긴 해..
19살이면... 우리나라 나이로 20~21살정도 됐나..?
짜아식, 쫌 하네~ 흣 ^^

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Posted by 장안동베짱e :

[CODE] #define SCHAR_MIN (-128) /* minimum signed char value */ #define SCHAR_MAX 127 /* maximum signed char value */ #define SHRT_MIN (-32768) /* minimum (signed) short value */ #define SHRT_MAX 32767 /* maximum (signed) short value */ #define USHRT_MAX 0xffff /* maximum unsigned short value */ #define INT_MIN (-2147483647 - 1) /* minimum (signed) int value */ #define INT_MAX 2147483647 /* maximum (signed) int value */ #define UINT_MAX 0xffffffff /* maximum unsigned int value */ #define LONG_MIN (-2147483647L - 1) /* minimum (signed) long value */ #define LONG_MAX 2147483647L /* maximum (signed) long value */ #define ULONG_MAX 0xffffffffUL /* maximum unsigned long value */ [/CODE]


흠.. 외우고 있기엔 좀 거시기해스..



Posted by 장안동베짱e :