달력

072010  이전 다음

'2007/소프트웨어 설계'에 해당되는 글 33건

  1. 2007/12/23 체크리스트...
  2. 2007/12/04 유스케이스는 과연 유용한가? (6)
  3. 2007/10/01 JSRs aren't appropriate for classlibraries 를 읽고
  4. 2007/09/28 프로그래밍 과정에서 작명에 관하여 (2)
  5. 2007/09/17 개발자 사이에서도 사용하는 모델/언어가 다르다 (4)
  6. 2007/09/06 요구사항 관련 회의를 묘사하는 가상 상황 2 (3)
  7. 2007/07/25 Flex 적용 이슈
  8. 2007/07/13 언제 설계를 끝내야 할까? (1)
  9. 2007/07/13 모델링 도구와 공동작업 (4)
  10. 2007/07/12 데이타가 아닌 데이터
  11. 2007/07/11 IBM RSA(Rational Software Architect) 관련 트러블슈팅 일지 (4)
  12. 2007/06/27 산만한 글로 주장하는 단일 모델이 요체다~ (2)
  13. 2007/06/27 OpenJPA 부상하려나
  14. 2007/06/26 역공학 무용론(?) (2)
  15. 2007/06/26 객체 모델링 과정에서 참조할 수 있는 대비구도 메타포어 (1)
  16. 2007/06/26 Rich Internet Application 간단 요약
  17. 2007/06/26 Un-DDD/MDD (2)
  18. 2007/04/26 기묘의 RoR 세미나에서 느낀 점 (6)
  19. 2007/04/19 확실히 우리나라가 UI에 민감한건가? (4)
  20. 2007/04/08 Microsoft와 Ajax에 관련된 흥미로운 사실 메모 (2)
  21. 2007/03/28 태그 파일을 활용하여 HTML 내용 캡슐화하기-시작편(Getting Started)
  22. 2007/03/28 14가지 어자일 프랙티스(Agile Practices) Reloaded (하)
  23. 2007/03/27 14가지 어자일 프랙티스(Agile Practices) Reloaded (상)
  24. 2007/03/22 프레임워크의 인터페이스(API) (1)
  25. 2007/03/21 인터페이스에 대한 다른 선호, 그리고 이를 위한 대응
  26. 2007/02/23 네임스페이스(Namespace)와 XML 네임스페이스
  27. 2007/02/15 @Transient 애노테이션 (2)
  28. 2007/02/15 @Id와 @GeneratedValue 애노테이션
  29. 2007/02/15 @Entity Annotation
  30. 2007/02/15 정수형 타입의 범위
사용자 삽입 이미지

The Power of Checklists를 타고 가서 본 그림이다. 백 마디 말보다 한 장의 그림이 강한 인상을 주는 경우다. 막강한 개발 도구와 복잡한 절차를 따르다보면 종종 해야 할 일에 대한 큰 그림을 잊을 수도 있다. 할 일이 많아지고 시간을 쪼개쓸 때는 종종 포스트잇이 어떠한 시간 관리 도구보다 유용할 때가 있다. 종종 잘 정리하려다 보면 핵심만 간결하게 요약하는 것이 어려울 때가 많다.

그림 출처: http://www.newyorker.com/reporting/2007/12/10/071210fa_fact_gawande
Posted by 영회
유스케이스에 대한 고객 검토를 하면서 예상대로 대혼란이 일어났다. 개발자(분석가)들에게 유스케이스 개념을 설명하는 것도 쉬운 일이 아니다. 하물며 현업 고객에게 타원 몇 개 덩그러니 그려놓고 업무 범위를 모두 포괄하는 것으로 보이냐고 물으면...

고객은 오히려 비즈니스 프로세스를 그린 그림은 쉽게 생각했다. 메뉴 구조도를 보여줘도 쉽게 애플리케이션 기능 구조를 파악한다. 메뉴 레벨 2단계를 유스케이스로 잡으라는 어처구니 없는 가이드를 비웃은 적이 있다. 유스케이스는 메뉴로 분할할 수 있는 것이 아니다. 기초도 모르는 사람이 전문가랍시고 가이드 한 것일 수도 있지만, 한편으로는 현장 상황을 반영한 어쩔 수 없는 자구책인지도 모른다.

사용자 삽입 이미지

위 그림은 유스케이스 이해가 어려운 이유를 단적으로 보여준다. 현행 업무가 시스템 도입으로 인해 변모하는 모습(TO-BE)를 담고 있어 애초부터 고객들에게 시스템에 대한 이해에 기반한 상상력을 요구한다. 다시 말해서, 지금은 이렇게 일하고 있는데 앞으로는 다르게 일할 것이라고... 프로토타입 화면도 보지 않고 과연 고객이 이를 알 수 있을까?

필자 스스로도 현재 사이트에서 족보에도 없는 산출물을 만들고 있다. 적어도 국내 SI 현장에선 아직도 개발 과정의 산출물을 넘어서지 못하는 모델이 대부분이다.(그나마도 못하는 경우가 더 많은 것으로 짐작한다.) 고객에게 물었다. 유지보수할 때 모델을 보세요? 고객이 유스케이스 명세를 보나요? 물론 '안본다'가 대답이다. 볼 수 있는 산출물을 만들면서 표준 방법론이라는 틀을 어기지 않으려다보니 족보에 없는 변종을 만들어냈다.

그렇다면 유스케이스가 개발자에게는 유용한가? 비슷한 고민을 하면서 내놓은 해결책을 책으로 발행한 것이 있었다. 거짓말처럼 내가 글을 쓰고 난 후, 10분도 안되서 지인이 알려준 책 서두에 나온 그림을 캡쳐해놓는다.

사용자 삽입 이미지

출처: Use Case Driven Object Modeling with UML: Theory and Practice by Doug Rosenberg and Matt Stephens


Posted by 영회
JSRs aren't appropriate for classlibraries 라는 글은 짧지만 흥미롭다.

저자의 의도와 관계 없이
JSR이 준수하는 절차와 오픈소스 개발 방식의 대비가
마치 중앙집중적 통제 방식과 다자가 참여하는 자율적인 결정 방식으로 비춰져 흥미로웠다.

내용은 하나씩 살펴 보면
먼저 품질에 있어서는 JSR은 강력한 통제를 받는 덕에 항상 높은 수준을 보장하지만
오픈소스는 들쭉날쭉이다. 그러나, 혁신적인 것들은 대개 자율적인 분위기에서 나오기 마련이다.
저자인 swankjesse 는  훌륭한 오픈소스들이 JSR로 옮겨지는(porting or reinventing) 추세가 있다고 전한다.
두드러지게는 JPA의 경우는 Hibernate의 포팅으로 비춰진다.
Doug Lea의 라이브러리는 고스란히 Java5 에 포함되기도 했다.

여기서 한가지 흥미로운 사실은 다음번 척도인 API의 안정성/부동성 측면을 보면 다음과 같은 글을 볼 수 있다.
we're permanently stuck with every bad design decision released in a JDK
로드 존슨 등이 맹렬하게 비난하는 JDBC나 JavaMail의 경우는
저자에 논리에 따르면 품질이 매우 좋아야 한다.
적어도 JDBC는 최초에는 훌륭한 API가 아니었을까 싶다.
시간이 지나면서 변모되어야 했는데 그렇지 못해서 오명을 썼을 뿐이다.
Published Interface는 본질적으로 변경이 어렵다.
그런데다가 JDK를 이루는 API는 파급효과가 크게 때문에 더욱 그러할 것이다.

API 선택이라는 척도를 보면
JSR과 오픈소스의 비교는 계획경제와 시장경제의 비교와 같다.
그 내용은 닷넷 초창기에 닷넷과 J2EE를 비교하던 썬의 글과 닮아 있다.

궁극적으로는 오픈소스의 방식이 남고, JCP의 절차는 도태될 것 같다.
시장경제가 남은 것처럼
하지만, 시장경제도 전형을 유지하지 않고 변모하고 발전한 것처럼
JCP가 오픈소스 스타일을 흡수해서 명맥을 이어갈지도 모를 일이지만
사회의 요구를 충족하지 못하면 JCP가 모두를 위한 표준을 만드는 지금의 입지는 잃게 될 것이다.
이미 Spring이 과거 EJB의 위상을 차지하여 de facto 표준 역할을 하고 있는 것이 하나의 현상이다.
Log4J가 JCP와 관계 없지만, JDK 수준으로 쓰이는 것도 그 예가 된다.

역시 변하지 않으면 도태된다. 열심히 하자. ^^
Posted by 영회
대형 SI 프로젝트의 경우 경험있는 개발자들에게 찾아볼 수 있는 공통점은 개발에 들어가기 전에 작명 지침을 받고자 한다는 점이다. 작명은 생각보다 간단한 문제는 아니다. 개인적으로는 가장 중요한 설계 결정 중에 하나라고 생각한다.

종종 그다지 바람직하지 않은 방향으로 작명의 기준이 정해지는 것을 볼 때 화가 나기도 한다. 지금보다 널 노련했을때는 대놓고 화를 냈으니까. 얼마 전에도 가능하면 업무 용어를 번역한 단어를 가능하면 그대로 쓰자는 지침에 대해 약어를 기준으로 해야 한다는 개발자를 만났다. 경험이 많은 개발자였는데 권위에 의존해서 다음과 같이 발언해서 감정을 통제하지 못하고 직격탄을 날리기도 했다:

'S모 전자에서도 약자를 기준으로 한다'
'10년 동안 개발하면서 그런 경우는 본 적이 없다'

나를 포함해 대부분은 변하기 싫어한다. 그리고, 미래를 위해 더 나은 준비를 하려다 보면 현재에 희생을 요구하는 법이다. 종종 약어를 쓰면 생산성이 떨어진다고 말하는 이들도 있는데 이클립스와 같은 IDE를 쓰지 않는 경우나 통용되는 말이다. (2006/12/20 - [자바 프로그래밍/이클립스 노하우] - 적절한 작명을 손쉽게 할 수 있는 바람직한 습관
참조)

사람의 습성에 관계된 문제 외에도 작명의 어려움은 근본적인 원인이 하나 더 있다. 월간마소에 기고할 DDD 관련 기사를 영문으로 작성해야 하는 프로그램과 우리말 사이의 변환 문제가 얼마나 부담스러운 일인지를 돌아보게 되었다. 실제로 프로젝트를 할 때 분석 모델을 구성하는 클래스의 이름을 설계 클래스로 바꾸는 일은 상당한 공수를 요한다. 게다가 상당한 공수를 요할만큼 중요한 일이기도 하다. 하지만, 노력에 비해 좋은 결과가 나오지는 못한다. 무엇보다 마치 DSL처럼 업무를 잘 드러내는 단어가 쓰여야 한다.

그러나, 대부분의 업체가 업무 용어에 대한 영어대역어를 구비하고 있지는 않다. 고객이 모든 용어를 정해주지도 않는다. 그러다 보니 개발자들이 네OO를 뒤져서 작명을 한다. 그러다 보면 자연스럽게 오역이 일어나기 마련이고, 가독성을 높이려는 시도는 퇴색된다.
자바가 요구하는 일종의 관습을 알아야 하기 때문이다.

개발자와 고객이 같은 언어(Ubiquitous Language)를 쓰도록 유도하거나 같은 공간에 머물게 하는 것(XP에서 개발자를 팀원으로 하라는 지침) 모두는 결국 고객과 개발자 사이의 의사소통이 제대로 되게 함이다. 작명의 어려움은 물론 영문화의 문제도 있지만, 궁극은 고객과 개발자의 소통이 어렵다는 것을 보여주는 반증이기도 하다.

관련 글:
월간마소에 기고할 DDD 관련 기사의 모티브가 담긴 글: 2007/06/27 - [소프트웨어 설계/소프트웨어 모델링] - 산만한 글로 주장하는 단일 모델이 요체다~
DSL과 작명이 무슨 관계냐?:  2006/10/01 - [소프트웨어 설계/인터페이스 설계] - 좋은 작명은 internal DSL의 시작

more..


Posted by 영회
사용자 삽입 이미지

마감을 코앞에 두고 마소 10월호에 기고하는 글을 작성하면서 그린 그림
현재 참여하는 프로젝트에서 H모 과장님에게 도메인 모델을 설명하는 과정에서 그리게 된 메모를 파워포인트로 작성한 것이다.

사용자 삽입 이미지

DDD/MDD를 통해서 의사소통이 효율화 되고
모델이 정보를 하나로 모아주는 역할을 해준다는 것을 추상화 한 그림

Posted by 영회
요구사항 관련 회의를 묘사하는 가상 상황에 이어 9개월만에 두 번째 연재글을 올린다.1

이 글은 순전히 가상상황임을 알려드립니다. PM에게서 업무분석팀을 총괄을 맡게 된 안과장은 궁리 끝에 컨설팅을 받아 보기로 한다. 이대로 시간만 쓰는 것보단 돈을 쓰는 게 났다 싶었는지.. ㅡㅡ;

그런데 요구분석 전문가인 고선생이 제시하는 방안에 대해서 얘기했다. 초반에 화면 디자이너를 많이 투입해서 변경이 가해지더라도 현실감 있는 프로토타입을 만드는 것을 주요 전략으로 삼으라는 것이었다.  솔깃한 이야기였고, 머릿속으로 화면 디자이너를 어떻게 더 소싱하나 고민중인데... 경험많은 개발자 출신 업무분석가 이대리가 쌍수를 들고 반대하는 것이었다.

이대리: 초반부터 화면이 이렇게 빨리 나오면 뒤에 남은 개발 기간에 계속 고쳐 달라고 해요.
고선생: 그게 문제인가요?
이대리: ...
이대리: (한 템포 쉬고) 화면 프로토타입을 보여주면 기능이나 데이터 보다는 사소한 것을 요구하기 마련이에요.

중요한 역할을 하고 있는 이대리가 워낙 강경하게 반대를 해서 중립적인 입장에서 생각해보려고 잠시 물러서봤다. 글쎄, 여전히 명확하게 정리가 되지 않았다.

그러던 어느날...
안과장: 이대리쪽은 요구사항이 너무 불명확하게 정리되었는데
이대리: 고객들이 아무도 결정을 하려고 하지 않아요.
안과장: 그렇다고 마냥 기다릴 수는 없지 않는가?
이대리: 그건 그렇죠.

안과장은 점점 이대리 말에 대해 신뢰를 잃기 시작했다.
그러던 어느날 안과장의 머리는 명확해지고 말았다.

안과장: 아니, ERD가 아직도 안나왔어?
이대리: 데이터베이스가 안나와요? 그 사람들도 전부 화면이 나오길 기다리고 있어요.
이대리: 화면에서 나오는 데이터 요건을 수집하려구요.
안과장: 그야 당연히 ...

한 조각의 이야기만 듣고 보면 그럴싸해보이는 반대논리를 자주 만날 수 있다.
가장 쉬운 생산 방법 중에 하나가 남이 무언가 내놓으면 반대하는 것이다.

(결론은 삼천포로...)

스스로도 갑자기 반대하는 마음이 잃어날 때
논리로 그 마음을 겹겹히 애워싸기 전에...
왜 반대하고 있는지 알 수 있다면.. 아마 우린 자신의 본질을 발견할 것이다. ^^

  1. 전에 써둔 글을 읽게 하려는 얇팍한 의도가 담긴 사족 [본문으로]
Posted by 영회
Flex 적용 프로젝트의 이슈라는 짧고 유용한 글이 올라왔다. Flex를 적용해서 프로젝트를 성공시켜야 하는 입장에서 이슈를 나열하고 있다. Flex 등의 X-internet은 엔터프라이즈 환경의 RIA 구현 플랫폼의 선구자 역할을 하고 있기 때문에 많은 도전을 받기 마련이다. Flex에 대한 홍보성 자료들은 최근 꽤나 많이 보이지만 실무자에게 있어서는 Flex 적용 프로젝트의 이슈와 같은 글이 훨씬 유용하다.
Posted by 영회
TAG flex
켄트 벡이 정의한 단순한 디자인/설계의 네 가지 규칙. OAOO(Once And Only Once)
  • 모든 테스트를 실행할 수 있어야 한다.(Runs all the tests.)
  • 중복된 로직이 없어야 한다. 병렬 클래스 계층구조와 같은 숨은 중복에 주의해야 한다.(Has no duplicated logic. Be wary of hidden duplication like parallel class hierarchies.)
  • 프로그래머들에게 중요한 모든 의도를 알려줄 수 있어야 한다.(States every intention important to the programmers.)
  • 클래스와 메서드는 가능한 적어야 한다.(Has the fewest possible classes and methods.)

XP 책에 나오는 것을 리팩터링 워크북에서 인용하고 다시 여기 인용한다.
유난히 모든이라는 수식어가 밟혀서 강조해본다.

코딩하기 전에 암기해볼까? 국민의례처럼...^^



리팩터링 워크북
윌리엄 웨이크 지음,
장시형.송치형 옮김/인사이트
Posted by 영회
프로젝트를 수행하면 동일한 모델을 가지고 공동작업을 하기 마련이다. 형상관리도구의 이력관리 기능과 모델 공유 기능을 활용하는 것이 유용할 수도 있지만 그렇지 않을 수도 있다. 팀에서 실제로 실행 가능한 정책이 없거나 모델 공유 기능에 익숙하지 않으면 낭패를 보는 경우도 비일비재하다.

모처에서 역량을 갖춘 담당자나 경험도 없이 상용형상관리도구로 모델을 공유한다는 정책을 세우는 바람에 고생하는 모습을 간적적으로 경험한 일이 있다. 운영체제의 권한과 형상관리도구의 권한이 강력하게 결부(tightly coupled)되어 있어 모델을 관리할 사람이 운영체제에도 빠삭해야 하는 황당한 현상이 벌어졌다. 형상관리자와 모델관리자가 풍부하게 지원된다면 몰라도 (나는 충분히 이상론적인 현실주의자이지만) 현실은 교과서에 우선한다. ^^

오전에 RSA에서 CVS를 활용하여 병합을 하는 와중에 4시간을 날렸다. 실제 업무 손실 범위는 그 이상이다. RSA에서 CVS 동기화를 실행할때 서버의 모델 파일과 로컬의 모델 파일의 차이가 크면 최고사양의 PC도 견뎌내지 못했다. (최신 패치를 했으면 달라졌을지 모르지만)

모델 파일의 사이즈가 1,2 메가일때는 큰 문제가 없었는데 그 이상이 되자 동기화는 골치거리였다. 피해를 본 모델러가 속출하다보니 결국은 로컬에 작업만 하고 나를 기다렸다. 당연히 로컬의 파일과 서버와의 차이가 커지기 시작했고, 내가 동기화를 시도하면 충돌이 커져서 병합이 쉽지 않았다.

순차적으로 정보가 기록되는 소스코드와 달리 모델은 렌더링한 그림들이 XML에 모델러가 인지하지 못하는 형태로 기록된다. 그러다 보니 병합이 여간 어려운 일이 아니다.

예전에 Rose를 쓰던 시절에는 unit화 해서 CAT파일로 쪼개서 개별 작업자가 관리하도록 하는 정책을 썼다. RSA에서도 모델 fragment를 만들 수 있었다. 하지만, 이렇게 물리적으로 분할하여 관리하면 공동으로 사용하는 클래스를 중복해서 만들곤 하는 문제가 발생했다.

RSA의 모델 fragment가 로즈의 unit에 비해서는 좀 불편한 느낌이라 CVS를 썼다. 모델이 더 커지는 상황에서는 협업이 매우 힘들 것으로 짐작된다. 가능한 모델을 쪼개서 관리하거나 fragment와 CVS를 혼용하는 방법으로 최적의 정책을 찾아봐야 할 듯 하다. 이러한 정책 수립의 어려움은 혼자서는 시뮬레이션하기가 너무 힘들다는 점이다. 그리고, 기술지원 오는 사람 가운데서 툴 전문가를 찾기가 매우 힘들다는 것도 더해서...
Posted by 영회
'콘텐츠'일까 '컨텐츠'일까라는 흥미로운 글이 올라왔다. 매우 흔하게 쓰이는 외래어에 대한 올바른 표기법이 정리되어 있다.

Contents는 컨텐츠가 아니고 콘텐츠가 올바른 표기라고 한다. 내 블로그에서 찾아보니 컨텐츠가 4개나 나와서 콘텐츠로 바꿨다. 콘텐츠라고 쓴 것은 하나도 없네. ^^;

Data는 무얼까? 현재 프로젝트에서 다른 개발자의 데이타라는 표기를  데이터로 고쳐줬는데.. 다행히 맞다. License는 라이센스가 아니고 라이선스라고 한다. 그간 혼용해서 써온 것으로 기억하는데 블로그에선 라이선스가 하나, 라이센스가 하나 있다. 고치자.

그 외에 혼동하기 쉬운 표현들에 대한 적합한 표기를 옮겨본다. (윈도우, 윈도우즈는 너무 많아서 수정을 포기해야겠다. ㅡㅡ;)
Windows: 윈도
Site: 사이트
Workshop: 워크숍
Portal: 포털
Flash: 플래시
Leadership: 리더십
Target: 타깃

Posted by 영회
4. 프로젝트탐색기에서 위치 변경시 프로그램 다운
어처구니 없는 현상이다. 비스타에 깔아서 그렇다고 치부해야지. 그야말로 어처구니 없는 현상이다. 할 말이 없다. 조심해서 하나씩 옮기면 덜 죽는다. ㅡㅡ;

3. 프로젝트탐색기에서 한글 입력 불가
프로젝트 탐색기에서 패키지를 생성하고 바로 한글 입력이 안되는 경우가 발생한다.
해결: 버그다...영문이름 넣고, F2 키를 선택해서 이름변경하면 한글 이름을 넣을 수 있다.

2. 사라진 참조 제거하기
다른 모델에서 클래스 등을 복사한 후 해당 모델을 삭제하거나 하여 사실상 참조가 사라졌는데 어딘가 그 정보가 남았다. 대형 쌀 창고에서 새앙쥐 한마리 찾는 격이다. 어찌 할까?

해결: 찾아냈다. emx 파일을 소스보기로 발견했다. ownedBehavior 엘리먼트 하위에 다음과 같은 내용이 있었다. 액티비티 다이어그램에서 파티션을 복사해온 것이 화근이었다.
            <group xmi:type="uml:ActivityPartition" xmi:id="_4OgwUA6DEdyYPvUxUv786Q" name="" node="_71oA8A6DEdyYPvUxUv786Q _Ysu-qQ8SEdyifcMhX5Ne5Q _fAHBOQ8SEdyifcMhX5Ne5Q _ipftSQ8TEdyifcMhX5Ne5Q _nK-7kA_8Edy9GuIJT3qybw _uDaEmQ__Edy9GuIJT3qybw _DGbRyRAIEdy9GuIJT3qybw _jeu10BAIEdy9GuIJT3qybw" edge="_xT1AsA6EEdyYPvUxUv786Q _f9p1QA8XEdyifcMhX5Ne5Q _h4CBAA9IEdyifcMhX5Ne5Q _oQRvsA_8Edy9GuIJT3qybw _5JZn8BAHEdy9GuIJT3qybw _QQ8LQBAIEdy9GuIJT3qybw _suwPsBAIEdy9GuIJT3qybw _unJ7wBAIEdy9GuIJT3qybw">
                <represents xmi:type="uml:Actor" href="복사해온원본모델파일.emx#_4653867D00B646538CBB0138?유스케이스모델/액터/액터이름?"/>
              </group>

복사해오고 나서 위치가 변경되어 저장되어야 하는데 자동 갱신이 안되는 모양이다.

<group> 내의 <represents> 태그를 제거하여 <group /> 태그로 만들고 나서 모델에서 파티션에 액터를 할당해주는 방식으로 찌꺼기(복사로 인해 발생하는 잘못된 정보)를 털어버릴 수 있다.

모델링도구에서는 복사는 안하는 것이 좋다. 코딩에서도 마찬가지지만... ^^

1. eclipse.ini 파일 VM 옵션 수정
안된다. 왜? 비스타의 경우 RSA 설치하면 eclipse.ini 파일에 대해 일반 사용자에게 쓰기 권한을 안준다.
해결: 편집기를 실행할 때 '관리자 권한'으로 실행하면 된다.

Posted by 영회
기술지원 온 인력이 업무를 마치는 것을 기다리느라 야근을 했다.
일과 중에 빈틈없이 일을 했음에도 다른 사람에게 의존적인 부분은 통제가 불가능하다.

결론부터 말하자면 기술지원을 오신 분이 유래없이 잘해주신 것과
프로젝트 중추가 되는 PM/PL의 열심히 하려는 마인드에 기분이 좋아졌다.

CBD라는 이름으로 UP류의 방법론이 현장에서 널리 쓰이지만 반복(Iteration)의 어려움에 기록한 다양한 이유로 제대로 반복을 하는 경우는 극히 드물다.

하지만, 제대로 모델 중심의 개발(MDD)을 해보신 분들은 한결같이 반복의 필요성을 느낀다.
PM이 설계 모델의 품질을 높이기 위한 방법을 강구해보자고 했을 때
내가 굳이 답변할 필요도 없을 정도로 PL이 그것이 왜 힘든지 본인이 느낀바를 설명했다.
PM은 내게 확인을 요구했고, 그럼에도 불구하고 개선할 수 있는 방안을 찾아냈다.
나는 이분들이 다음번에는 더 중요한 프로젝트에서 일하게 되길 비는 마음이 생겼다.
앞으로도 이런 사람들과 일했으면 좋겠다. 그래야만 자신의 출력(?)을 다 소진할 수 있다.

다른 프로젝트에 비해 분석 모델링 과정이 괜찮은 축에 속한 현재 프로젝트의 특성을 메모해본다.
1) 고도로 복잡한 업무에 대해서 개발자들은 쉬이 지친다. (업무 분석 역량이 없는 개발자들에겐 버거울 법하다.)
2) 업무에 해박한 PL이 영문작명을 해주면 진척도가 폭발적으로 빨라진다. (DDD가 화두로 내게 멤도는 이유다.)
3) WBS가 분석 > 설계 > 구현 순으로 워터폴로 짜있다면 온갖 편법을 쓰지 않는 한 높은 품질의 모델을 기대하기 어렵다.(엄청난 공수로 커버하지 않는 한)
4) 사실상 설계모델은 효용성이 매우 떨어진다.(MDA의 PDM 자동 변환이 등장했던 이유와 같이)
 - 업무 이해를 위한 축은 단일 모델이 되어야 한다.
 - 분석, 설계 모델을 나눠놓으면 모델 사이의 연관성 자체에 대해서도 (미친짓수준의) 형상관리가 필요하다.
 - 설계 모델은 아키텍트를 위한 메타레벨(혹은 UML Profile수준)의 간결한 모델이면 충분하다.
 - 결국 단일(형상의) 모델로 고객과 개발자의 괴리를 좁히는 것이 훨씬 유익하고 이것이 내가 생각하는 DDD의 효익이다.
 - 그런데, DDD를 논하는데 POJO 개발과 Spring이 회자되는 이유는... 바로 분석 모델과 설계 모델의 괴리를 줄일 수 있는 플랫폼이 되어주기 때문이다!!

얘기가 너무 길어졌다... 내일을 위해 취침
Posted by 영회
우리나라에선 Hibernate를 SI 현장에서 활용하는 것을 보기는 쉽지 않은 것 같다.
SQL에 익숙한  개발자의 비중이 엄청나게 많은 것이 가장 큰 이유라고 생각된다.
심지어는 고객마저 ERD에 익숙한 경우도 있으니까

기능면에서나 인기면에서나 ORM은 Hibernate의 입지가 확고해보인다.
그러다 보니 경쟁자 사이에서도 손을 잡는 것 같다.
InfoQ 기사를 보니 BEA가 밀고 있는 OpenJPA를 IBM도 밀기로 한 모양이다.
그 정도는 되어야 Hibernate와의 경쟁체제에 명함이라도 내밀 수 있을테니...

일민형 얘기처럼 대다수의 사람들이 JPA 스펙 기다리면서 세월을 까먹기보다는
특정 구현을 선택하게 될 것이다. JPA 개발진영에선 건전한 경쟁이 벌어질 듯하다.
TopLink까지 고려하면 3파전이 되겠군. 다행스러운 점은 모두 오픈소스라는 점

JPA에 익숙하지 않은 분들을 위해 InfoQ 기사의 의미를 쉽게 풀어보자면...
EJB1.x나 EJB2.x의 Entity Bean의 역할을 대치하려고 나온 것인 JPA 스펙이다.
JPA 스펙은 EJB에서 분리되어서 EJB가 없이도 사용이 가능해졌다.
새로 나온 EJB3 스펙을 준수한 WAS(EJB 컨테이너)를 사용한다면
각 제품별로 다음과 같은 JPA 구현체를 쓰게 되는 모양이 된다.

- WebLogic10 사용시 JPA: OpenJPA
- WebSphere 6.1 사용시 JPA: OpenJPA
- JBoss 사용시 JPA: Hibernate
- Oracle AS 10g 사용시 JPA: TopLink Essentials - JPA

물론, Spring을 사용하면 OpenJPA, Hibernate, TopLink Essentials - JPA 중 어떤 것이든 선택해서 쓸 수 있다.

우리나라에서는 좀체 JBoss나 오라클AS를 쓰는 것을 본 적이 없다.
결국, EJB3.0을 도입하는 곳이 있다면 Hibernate 보다는 OpenJPA를 가능성이 높아진다.

국내에서 최근에 강세를 보이는 Jeus의 경우는 홈페이지나 발표자료에선
EJB3.0을 구현했다고 하고, JPA도 있다고는 하는데..
모처에서 고객이 EJB3.0을 쓰려고 하자 난색을 표명한 것으로 알고 있다.
그들이 판매하는 프레임워크가 표준과는 상당히 거리가 먼
고유의 길을 고수하는 것을 보면.. 해외 WAS와 비교하기는 무리인 것 같다.
Posted by 영회
월간마소 5월호에 기고했던 글, 다시 꺼낸 양날의 검 UML 2부 - UML의 전략적 활용에 독자 문의가 있어서 답변을 블로그에 올립니다.

안녕하세요. DBGuideNet 사이트 애독자인데요, 최근 읽은 자료중 "다시꺼낸 양날의 검 UML 2부" 내용중에 아래와 같은 문장을 접하게 되었습니다.

"기업용 정보 시스템에서라면 역공학으로 만들어낸 모델은 아주 특수한 경우를 제외하고는 전혀 쓸모가 없다"

기업용 정보 시스템을 제작하기 위해서 ISP를 하고, 그런중에 정보시스템이 개발이 되어 기업의 경영활동을 지속할 소중한 정보시스템으로서 역할을 다 할 텐데요.

기업용 정보시스템이 특수한 경우를 제외하고는 역공학으로 생성된 모델이 모두 쓸모가 없다는 내용은 어떠한 관점에서 바라보신건지 이해가 필요할 것같아 이렇게 실례를 무릅쓰고 메일을 드립니다. ^^;

절대 딴지가 아니니 무례하다 생각지 마시고, 답변을 부탁 드릴께요. 소중한 답변을 기다리고 있겠습니다.

예전에도 역공학 무용론을 피력하다가 제 블로그에서 논란을 일으킨 바가 있죠. 그 내용은 아래 글에 담겨 있습니다:
역공학에 대한 이해 한발만 더 나아가기

오해를 막기 위해 좀 정확하게 정리해보면
- 제가 말하는 역공학(Reverse Engineering)을 이란 UML을 사용한 경우게 국한됩니다. ISP는 어떤 상황을 전제로 하셨는지 모르지만... 현행 업무 분석을 위해 물리적 ERD를 역공학으로 도출하는 것과는 관련 없는 이야기죠.

- 또한, 개발 환경도 자바 혹은 J2EE에 국한된 것입니다. 제가 UML을 활용해본 경험은 모두 자바이거나 닷넷(C#)을 활용하는 경우였습니다.

- 제가 굳이 '아주 특수한 경우를 제외하고는 전혀 쓸모가 없다'라고 강조해서 표현한 이유는 이렇습니다.
1) 시스템개발에 경험이 많은 분들중에 UML 모델링 도구와 J2EE를 잘 모르시는 분들 혹은
2) 모델링 도구 판매를 목적을 가진 분들이
종종 마치 물리적인 ERD를 뽑아내는 것처럼 자바 코드에서 모델을 뽑아낼 수 있는 것처럼 이야기 합니다. 기본적으로는 맞습니다. 자바 코드에서 모델을 뽑을 수 있죠. 거의 대부분의 도구들이 클래스와 클래스 다이어그램 정도는 만들어줍니다. 특정 도구는 시퀀스도 그려주죠.

그러나, 프로그래밍 공부할때 짜보는 수준의 토이 프로그램이 아니라면 그려준 그림이 큰 의미를 갖지 않습니다. 솔루션의 코어 로직을 순수 자바 만으로 짰다면 얘기는 달라지지만

1) (소스가 없는) 각종 상용 솔루션을 쓰고
2) EJB나 서블릿과 같이 컨텐이너에 의존하여 수행되어 의존성 추출이 어렵고
3) JNDI 등에 의해 문자열로 의존관계가 드러나며
4) JSP의 의존 관계 역시 추출이 어려운

보편적인 SI환경에서는 역공학은 노력에 비해 건질 것이 별로 없다는 사실을 강조했을 뿐입니다. 역공학을 유용하게 쓸 수 있는 노하우을 말해주는 것이 아니라 '모델은 역공학으로 하면 된다'라고 무책임하게 말해버리는 분들을 자주 봐서... :)

저 역시 라이브러리를 분석할 때 역공학을 자주 사용합니다. 물리적 ERD를 추출하듯이 핵심적인 클래스의 관계가 드러나는 클래스다이어그램을 역공학으로 뽑아내면 매우 유용하죠. 특수한 목적을 가지고 잘 쓰면 유용합니다. 그러나, 일반화시켜서 제 견해를 말하자면 여전히 역공학의 경제성은 매우 낮다는 생각입니다.
Posted by 영회
생각하며 배우는 UML 2.0의 저자인 김현남씨가 또 다른 서적을 준비하는 모양이다.
내용이 범상치 않다. '독립적 존재와 의존적 존재'라는 시작 부분부터 관심을 끈다.
김현남씨의 모델링 내공이 담겨질 것으로 보인다.
(하지만, 난이도는 꽤 높아질 것으로 보여서 흥행은 모르겠다. ^^)

여하튼 존재론을 쉽게 설명한 윤구병님의 존재론 강의 "있음과 없음"이 떠오른다.
예전에도 아래와 같은 글을 쓴 일이 있다.

존재론에서 배우는 객체 설계 팁(Tip)

윤 구병님의 존재론 강의 "있음과 없음"중에서 객체 설계에 도움을 줄 수 있는 부분인 것 같아 발췌합니다. 혹, 이 내용을 보시고, "있음과 없음"에 대한 판단을 하는 우는 범하지 마세요. 책 전체적인 특징을 보여주는 글이라고 보기는 힘들거든요. 정말 훌륭한 책입니다.
“우리가 어떤 것을 볼 때 그것이 무엇인지 알려면 그것이 가지고 있는 한계를 보아야 합니다. 이를테면 이 강의실 밖에는 주차장이 있고, 주차장에는 자동차가 서 있는데, 우리가 저것이 자동차라는 것을 알아보는 것은 저것이 가진 겉모습이 공중 전화나 소나무와는 다르기 때문입니다.
그러나 눈에 비치는 겉모습만으로는 저것이 진짜 자동차인지 자동차 모형인지 잘 모를 경우도 있습니다. 영화 촬영장이 좋은 예가 되겠지요. 겉으로 보면 솟을대문에 으리으리한 집인데, 안에 들어가 보면 아무것도 없습니다. 영어로 ‘세트’라고 하지요. 마찬가지로 창 밖에 보이는 저 자동차도 시늉만 한 것일 수 있습니다. 저것이 진짜 자동차인지 아닌지 알려면 어떻게 해야 할까요?”
“그야, 나가서 타고 운전해 보면 되지요.”
“아주 단순하고 실용적인 확인 방법입니다. 그런데 만일 운전을 해 보아도 차가 움직이지 않는다면요?”
“기름이 떨어졌는지 살피지요.”
“기름이 있는데도 움직이지 않으면요?”
“……”
이렇게 해서 우리는 그 자동차가 진짜인지 아닌지 알아보려면 그 자동차의 부속품을 하나하나 살펴보아야 하고, 그 부속품들이 제자리에 있는지도 확인해야 한다는 결론을 얻었습니다. 다시 말하면 자동차를 분해해 보아야 한다는 거지요.
저는 말을 이었습니다.
“자동차를 분해하면 이제까지 겉에 가려서 보이지 않던 부속품들이 여러 모습, 감추어져 있던 한계가 드러납니다. 일정한 한계를 지니고 독립해 있는 이 부속품들은 저마다 하나하나 떨어져 나옵니다. 그러나 이렇게 해서 자동차를 완전히 분해하고 나면 자동차의 구조는 알 수 있을지 모르지만 기능은 알 수 없습니다. 왜냐하면 부속품들로 조각조각 분해된 자동차는 이미 하나의 자동차이기를 그치고, 이런저런 부품들의 무더기에 지나지 않기 때문입니다.

다시 현남씨의 글로 돌아가서 보면...
아래와 같이 대비 시켜놓은 구도는 상당한 직관을 준다. 자못 책 내용이 기대된다.^^

독립적 존재와 의존적 존재
부분과 전체
객체와 값
타입과 값
속성과 특성
속성과 상태
링크와 연관

이에 더하여...
있음과 없음
목적과 수단

이런 것들은 생각을 풀어나가는 단초가 되어준다.





Posted by 영회
9/19: 이 방면은 잘 모르지만, 간단한 설명을 부탁하신 분이 있어서 작성합니다.
9/24: 관련 통계가 올라와서 첨부합니다.
12/9: An Open Source AJAX Comparison Matrix에서 비교표 발췌
12/16: Exploring Ajax Runtime Offerings에서 비교표 발췌
12/22: Introduction to RIA 발표 자료 보기(PDF)(likejazz님 작성)
2007.3.28: 윤석찬님의 분류 추가
2007.4.19: ZDNet 김국현님 컬럼 링크
2007.6.26: 정기자님 포스트 링크
2008.4.12: 우연히 발견한 링크 추가
2008.7. 4: RIA 사용처 설문 내용 추가
2008.9.18: Rich Internet Application Archetype 링크 추가

RIA(Rich Internet Application)는 아주 간단하게 정의하자면 데스크탑 애플리케이션과 같은 기능을 수행하는 웹 애플리케이션을 의미합니다.

RIAApp.gif
출처:
Rich Internet Application Archetype

먼저 사용처를 살펴보고 기술 자체에 대해 알아보죠.

RIA의 적절한 쓰임새

RIA 전문가가 아닌지라 잘 모릅니다. 다만 RE: What's a good RIA to develop in 20 hours? 라는 글에 나온 설문 내용을 참고할 만하네요.

  1. Lightweight CMS
  2. MP3 Player
  3. Resume Editor/Publisher
  4. Meal/Calorie Tracker
  5. Contact Management
  6. Planning Application
  7. Timesheet Application
  8. DB/SQL Client
  9. Status Updater/Aggregator (LinkedIn, Twitter and Facebook)
  10. Online File Explorer (browser-based FTP interface)


RIA 기술 분류

RIA를 위한 서버측 프로그래밍 모델 같은 것이 아직 정립된 것 같지는 않습니다. 어떤 면에서는 서블릿의 Asynchronous 모델 채용이나 Continuation 과 같은 화두들이 RIA와도 관계가 있다고 보입니다. 일단 이들은 배제하고 사용자 인터페이스 입장에서 플랫폼 역할을 하는 기술들만 정리해보겠습니다.

최근에 부각되고 있는 실버라이트와 FX 스크립트를 소개하는 글을 링크합니다:
차세대 웹 개발 플랫폼 삼국지

윤석찬님의 간결한 분류를 먼저 소개하겠습니다.
- Ajax : (X)HTML+CSS+ DOM+ JavaScript <-> Data API
- WPF/e : XAML+CSS+XBL+CLR(JavaScript/Ruby/Python) <-> Data API
- Flex: MXML+CSS+ActionScript  <-> Data API
- Widget: HTML(Canvas)+ CSS+ JavaScript <-> Data API
- Firefox: XUL+CSS+JavaScript(XPCOM) <-> Data API
- WHATWG: HTML5 + CSS+ DOM+ JavaScript <-> Data API
출처: Ajax가 리치 웹의 끝인가?


위키피디아에서는 10가지로 세분하고 있지만, 개인적인 평가를 기준으로 두드러진 것들만 추려보면 다음과 같습니다.

  • AJAX (Javascript + DOM)
  • FLEX
  • ActiveX 컨트롤

이들 중에서 개발자 커뮤니티에서 국내외를 불문하고 가장 파장이 큰 것은 ajax입니다. 국내 서점에 출시된 서적들의 숫자로 국내의 인기를 추정할 수 있습니다. 해외의 경우는 작년 최대의 화두로 꼽히고 있구요. 수많은 라이브러리가 존재하는 것을 통해 영향력을 알 수 있습니다.

AJAXAsynchronous JavaScript and XML의 약자이지만, 굳이 Javascript와 DOM이라고 표현한 이유는 꼭 XML만 쓰일 수 있는 것은 아니기 때문이죠. AJAX에서 javacript는 브라우저(클라이언트)에 기능을 추가해줍니다. 다양한 동적인 움직임을 가능하게 해주죠. 웹에서 드래그 앤 드롭을 구현한다거나 부드럽게 오르 내리는 UI 컴포넌트의 움직임들이 단적인 예라고 할 수 있습니다. 물론, 이들은 행위가 강화된다는 것을 알려주는 두드러진 특징일뿐, 사용자 이벤트에 대한 반응이 강력해진다는 것이 더 중요합니다.

자바 스크립트가 제공하는 풍부해진 기능에 내용을 채우는 것이 DOM(Document Object Model)입니다. 서버에서 받은 데이터는 DOM을 통해서 화면의 적절한 위치에 나타날 수 있습니다. 물론, 자바스크립트와 CSS의 도움을 받게 되죠. 데이터를 실어 나르는 용기 혹은 차량 역할을 하는 것이 대개 XML인데요. 굳이 XML이 아니라 일반 테스트나 JSON 혹은 HTML 등으로도 전송이 가능합니다.

Ajax 구현을 돕는 수많은 라이브러리 혹은 프레임워크가 있는데 간단하게 주요 목록만 뽑아보죠.

  • Prototype: 수많은 Ajax 라이브러리/프레임워크의 기반을 제공하는 기초적인 자바스크립트 라이브러리
  • Dojo Toolkit: 자바 스크립트 기반의 풍부한 컴포넌트를 제공하는 Ajax 라이브러리
  • Google Web Toolkit: 구글에서 제공하는 자바 기반의 Ajax 개발도구.
  • DWR: 자바 커뮤니티에서 오픈소스로 진행되는 Ajax 라이브러리. 자바 서블릿 프로그래밍과 Ajax를 연결해준다.
  • Microsoft Atlas: ASP.NET의 확장으로 제공되는 MS의 Ajax 프레임워크
  • Yahoo! User Interface Library: Yahoo가 제공하는 자바스크립트 기반 UI 컨트롤과 유틸리티 라이브러리
Ajaxian.com 2006 Survey Results에 관련 통계 정보가 올라와 이를 첨부합니다.

Framework Survey Results

Platform Survey Results

  • 25% of you eschew frameworks and work with XMLHttpRequest directly (wow!)
  • 11% of you are using JSON to transfer data; unfortunately, we didn’t ask enough questions to determine how this compares with XML or other data formats
  • 3% of you are still using Microsoft’s “classic” ASP framework; five of you (~0.6%) are using C++ (+2 points for increased performance, -100 for increased complexity?)
  • 2% of you are using Adobe’s Flex toolkit (hey, those banner ads are working out…)
  • One participant uses Delphi (how’s that working out for you?), and another is using LISP (can we hire you?).

An Open Source AJAX Comparison Matrix에서 5점 척도로 Ajax를 비교한 자료

사용자 삽입 이미지

서버 중심의 처리를 하느냐/클라이언트 중심의 처리를 하느냐에 따른 분류
Flex. 사실상 표준이라 할 수 있는 Flash 플랫폼에 기반한 RIA 구현을 위한 기술 세트.
Ajax가 대체로 무료로 제공되는 수많은 라이브러리/프레임워크와 함께 간단한 개발 도구 기반으로 개발자에게 도입되는 것과 달리 Flex는 Adobe의 강력한 IDE(통합 개발 환경) 즉, 상품 기반으로 보급된다. 사용처에 있어서도 Ajax가 포털이나 인터넷 서비스 업체쪽에서 주로 도입하는 반면에, Flex는 대규모 사이트에 적합하다.

ActiveX 컨트롤. ActiveX 컨트롤은 IE와 함께 널리 사용된다. 대부분의 전자 상거래를 위한 인증서도 ActiveX 기술을 사용하고 있고, 대다수 포털 사이트의 편집기도 ActiveX를 이용하여 구현되었다. 웹 하드와 같은 것을 사용해본 경험이 있다면 RIA의 사용자 경험을 상당수 맛본 것이라고 할 수 있다. 국내 SI 산업에서 최근 급속도로 확산되는 X-인터넷 도구들은 대부분 ActiveX 기반이다. Ajax나 Flex와 달리 ActiveX 컨트롤은 Internet Explorer(당연히 OS는 윈도우)에서만 구동한다는 제약을 갖고 있다.

국내에 유독 ActiveX 기술이 득세하는 이유에 대해서는 다음의 칼럼에서 잘 설명해준다:
ActiveX 문제의 진실


첨부:
사용자를 자바 개발자에 국한하여 산정한 통계인 듯 하다.


출처: Most Popular Java / Ajax Frameworks


기본 JEE 웹 애플리케이션을 RIA로 Miagration할 때 참조할 사항: Leverage J2EE with Enterprise Web 2.0 

Flex를 잘못 사용하는 대표적인 사례: Top 10 Mistakes when building Flex Applications



Posted by 영회
스치는 생각을 그저 기록합니다.
일터에서는 여전히 모델 중심의 설계를 하다 온 입장에서...
MDD(Model Driven Development) 혹은 DDD(Domain Driven Design)의 반대편에 서서 잠시 타이핑해본다.

만일 웹 애플리케이션이 아니라면 혹은 관계형 데이터베이스를 쓰지 않는다면 순수한 MDD/DDD 구현이 훨씬 수월해질 수 있다.
하지만, 기업용 시스템 구현에 있어 그런 경우는 극히 드물다. 없다고 해도 과언이 아니다.

그렇다면 클라이언트로 전달되는 프리젠테이션 티어, 서버의 VM에서 구동하는 티어(이 영역을 굳이 더 레이어링 하지 않겠다.)와 데이터베이스 영역이 존재하게 된다.

도메인의 핵심 개념이나 규칙은 티어에 산재해서 존재하게 된다.
결국 순수하게(혹은 순진하게) DDD를 구현하는 일은 무모해보이는 면이 많다.

DDD의 장점은 사실 소스코드 수준의 구현에 주는 이점보다는
커뮤니테이션의 구심점 역할을 해줄 모델(도메인 모델/업무 모델/공유 모델)의 효용성이 더 크다.

하지만 현재까지 현장에서 느끼는 한계는
1) 모델 자체에 투여하는 공수가 낮다. (산출물 만드는 과정 자체를 더 중요하게 생각한다.)
모델은 짜내서 에센스를 만들어낼때 효과가 있다...
또한, 대개 폼나게 그릴 수록 쓰레기가 될 가능성이 많다.

2) 모델의 용도나 UML에 대한 이해도가 낮다.
최종 산출물이 아닌 중간 생산물로써의 가치 인식이 약하다.
모델을 통해 논쟁도 일어나고 논의도 일어나는 것을 자주 맛봐야 할 듯...
개발자와 고객들이 적어도 ERD 보는 수준 정도로는 UML 다이어그램을 볼 수 있어야 소통의 도구가 되지 않을까?
소통의 도구가 되어야 가치를 논할 수 있다.
그렇지 못하고 산출물로만 인식되면 소스코드보다 더 긴 주석에 지나지 않는다.

쓰다보니... DDD/MDD를 반하는 입장이 맞나 싶지만...

결과적으로 DDD/MDD를 도입하기에는 아직 이른감이 있고
소수의 개발팀에서 메타프로그래밍 수준에 DDD/MDD를 적용한다면
매우 유용할 수 있을 듯 하다.

정형화된 플로우나 컴포넌트 유형에 대해서만 모델링을 한다면...
실험삼아 시도해봄직할 아이디어다.
Posted by 영회
* 저는 RoR(Ruby on Rails)이나 루비에 대해서 문외한임을 밝혀둡니다.

기묘와 발표자 세 분은 상당히 어려운 형식의 세미나를 시도했다. 처음에는 좀 준비가 덜 된 듯한 느낌이었지만, 점차 3인 3색이 드러나는 면이 좋았다. 그리고, RoR의 강점인 인터렉티브한 개발에 대한 감을 느낄 수 있어 좋았다.

RoR에 대해서는 아이러니하게도 RoR의 한계를 여실히 느꼈다. 동적인 언어인 탓에 IDE가 나오기 힘든 점... 그래서 전통적인 CGI 언어를 통한 개발과 같이 시행착오법이 보편적인 개발 방식이 된다는 점.

한편, RoR은 Web 2.0에 잘 어울리는 언어/프레임워크다. 기획자와의 페어 프로그래밍이라는 사례가 잘 보여주듯이 상당히 빠르고 인터렉티브하게 개발하는 것이 가능하다. 게다가 잦은 수정이 가능하다. Beta를 표방하는 Web 2.0 서비스 방식에는 그야말로 최적화된 환경이다. 또, 백화점식 서비스 보다는 아주 특징적인 서비스 하나에 초점을 맞추는 Web 2.0의 특징에도 RoR이 제격이다.

하지만, 많은 사람들이 시도하는 자바와 루비의 비교는 적절하지 않은 듯 하다. 최근 자바는 코볼의 바톤을 이어받았다. 상당히 보수적인 엔터프라이즈 영역에서 주류 언어로 자리매김한 상황이다. 자바는 10년 이상 발전해오면서 여러 개발자 사이에서 코드를 공유할 수 있는 가독성 측면이나 API 설계에 대한 노하우가 정립되어 있는 상황이다. 이는 많은 인원이 함께 할 수 있는 대규모 프로젝트에 효과적으로 쓰일 수 있음을 의미한다.

발표자 중 한 분이 언급한 것처럼 루비는 간결한 문법 탓에 자기만의 표현 방식이 가능하다. 이것은 프로그래밍 하는 재미를 주기는 하지만, 가독성이나 협업에는 제약이 된다. 결국 루비/RoR은 소수의 컴팩트한 개발팀에 최적화 되어 있다.

물론, 미래에는 다른 양상이 펼쳐질 것이다. EJB라는 자바 진영은 견고한 법전(?)이 소수 개발자의 땀방울에 와르르 무너지게 될 것이라고 누가 상상했던가.

RoR을 보면서 몇 가지 욕심이 났다. 자바/Spring을 활용하면서도 RoR의 직관적인 개발자 API를 차용할 수 있다는 것이다. 애노테이션이나 설정만으로 적용할 수 있는 스프링 스타일의 컴포넌트를 제공한다면 RoR과 같은 생산성 향상이 가능할 것이라는 점이다. 대략적으로 시도해 볼 수 있는 항목은 다음과 같다.

  • created_at, updated_at, deleted_at 류의 자동 타임 스템프
  • 설정만으로 Validator 만들어주기
  • 초보적인 RESTful 서비스를 위한 url 매핑

최근에는 모두가 "loosely coupled"를 외친다. 산재된 이슈와 레거시와의 융화, 타 기업과의 잦은 연동의 필요성 등은 "loosely coupled"의 동기이다. RoR은 "tightly-coupled" 혹은 "monolithic" 측면을 갖고 있었다. 그럼에도 불구하고 좋아 보이는 것은 도메인 중심으로 초점이 맞춰져 있다는 점이다. 단순히 추측에 지나지 않지만 자바 진영에서도 DDD를 실현해내려면 RoR 스타일의 도메인 중심의 프로그래밍 스타일을 찾아내야 할 것 같다.

Posted by 영회

컴퓨터 관계된 일 하는 사람이 아닌 일반인에게 G메일의 편리함을 이야기해봐야 이상한 눈으로 쳐다볼 뿐이다. 다른 개발자들과 이런 얘기를 여러 차례 했었는데 아주 단적으로 정리한 글이 올라왔네.

네이버를 향해 모두 우향우~

Posted by 영회
Gmail의 성공의 견인차 역할을 한 기술(enabling technology)은 Ajax이다. Ajax의 핵심 구성요소인 XMLHttpRequest를 Microsoft에서 만들었다는 것은 흥미로운 사실이다. Microsoft가 Outlook을 위해 내놓은 XMLHttpRequest는 아이러니하게도 Outlook이 Gmail 저편으로 저물게 되는 계기가 되었다니...

Ironically, Microsoft unintentionally helped create Ajax. The x in Ajax is from the XMLHttpRequest object, which lets the browser communicate with the server in the background while displaying a page. (Originally the only way to communicate with the server was to ask for a new page.) XMLHttpRequest was created by Microsoft in the late 90s because they needed it for Outlook. What they didn't realize was that it would be useful to a lot of other people too—in fact, to anyone who wanted to make web apps work like desktop ones

출처: Microsoft is Dead

Posted by 영회

태그 파일로 복잡한 태그를 단순화 하는 일은 화면 출력 내용/로직의 캡슐화로 볼 수도 있고, HTML에서의 중복 제거로 볼 수도 있다. 설명을 위해 사용할 예제 페이지는 Encapsulating Reusable Content Using Tag Files의 코드를 일부 수정했다.

<%@ taglib tagdir="/WEB-INF/tags" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"
  prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions"
  prefix="fn" %>
<html>
<head><title>Hello</title></head>
<body bgcolor="white">
<img src="younghoe.png">
<c:set var="greeting" value="Hello" />
<h2>${greeting}, my name is Younghoe. What's yours?</h2>
<form method="get">
<input type="text" name="username" size="25">
<p></p>
<input type="submit" value="Submit">
<input type="reset" value="Reset">
</form>

<c:if test="${fn:length(param.username) > 0}" >
  <h2><font color="black">${greeting}, ${param.username}!</font></h2>
</c:if>
</body>
</html>

노란색으로 칠한 부분이 중복 사용되어서 태그 파일로 분리하려 한다 가정해보자.

<h:response greeting="${greeting}" name="${param.username}"/>

위와 같은 용법으로 쓰고 싶다. 태그 파일을 하나의 컴포넌트로 보면 일종의 컴포넌트 인터페이스를 설계하는 것이다. 태그의 이름을 결정했고, 인자로 전달할 두 개의 속성명을 결정했다. 이제 태그 파일을 정의해야 한다.

<%@ attribute name="greeting" required="true" %>
<%@ attribute name="name" required="true" %>
<h2><font color="black">${greeting}, ${name}!</font></h2>

직관적으로 이해할 수 있는 작성법이다. 매크로(Macro)를 써본 경험이 있는 사람이라면 데자뷰 현상을 느낄 수 있다. 태그 파일 사용부를 수정했고, 태그 파일 작성도 끝났다. 이제는 배포(deployment)하는 일이 남았다. 태그파일 빌드(build)는 JSP 처럼 동적으로 수행된다.

Sun의 튜토리얼에 따르면 배포하는 방법은 두 가지이다. 하나는 WEB-INF/tags에 위치시키는 것이다. 태그의 이름과 태그 파일의 이름이 같아야 하고, 확장자는 tag가 되어야 한다. 이러한 컨벤션을 따라 주면 별도의 설정이 필요 없어 편리하다.

또 한가지 방법은 jar에 포함시키는 방법인데.. 자세한 내용은 링크만 남긴다.

Posted by 영회
8. Continuous Integration

지속적으로 테스트를 하면서 모듈을 개발해나가다 보면 역시 계속해서 통합을 해야 한다. 그런데 코드를 공동 소유하게 되기 때문에 나도 모르는 사이에 내가 짠 코드를 누군가 수정해버리는 경우가 생길 수 있다. 한 마디 말도 없이..ㅡㅡ; 이런 점을 통제하는 것은 쉽지 않을 것이다.

그래서 Continuous Integration을 읽으면서 단지 코드의 통합뿐만이 아니라 개발팀의 통합을 이뤄내는 것을 의미할 수 있겠다는 생각이 들었다. 내가 작성한 코드를 누군가가 함부로(?) 수정해도 용인할 만큼 서로를 신뢰하거나 이전 상태로 복원할 수 있는 방안이 마련되어야 한다. 진정한 CI 정착을 위해서는 개발자 문화, 빌드를 위한 시스템 차원의 환경과 개발자와 시스템이 융화된 프로세스가 필요하다. 쉽게 말해서 징그럽게 어렵다.


9. Sustainable Pace

프로그램 개발은 장기전이기 때문에 지속적인 페이스로 일해야 하다는 것이다. SI 업체들은 대개 야근을 한다. XP는 초과근무를 하지 않는 것을 원칙으로 한다. 오전에 서핑하고, 점심 먹고 조는 상황에서 밤에만 바짝 야근하는 관행으로는 XP를 섣불리 흉내낼 수 없다.

팀이나 조직 차원에서 관리가 높은 효용성을 갖기 위해서는 팀원 각자의 자기 관리 능력이 요구된다. 나 스스로의 생산성을 측정할 수 있는가?


10. Open Workspace

XP에서는 기본적으로 Pair-programming을 하기 때문에 여러 pair가 한 공간에서 작업을 하게 되면 웅성웅성하는 소리가 사방에서 들릴 것이다. 대개 프로그래머들은 폐쇄된 공간에서 조용하게 작업하기를 원한다. 아마 이런 작업 형태가 반복되면서 성향조차 바꾸는 것 같다.
사오정 스타일로..ㅡㅡ;

XP에서는 팀이 하나의 유기체가 되는 것을 강조한다. 그 중심에는 서로에 대한 신뢰가 있고
신뢰를 쌓는데는 내 Pair가 아닌 사람들의 이야기도 들리는 열린 작업공간이 안성맞춤일런지도 모르겠다.


11. The Planning Game

개발에는 제한된 예산이 있다. 소프트웨어 개발도 경제학의 기본 법칙을 무시할 수 없다. 매 반복(iteration) 초기에 고객과 개발자가 예산을 기준으로 이번 반복에 수행할 Feature를 선정하는 것을 XP에서는 planning game이라고 칭하고 있다.

고객이 업무적 관점에서 중요성에 따라 Feature를 선정하면, 개발자는 팀의 역량에 따라 그 비용을 산정하고 해당 반복에서 사용 가능한 비용에 맞춰서 Feature의 수를 조정하는 것이다. 여기서 비용이라 하면 반드시 돈을 의미하는 것은 아니다. 오히려 개발자의 시간에 따른 개발 능력으로 이해하는 것이 좋다.



12. Simple Design

the simplest way possible
"최대한 간단한 방법"으로 수행하라.

아키텍처를 먼저 구축하고, 그 위에 기능을 더하는 UP의 개발 방법과 XP가 정면으로 배치되는 부분이다. XP는 하부 구조(infrastructure)조차 정해놓고 시작되지 않는다. 즉, 처음부터 DB를 쓰지 않다가 DB를 채용할 수도 있다.

현재의 프로젝트 절차를 생각하면 매우 비현실적으로 볼 수 있다. 가령, 입찰을 하게 되면 '입찰가'를 써낼 때 하부 구조나 사용하는 하드웨어에 따라 가격차가 많이 날 것이기 때문이다. 그러나, 역으로 생각하면 현재 개발 프로젝트가 제대로 수행되지 않는 현실을 고려하면, 프로젝트 절차 자체를 혁신할 필요가 있을 지도 모른다.

개인적 의견으로는 우리 현실에는 XP가 적어도 기존 방법론보다는 계약측면을 배제하고 개발과정만을 보면 훨씬 현실적이고 효과적일 듯 하다.

XP 지지자들은 열두번째 프랙티스에 대해 세 가지 지침을 함께 남기고 있다.

1. Consider the Simplest Thing That Could Possibly Work.
2. You Aren't Going to Need It.
3. Once and Only Once.

개발자들은 새로운 기술 습득을 원하기 때문에 프로젝트에서 새로운 기술을 사용하기를 원하는 경우가 많다. 여기서 공과 사의 구분이 명확해 한다. EJB, RMI, 웹 서비스 등의 기술은 현재로써는 필수가 아닌 경우가 더욱 많다. 복잡하거나 새로운 기술은 꼭 필요한 시점에 이르러서 사용하라고 조언을 하고 있다.

두번째 지침은 무엇가 새로운 기술이 필요했을 때 검증을 해보라는 것이다. '정말 필요한지 확실한가?' 대개 개발자는 새로운 기술을 맹목적으로 추종하는 경우가 있다.

세번째 지침은 장인 정신이라고 말하고 싶다. 얼마전 목욕탕에 간 일이 있다. 그 때 마침 XP에서 아래와 같은 구절을 읽었을 때였다.

'XPers don't tolerate code duplication.'

목욕탕 벽에 흰 타일 사이에 콘크리트 못이 박혀 있었다. 또, 그 위 벽과 천장이 만나는 접점에는 파이프가 이어져 있어 미관상 보기가 안좋았다. 만일 내가 건축가나 실내장식가라면 이것을 보고 무척 못마땅해 해야 한다.

마찬가지로 내가 진정한 개발자라면 엉망으로 짜여진 코드에 대해서는 참을 수 없어야 한다. 광채가 조금 미치지 못했다고 해서 도자기를 깨버리듯이 그래야 한다.


13. Refactoring

마틴 파울러에 의해 책으로 출간되어 베스트셀러가 되기도 했던 리팩토링이다. 기능이 많아지면 코드는 점차 지져분해진다. XP를 채용하면 그 정도가 심할 것이다. 애초부터 아키텍처와 같은 것을 고려하는 것이 아니기 때문이다.

UP를 통해 개발을 해서, 아키텍처 중심으로 간다고 하더라도 특정 시점에서는 코드가 지져분해진다. 또한, 개발이 종료된 이후 유지보수 기간에는 더욱 그러할 것이다. 이를 바로 잡아 품질 좋은 소프트웨어로 유지하는 기법이 리팩토링이다.

앞에서 언급한 것처럼 테스트 스위트가 잘 갖춰져 있다면 개발자는 '갑자기 안돌아가면 어쩌지'하는 고민없이 리팩토링에 집중할 수 있다.


14. Metaphor

내 마음은 호수요.

고등학교 때 시험문제 지문으로 상당히 자주 나왔던 것 같다.

Metaphor란 상대가 익숙하지 않은 무언가를 설명할 때 사용하게 된다.

'음.. 그러니까...' 라거나
'이렇게 생각해보자..', 혹은
'자.. 이건 어떨까?'

이런 말들로 운을 띄우면서 하는 설명들 중에 은유가 등장하는 경우가 많다. 은유는 간결한 추상화/개념화를 위한 막강한 도구가 된다.
Posted by 영회
아래 그림을 보고 예전에 Agile Software Development, Principles, Patterns, and Practices에 정리했던 글을 다시 옮겨본다. 이 그림은 두 장을 출력해서 하나는 사무실 책상에 붙여놓았고, 다른 하나는 집에다 붙여놓을 생각이다. 배열이나 폰트가 이쁜게 전지현 사진만은 못하지만 걸어 놓을만 하다.
http://www.xprogramming.com/images/circles.jpg 그림이 표시되지 않았습니다. 에러가 있습니다.
이미지 출처: Vincent Xu: Agile 101: Pair Programming & Simple Design

2003년 말이나 2004년 초에 작성한 것으로 짐작되는 내용을 3년이 조금 더 지난 시점에서 수정한다. (아직 수정 전인데 그때 내가 어떻게 생각했을지, 지금은 생각이 좀 성숙했을지 궁금하다. ^^)

XP 열 네 가지 프랙티스에 대한 생각

1. Customer Team Member

XP에서는 고객(Customer)이 시스템의 기능과 우선 순위를 정한다. 고객은 사용자를 대표하는 사람일 수도 있고, 개발팀과 같은 조직의 업무 분석가나 마케팅 관련자가 될 수도 있다.
고객이 누구건 중요한 것은 XP에서는 고객을 개발팀의 구성원으로 생각한다는 점이다.

사용자 삽입 이미지
고객을 익숙하지 않은 일에 적극적으로 참여하게 하는 것은 쉬운 일이 아니다. 종종 필수라고 요구되는 사항 중에 시스템을 실제 사용할 사람들은 전혀 관심이 없는 것들도 많다. 최종 사용자는 대개 바빠서 요구사항을 줄 수 없는 경우도 흔하다. 한편, 요구사항을 정형화된 형태로 정리하느라 진짜 하고 싶은 말을 못하는 경우도 있다.

실제로 요구사항 기술을 전문으로 하는 직원이 있는 경우도 수차례 경험했다. 그중에서는 요구사항을 제시하는 사람이 시스템을 쓰지 않는 직원인 경우도 있었다. 최종 사용자의 의도가 요구사항을 제시하는 사람에게 전달되는 과정에서 소실/오해가 일어난다. 또한, 잘모르는 것을 분석가나 개발자에게 전달하는 과정에서 또 한번 소실/오해가 일어난다. 직접 만나서 하지 않고 글로 쓰기까지 한다면 소실/오해의 정도는 급격하게 늘어난다.

고객이 팀원이 된다는 것을 문자 그대로 받아들여서 현실성이 없다고 프랙티스 전체를 부정할 필요는 없다. 현실적으로 가능한 만큼 정말 시스템을 슬 사람의 요구를 수집하도록 최대한의 노력을 하면 되는 것이다.
 
 

2. User Stories

요구사항 분석을 Estimation 즉, 프로젝트에 필요한 비용, 기간과 인력 등을 측정할 수 있을 정도에서 끝내라는 것이다. UP(Unified Process)[각주:1]를 학습하면서 꼼꼼히 분석을 할 때, 점차 구현에 대한 불안감이 마음에 자리한다. UP에서는 상당기간을 아키텍처를 수립하는 쪽에 중점을 둔다. 매우 잘 조직화 된 개발팀이 아니면 상당히 위험할 수 있다. 기존의 소프트웨어에서 위험요소(Risk)로 인식했던 것을 XP에서는 개발 프로세스의 메커니즘으로 수용해버렸다.

프로젝트 초반에 요구사항에 집중하고, 개발은 잠시 미뤄두는 것이 아니라 요구사항과 구현을 동시에 고려하는 것이다. 매우 바람직한 방향이지만 고객과의 협업 주기가 짧다는 것이 전제되어야 한다. 만일, 일주일에 한번 미팅하는 정도로 요구사항을 정립하는 상황이라면, '글쎄'를 떠올려봐야 하지 않을까.
 

3. Short Cycles

Interation 은 2주마다, Release 는 3개월마다 라고 하는 가이드를 제시해준다. UP에서 Iteration을 Use Case를 기준으로 계획하듯이 XP에서도 Iteration은 User Story를 기준으로 계획한다. Use Case나 User Story나 개발 산출물 관리단위로 쓰이는 점은 같다.

앞서 언급한 것처럼 요구사항 분석과 개발이 동시에 고려되어 작은 주기를 만들어낸다. 개발관점에서만 보면 상당히 안정성이 높다고 할 수 있다. 그러나, 관리자나 프로젝트 지원팀 입장에서는 막막할 수 있다. 처음부터 필요한 S/W와 H/W를 구매해야 하는데다가 사용하는 S/W나 H/W 사양이 바뀔 수도 있다. 게다가 분석가와 개발자가 다른 사람이 된다면 비용이 두 배가 소요된다. 앞에서는 분석가만 투입하고, 나중에는 개발자만 투입하는 식이 어렵기 때문이다. 결국, 어자일 개발을 위해서는 어자일 관리와 지원(?)이 뒤따라야 한다.


4. Acceptance Tests

Acceptance를 우리말로는 '인수'라고 번역할 수 있다. RUP에서는 상당이 복잡한 인수 계획을 세우고 인수 절차를 밟는 상황을 전제하고 있다. 왜냐 하면 대개 최종적인 인수에 집중되어 있다.

그러나, XP에서는 Acceptance 자체도 점진적이다. 어차피 계속적으로 돌아가는 소프트웨어가 나오기 때문에 인수 절차를 막판으로 미룰 이유가 없다. 일회적인 인수절차는 고무줄이 될 가능성이 높다. 문제를 미리 파악하지 못하기 때문에 막판에 문제가 복잡하게 꼬여서 발생하기 때문이다.


5. Pair Programmig

실험삼아 해본 적이 있는데 경험이 많은 개발자일수록 꺼리는 경우가 있다. 일단 자기 실력을 그대로 노출하는 것 자체에 대한 거부감이 컸다. 프로그래밍이라는 작업이 두뇌 노동이고
방해받지 않는 독립된 작업공간을 좋아하다 보니 혼자 하는 것을 즐기는 경향도 느낄 수 있었다.

하지만, 지식과 경험이 자연스럽게 전달되는데 이보다 좋은 프랙티가 있을까? 동시에 서로간의 의사소통 비용을 엄청나게 줄인다. 작게는 서로 말하는 습성을 알게 되어 같은 말에 대해서도 이해가 깊어진다. 또한, 지속적으로 페어를 구성해서 작업하다보면 회의의 필요성은 급감하지 않을까?


6. Test-Driven Development

Test-driven이란 먼저 테스트 케이스(Test Case)라고 하는 테스트를 위한 코드를 먼저 작성하고, 해당 코드가 정상 작동하도록 실제 코드를 개발하는 것이다. 이러한 방식에 익숙하지 않은 사람들에게는 무척 버거운 일이 될 수 있다. 얼핏 보아도 코딩의 양이 두 배쯤 늘어나는 것으로도 보일 수 있다.

JUnit을 이용하여 실제로 이런 식으로 작업을 해보았지만 여간 번거로운 일이 아니었다. 그 필요성은 덩치가 커졌을 때 비로소 나타날 것이다.

좋은 습관이 좋은 인성을 만드는처럼
좋은 개발 습관을 통해 만들어진 코드는 그만큼 건강할 것이기 때문이다.


Test-driven 개발은 또한 두 가지 두드러진 장점을 가는다. 하나는 테스트 케이스들이 모여서 구성된 테스트 스위트(Test Suite)가 모이면 리팩토링(Refactoring)을 용이하게 해준다.

리팩토링은 기능은 그대로 두고, 중복 코드를 제거한다거 하는 등 구조를 개선하여 프로그램의 품질을 높이는 작업이다. 축적된 테스트 스위트는 기능이 정상 작동해주는지는 보장해주기 때문에 리팩토링 하면서 수시로 테스트를 해볼 수가 있는 것이다. 만일 이러한 테스트 스위트가 없다면 많은 개발팀에서 볼 수 있는 현상처럼 안돌아갈까봐 손을 못대는 현상이 빈번하게 발생할 것이다.

또 하나의 장점은 모듈간의 의존성을 낮춰준다. Test-driven 개발을 하다 보면 자연스럽게 테스트가 용이하게 프로그램을 구성하게 된다. 이는 외부에서의 의존도를 줄이는 결과를 초래하여 의존성이 감소하는 방향으로 발전할 가능성이 크다.


7. Collective Ownership

코드의 공동 소유. XP에서는 어떠한 모듈도 누구나 이를 작성하거나 수정할 수 있다. 다시 말해서 명확한 책임자나 소유자가 없다는 것이다. 그러면 문제가 생겼을 때는 누가 해결한다는 말인가?

여러분의 이해를 돕기 위해 내가 경험한 일화를 떠올려보겠다.
2002년의 이야기다. 한창 데이터를 분석해서 그래프를 그리고, 엑셀로 보고서를 작성하는 프로그램을 만들고 있었다. 나는 데이터 분석과 그래프 작성을 책임졌고, 나와 짝을 이뤄 작업을 하는 동료는 엑셀에 데이터를 뿌리는 일을 맡았다.

VB를 사용해서 작업을 할 때였는데 둘 다 오피스 라이브러리를 이용하여 개발해본 경험이 없어서 MSDN 등을 뒤지고 다녔다. 나는 테이블 조인해서 데이터를 분석하는 것으로 골치를 앓아 동료에게 오피스 프로그래밍을 위한 샘플 코드를 분석해서 방법을 알아내길 부탁했다.

그 친구는 무척 더디게 알아냈는데, 내 입장에서는 그 결과가 한심했다. 결국 내가 MSDN을 뒤져서 방법을 알아냈고, 그 친구에게 이를 가르쳐줬다. 그리고 나서 본격적으로 프로그래밍을 하는데 상대적으로 작업량이 작은 그 친구는 어떻게 하는지 모르겠다면서 자꾸 일을 미뤘다. 그 사이에 나는 1000라인이 넘는 코드를 작성하면서 세 개 이상의 테이블을
조인해서 분석 결과를 뽑아내느라 골치가 아팠다.

그 친구가 원래 작업을 마치고 내가 하는 부분을 도와줘야 하는데 상당히 간단한 작업이었는데, 허걱... 아직 시작단계였다. 나는 너무나 화가 나서 그 친구를 심하게 나무랬다.
다혈질인데다가 그 당시 스트레스가 심해서 욱하고 치밀어올랐다.

문제는 바로 작업 분담에 있었다. 일단 그 친구에게는 일의 양을 떠나 아직 익숙하지 않은 일이었다. 대개 숙련도가 낮은 친구에게 작은 양의 코드를 맡긴다는 것은 '어떻게 해서든 이거라도 해내라'라는 압력일 수 있다. 이는 아직 준비가 되지 않은 동료에게 책임을 떠넘기는 것이다. 따라서, 그 부분이 완성되지 않을 위험도 있는 데다가 설사 그 친구가 책임을 완수했다고 하더라도 품질은 어떨까?

그렇다, 결국 개발팀 전체가 결과에 대해 책임을 져야 한다. 숙련도가 낮은 친구가 있다면 그 친구에게 적은 양의 프로그램이라도 하라고 떠넘기는 것이 아니라 숙련도가 높아져서 다른 팀원들처럼 작업할 수 있도록 함께 프로그래밍 해야 한다. 이것은 Pair Progamming이 추구하는 것이 아닐까? 이것이야 말로 '팀'으로써 시너지를 극대화 할 수 있는 방안이 아니겠는가?
  1. RUP와 마르미를 비롯하여 'OOO CBD 방법론'으로 불리는 상당수의 방법론은 UP에 기반하고 있음 [본문으로]
Posted by 영회
Spring 프레임워크[각주:1]가 자주 공격받는 것중에 하나는 너무 복잡하다는 것이다. 그런 이야기의 대부분은 정황(Context)을 무시하고 복잡도 자체만을 문제 삼는다. 이는 Spring의 인기를 부정적인 방식으로 이용하려는 시도로 의심되는 논쟁일 뿐이다. 안타깝게도 프레임워크에 대한 이해가 깊지 않은 분들에게 Spring의 API[각주:2]의 복잡성이 결코 복잡한(?) 것이 아니라는 사실을 설명하기란 무척 어려운 일이다. 메타포를 활용해서 갑자기 설명해보고자 하는 충동에 글을 쓴다.

간결한 인터페이스의 위력에서 예로 들었던 이미지를 보자.


스티브 잡스가 iPod/iMac을 홍보하는 영상에서 iMac 리모컨과 경쟁 제품의 리모컨을 대비한 일이 있다. 사용자 인터페이스에 있어서는 애플이 한가닥한다. 최종 사용자 입장에서는 보편적으로, 어디까지나 보편적으로만 본다면 간결한 것이 최고다.

그러나, 최종 사용자를 위한 것이 아니라면 어떤가? 저러한 기기들의 기판도 단순한 인터페이스를 제공해야 하는가? 리모컨의 기판은 생소하니까 데스크탑의 메인보드를 떠올려보자. USB 포트가 하나라면 간결해서 좋은가? 슬롯은? 각종 포트는? 베이는?


이미지 출처: www.da-view.com/product-sogae/mb885.htm

Spring과 같은 프레임워크가 비슷한 인상을 주는 그림이다. 아래 그림과 대비해서 보면 더욱 그렇다.




확장성이 별로 없는 프레임워크가 무슨 가치가 있는가? 시키는대로 안하면 별로 할 수 있는 것이 없는 프레임워크라면, 프레임워크를 비켜가는 코드를 양산할 가능성이 높다.

Spring이 매력적인 이유는 그럼에도 불구하고 Spring은 충분히 심플하다는 점이다.(물론, 주관적인 척도에 근거한 판단이지만) 
  1. 이곳에 자주 들르는 분들은 내가 Spring의 팬이라는 것을 짐작할 것이다. [본문으로]
  2. javadoc 형태의 API문서가 아니라 프레임워크를 사용하는 프로그래머에게 노출되는 프로그래밍 요소를 의미한다. 구체적으로는 public method와 xml 문서 형식과 작성 방법 등이 예가 된다. [본문으로]
Posted by 영회
댓글로 rukxer님께서 추천해주신 해피해킹키보드, 일명 HHK. 직접 경험해보지는 않았지만, 최소한의 자판으로 최적의 조합을 만들어낸 것으로 짐작된다. 살벌한(?) 가격은 매니아층이 느끼는 만족감(Usability)을 대변해준다.



다기능 키보드와 함께 배열된 HHK[각주:1]. 선호에 따라서 어떤 것을 사용한다고 해도 전혀 문제될 것이 없다. 전제 조건은 어떤 인터페이스를 사용하더라도 동일한 작동을 보장해줘야 한다는 것이다. 물론, 윈도OS는 이런 것을 완벽하게 보장해준다.

인터넷 사용도가 늘어나면서 사용자 인터페이스의 다양화 현상은 두드러지다. 개인화는 이제 보편적인 현상이고, 위젯의 출현도 같은 맥락으로 볼 수 있다. 한편으로 하드웨어 가격이 낮아질수록 하드웨어 인터페이스의 다양화 현상이 두드러지게되는 것은 불보듯 뻔한 것이다. 앞서 하드웨어와 소프트웨어 인터페이스를 구분없이 혼용해서 이야기했다. 사실 사용자 입장에서는 두가지가 함께 활용될 때 의미를 지닌다.

잠시 개인적인 이야기로 흘러가면 사무실에서는 Dell사의 또각거리는 키보드를 쓰지만, 집에서는 i-rocks의 슬림 키보드를 쓴다. i-rocks의 키감은 너무나 만족스럽다. 재미있는 사실은 누구에게나 i-rocks 키감이 좋은 것은 아니란 점이다. 어떤 이들은 누르는 맛이 있는 키보드를 좋아하고, 어떤 이들은 향수가 느껴지는 기계식 키보드를 좋아한다. 내츄럴 키보드, HHK 팬들도 있지만, 익숙해서 좋다고 고전적인 밝은 회색의 바로 그것(?)을 선호하는 사람도 있다. 이렇듯 인터페이스에 대한 선호라는 것은 꽤나 다양한 법이다.

잠시 입장을 바꿔서 소프트웨어 개발자의 역할에 서보자. 다양한 인터페이스가 요구되는 추세가 요구하는 것은 다양한 요구 형태에 대응할 수 있는 유연한 애플리케이션 개발이다. 화면에 대한 종속성을 포함하는 코드가 최대한 배제된 채로 개발되어야 한다는 점이다. 물론, 현실적으로 화면을 구성하는 코드에 서버에 종속적인 부분이 포함되게 되어 있다. 그 부분을 최소화 하는 것이 유연성을 확보하는데 중요하게 된다. 웹서비스 기술(Web Services)이 이러한 시대적 환경을 토대로 등장한 기술 중에 하나이다.
  1. 오래전에 복사한 것이라 이미지 출처가 기억나지 않네요. [본문으로]
Posted by 영회
컴퓨터 과학분야에서 네임스페이스(Namespace)이름, 용어 혹은 단어 항목들을 위한 문맥(context)을 제공하는 추상적인 컨테이너(container)를 의미한다. 동일한 이름을 가진 항목이 다른 의미를 지닐 때 네임스페이스를 달리해주어 혼란을 막을 수 있다.

자바 API에 보면 두 개의 List 타입이 존재한다. 하나는 java.util.List 이고 다른 하나는 java.awt.List 이다. 이와 같은 표기를 Full Qualified Class Name 이라고 하는데, 여기서 동일한 이름에 다른 의미를 부여해주는 것은 패키지(Package)이다.

자바의 패키지와 네임스페이스는 거의 같은 개념이다. 닷넷 SDK 문서에서는 네임스페이스라는 표현을 사용한다. UML에서도 동일한 클래스를 구분하기 위해서 패키지를 사용하는데 역시 네임스페이스로 볼 수 있다.

W3C의 표준 중에서 XML Namespaces가 있다. XML 인스턴스에서 고유한 이름을 갖는 엘리먼트(elements)와 속성(attributes)을 제공한다. XML 네임스페이스를 활용하면 하나의 XML 인스턴스에서 동일한 이름을 갖는 엘리먼트나 속성이 다른 의미로 활용되게 할 수 있다. 앞서 설명한 네임스페이스와 동일한 역할을 한다.

XML 인스턴스내에서 사용할 XML 네임스페이스는 예약어인 xmlns 속성을 통해 선언해야 한다. xmlns 속성의 값은 URI (Uniform Resource Identifier) 참조를 나타내는 문자열이 되어야 한다.

참고
- 위키피디아: Namespace, XML Namespaces
Posted by 영회
@Transient는 엔티티의 프로퍼티가 영속성을 요구하지 않음(not persistent)을 표시한다. 예를 들어 다음과 같이 표기하면 Employee 엔티티의 currentUser 속성은 DB 테이블의 필드와 동기화 되지 않는다.

@Entity public class Employee {
@Id int id;
@Transient User currentUser;
... }
다음과 같이 자바의 transient 키워드를 사용하여도 동일한 효과를 얻을 수 있다.
@Entity public class Employee {
@Id int id;
transient User currentUser;
... }
@Id 등의 다른 애노테이션을 getter에 붙여 놓은 경우는 @Transient 역시 getter에 붙여야 정상적으로 적용된다. 이 경우 transient 키워드 역시 효과가 없다.

참고:
- JEE API: Transient
- Java Persistence with Hibernate 421쪽
Posted by 영회
@Id는 해당 프로퍼티가 테이블의 주키(primary key) 역할을 한다는 것을 나타낸다. 속성에 직접 @Id를 붙여주면 실행 시점에 객체의 필드를 통해 직접 접근하게 하는 것이며, getter를 이용하려면 getter에 @Id를 붙여준다. 속성에 부여하게 되면 setter/getter 없이도 작업이 가능하다. setter에 @Id를 붙이면 예외가 발생한다.

 @Id
 @GeneratedValue(strategy=GenerationType.AUTO)
 public Integer gettId() {
  return id;
 }

@GeneratedValue는 주키의 값을 위한 자동 생성 전략을 명시하는데 사용한다. 선택적 속성으로 generatorstrategy가 있다. strategy는 persistence provider가 엔티티의 주키를 생성할 때 사용해야 하는 주키생성 전략을 의미한다. 디폴트 값은 AUTO이다. generatorSequenceGeneratorTableGenerator 애노테이션에서 명시된 주키 생성자를 재사용할 때 쓰인다. 디폴트 값은 공백문자("")이다.

주키 생성 전략으로 JPA가 지원하는 것은 아래의 네 가지이다.
1. AUTO : (persistence provider가) 특정 DB에 맞게 자동 선택
2. IDENTITY : DB의 identity 컬럼을 이용
3. SEQUENCE : DB의 시퀀스 컬럼을 이용
4. TABLE : 유일성이 보장된 데이터베이스 테이블을 이용

postgres를 이용하여 테스트해보면 AUTO와 SEQUENCE는 실제 INSERT 쿼리가 일어나기 전에 다음 쿼리를 통해서 주키를 가져오는 것을 확인할 수 있다.
select nextval ('hibernate_sequence')

IDENTITY는 예외가 발생하고, TABLE의 경우 내부적으로 사용하는 것으로 추정할 수 있는 알 수 없는 값으로 id가 부여된다. AUTO 이외의 생성 전략을 사용할 경우 대상 DB에 대한 지식이 요구됨을 알 수 있다. 위의 네 가지 생성전략에 대한 hibernate의 내장 Generator 이름은 다음과 같다.
1. native : AUTO
2. identity : IDENTITY
3. sequence : SEQUENCE
4. TABLE에 대응하는 내장 Generator는 없음

이외에도 hibernate는 몇가지 생성 전략이 더 지원한다.


참고:
- JEE API: Id, GeneratedValue, GenerationType 
- Java Persistence with Hibernate 167쪽
Posted by 영회
데이터베이스 테이블에 매핑하려고 하는 엔티티(Entity) 클래스를 나타낼 때 사용
javax.persistence(Java EE 5)에 표준 JPA Annotation이 있다. 이클립스에서 Quick Fix 사용시 두 개의 패키지가 나오니 유의해야 한다.

사용자 삽입 이미지

선택적 속성으로 name이 있다. 엔티티의 이름으로써 쿼리에서 엔터티를 나타내는데 사용된다. 디폴트는 클래스 이름(the unqualified name of the entity class)이 된다. 주의할 점은 Java Persistence Query Language에서 쓰이는 예약어를 이름으로 부여하면 안된다는 점이다. JPQL은 표준화된 HQL의 하위 집합이다.

참고:
- JEE API: Entity
- Java Persistence with Hibernate 69쪽
Posted by 영회

영속성을 갖는 객체의 수를 결정하는 식별자 값의 데이터 타입은 범위를 고려하여 결정해야 한다.

정수형 타입(Integral Types)의 범위는 다음과 같다.

  • For byte, from -128 to 127, inclusive
  • For short, from -32768 to 32767, inclusive
  • For int, from -2147483648 to 2147483647, inclusive
  • For long, from -9223372036854775808 to 9223372036854775807, inclusive
  • For char, from '\u0000' to '\uffff' inclusive, that is, from 0 to 65535

    좀 더 사람이 기억할 수준의 정보로 대체하면
    byte(1) : -128 ~ 127
    short(2) : -32,768 ~ 32,767
    char(2) : 0 ~ 65535 (UTF-16)
    int(4) : -20억 ~ 20억
    long(8) : 헤아리기 힘든 수

    참고: The Java Language Specification 4.2.1 항목

  • Posted by 영회