다음과 같은 테스트케이스를 프로파일링 해봤습니다.

package kr.pe.okjsp.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;

import junit.framework.TestCase;

public class DateUtilTest extends TestCase {
 public void testIsValidDate() {
  assertTrue(isValidDate("20080229"));
  assertFalse(isValidDate("20090229"));
 }

 public boolean isValidDate(String date) {
  SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
  String format = null;
  try {
   format = sdf.format(sdf.parse(date));
  } catch (ParseException e) {
   e.printStackTrace();
  }
  return date.equals(format);
 }
}


TPTP를 이용해서 나온 프로파일링 퍼스펙티브의 좌측 Profiling Monitor에서 오른 버튼을 눌러나오는 Open With > UML2 Class Interactions 메뉴를 선택하면 다음과 같이 시퀀스 다이어그램이 나옵니다.

사용자 삽입 이미지


빨간 포인트가 실행시간이 가장 오래 걸리는 부분임을 알 수 있지만, 그래프의 길이가 불필요하게 긴 듯 합니다.
홈 아이콘을 클릭한 뒤에 제일 좌측에 있는 TestSuite 클래스를 가려보겠습니다. 오른버튼 클릭해서 Hide selected lifeline 을 선택합니다.
사용자 삽입 이미지

이런 식으로 TestResult 와 TestResult$1 을 가리면 다음과 같은 그래프를 볼 수 있습니다.
사용자 삽입 이미지

가려진 클래스를 다시 보게 하려면 우측 상단의 하얀 역삼각형 ViewMenu 를 선택하고 Hide/Display Patterns... 메뉴를 클릭합니다.
사용자 삽입 이미지
여기에서 체크를 지워주면 보입니다.
사용자 삽입 이미지

천천히 하나씩 알아가야죠. ^^

이클립스 3.4 버전 Ganymede에 대한 발표 개요입니다.

사용자 삽입 이미지
사용자 삽입 이미지

지난 번에도 언급했던 eBay 개발팀의 이클립스 플러그인 적용에 대한 후속글이 떴습니다.
http://www.ibm.com/developerworks/kr/library/os-eclipse-ebay2/index.html?ca=drs-kr

Megajars 라는 개념은 공감이 많이 갑니다.

소스 파일 수십만 개를 이클립스에서 실행해 본 적이 있는가? 실행하면, 시스템에 엄청난 부담을 주고, 많은 메모리를 필요로 해(이클립스에서 out of memory 예외를 받아 본 적이 있는가?), 시스템이 극단적으로 느려지는 원인이 된다. 이런 경우 시스템에서 실제 소스 코드를 받아 오는 대신 컴파일된 코드로 연결하는 것이 더 좋은 방법이 된다.

from: http://www.ibm.com/developerworks/kr/library/os-eclipse-ebay2/index.html?ca=drs-kr#N100F2

플러그인 만들기 어렵지 않다던데, 어서어서 실험해봐야겠습니다.
쩝.
어려운 단어 등장했습니다. 직교성. Orthogonality. 공업수학시간에 잠깐 배운 기억이 스쳐지나갑니다. 갑자기 이 단어가 요즘 제 뇌를 후벼팝니다. Working Effectively With Legacy Code 책의 후반부에 나오는 단어인데, 코드 리팩토링의 결정판은 궁극의 직교성이라고 얘기합니다.

말을 좀 쉽게 풀죠.
3차원 그래프라고 생각하시면 됩니다. x축, y축, z축이 있습니다. 왼쪽 그래프에서 보면 성별, 생일, 출생지가 있습니다. 세 기준이 각자의 영역에서 사람의 특성을 설명해주고 있죠. 각 기준은 독립적입니다. 다른 기준에 종속적이지 않습니다.
사용자 삽입 이미지
image from: http://www.itcon.org/1997/2/paper.htm

이것을 소스코드에 빗대어 설명하면 이렇습니다.
웹 페이지에는 HTML, CSS, Javascript가 있습니다. 각기 역할이 있죠. HTML은 컨텐츠 데이터, CSS는 렌더링 스타일, Javascript는 Behavior 즉 동작입니다. 각기 독특한 영역이 있는데, 이 코드를 분리해서 관리하는 것이 직교성이 있다고 얘기할 수 있습니다. 세 가지가 만나는 접점은 id 입니다.

이해가 좀 가시나요?

이럴 필요가 있는 것은 직교성이 무너졌을 때, 세 가지 코드는 뒤죽박죽 됩니다. 스타일 고치는데 Javascript 고쳐야하고, 동작을 고치는데, HTML과 CSS코드가 헤집어진다면 코드가 뒤섞여 있다는 뜻입니다.

휴~

어렵죠.

프로그래밍 코드의 영역에서도 마찬가지입니다. 비단 세 가지 축(3차원)만 있는 것이 아니라 다차원(Multi-demension)의 코드를 짤 때도 이런 컨셉으로 분리해서 짠다면 코드의 관리포인트를 분리해서 생각할 수 있습니다. 리팩토링이 바라보는 관점과 일견 같다고 할 수 있습니다.

관련 : Open/Closed Principle

참고: Working Effectively With Legacy Code, 285~286p
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지


사용자 삽입 이미지

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지


이상민님의 멋진 강의 감사했습니다. 8시 메인 강의 이전에 TPTP로 간략하게 프로파일링하는 세션을 제가 진행했습니다. 그날 빌린 장소의 전기가 안 도와주는 바람에 15분 늦게 시작했지요. 죄송하게 생각합니다.

이상민 님의 강의는 아주 재밌었습니다. 실무에서의 경험담이 재밌었고, 특히나 뚱뚱한 PM과 날씬한 PM 앞에서 대화법은 아주 촌철살인이었습니다. 체격이 마른 PM 앞에서는 특히 말 조심해야한다는 지혜의 말씀이었죠.

사용자 삽입 이미지
사용자 삽입 이미지
사용자 삽입 이미지

뒷풀이에는 15분 정도가 참가했습니다. 때문에 금요일 오후 강남역 부근에 일찍 자리를 잡아놓지 않아서 또 많이 헤맸습니다. ^^; 그래서 들어간 곳이 조개구이집. 그 더운 날에 남아서 얘기 나누신 분들께 또 한 번 죄송했습니다. ㅡㅡ;
사용자 삽입 이미지
사용자 삽입 이미지


혼자서 30명이 넘는 세미나를 주최하는 무리수는 두지 말아야 할 것 같습니다.
TPTP
Test and Performance Tools Platform
TPTP는 테스트 툴과 퍼포먼스 툴의 플랫폼 프로젝트입니다. 자바 프로그램 실행시 CPU, 메모리 등과 객체 호출 및 인스턴스의 갯수 상태를 확인하기 위해 만들어진 것입니다.
자바 VM 뿐만 아니라 OS 등과 맞물려 각종 정보를 수집합니다.

http://www.eclipse.org/tptp
Windows와 Linux 용 all-in-one 버전을 받아서 설치하면 간편하게 설치됩니다. Active Control Server의 설치가 자동으로 되기 때문이죠. 맥용은 없습니다. ㅡㅡ;

Run, Debug 에 이은 Profile 기능을 이용하면 다음과 같이 Monitor 탭이 생깁니다. Execution Time analysis 는 클래스, 메소드 간의 실행시간 등을 기초로 하여 실행과정을 보여줍니다.
사용자 삽입 이미지

실행을 하면 Profiling Manager View가 열립니다.
사용자 삽입 이미지

Execution Time Analysis를 클릭해서 열린 보다 구체적인 내용입니다.
사용자 삽입 이미지

아래 탭을 클릭하면 다른 내용들을 볼 수 있습니다. Call Tree 탭을 클릭한 경우 다음과 같이 CPU 소모비율도 확인 가능합니다.
사용자 삽입 이미지

Profiling Manager 에서 오른클릭메뉴로 UML2 Class Trace를 선택하면 시퀀스다이어그램을 볼 수 있습니다. 이거 대박이죠. ^^
사용자 삽입 이미지

Controller 와 Service의 차이점
레이어를 나누는 것은, 아, 티어(tier)라고도 합니다. ^^; 나누는 기준은 뭘까요. 그냥 나누는 사람도 많습니다. 레거시 코드들이 증인석에 출두할 수도 있으니까요.

2006년 스프링으로 프로젝트를 하면서 그 때는 이 고민을 하지 못했습니다. 납기일 내에 동작하는 프로그램을 만들어 내야 하니까요. 플젝이 끝나고 그것을 기반으로 확장하는 프로젝트가 많이 열렸습니다.
^^; 슬프게도 사람이 많이 바뀌었습니다. 히스토리를 알고 얘기해 줄 사람도 n모사 s모사로 가버린 다음이죠.

다행히 코드 리뷰라는 것을 새로운 플젝의 외주 사람들과 매일 규칙적으로 한시간 정도 안되게 하는데, 나온 질문입니다.

얘기가 긴 데요. It's a long story.

핵심은 request, response 같은 WAS 디펜던트 한 것을 서비스에서 처리하게 하면 안됩니다. 서비스는 WAS없이도 돌아간다라고 생각하고 짜야된다가 현재의 결론입니다.
^^;

사용자 삽입 이미지

아주 올드한 디버깅 자바부터 제가 갖고 있는 책은 7권 정도 됩니다.
디버깅 자바: 버그 잡는 방법에 대한 일반론부터 정책들까지 다뤄집니다. (2000년 번역)

실용주의 프로그래머를 위한 단위 테스트 with JUnit : 가장 얇습니다만 굉장히 실용적입니다. (2004년 번역)

이클립스 기반 프로젝트 필수 유틸리티 : 국내 최초의 협업을 주제로 한 책입니다. JUnit과 Ant의 랑데뷰가 그려집니다.(2004년)

테스트 주도 개발 : 이게 다 이 책 때문입니다. (2005년 번역)

지름길로 빠르게 배울 수 있는 자바 프로그래밍 : 미스테리한 책입니다. 일단 출판사가 교학사, 뚜시쿵!!! 원제는 Agile Java : Crafting Code With Test-Driven Development. 아하! 그럴만 하겠죠. 자바 기초 서적인데 Hello World 나오기 전에 JUnit부터 나옵니다. 말 다했죠. (2005년 번역)
Unit Testing In Java : 2004년에 사서 아직도 다 못 봤습니다. UI, 웹, 동시성 등 다양한 영역에서 테스트 방식을 알려줍니다.

Working Effectively With Legacy Code : 작년 11월에 사서 아직도 2/3밖에 못 읽었습니다. 혹자의 서평이 이 책은 TDD의 실무 적용판이다라고 적절하게 하신 듯 합니다.

이 외에도 더 있습니다. 기억이 나거나 습득하게 되는 대로 계속 포스팅하고 싶습니다. ^^
kenu-heoyi-macbook-air-2:Versions kenu$ ls -altr
total 56
drwxr-xr-x   3 root  wheel  102  1 14 14:12 1.3.1
lrwxr-xr-x   1 root  wheel    5  3  3 17:01 1.4 -> 1.4.2
drwxr-xr-x   8 root  wheel  272  3  3 17:01 1.4.2
lrwxr-xr-x   1 root  wheel    5  3  3 17:01 1.5 -> 1.5.0
drwxr-xr-x   8 root  wheel  272  3  3 17:01 1.5.0
lrwxr-xr-x   1 root  wheel    3  5  4 21:32 CurrentJDK -> 1.5
lrwxr-xr-x   1 root  wheel    3  5  4 21:32 1.4.1 -> 1.4
lrwxr-xr-x   1 root  wheel    5  5  4 21:32 1.3 -> 1.3.1
lrwxr-xr-x   1 root  wheel    5  5  4 21:32 1.6 -> 1.6.0
drwxr-xr-x   8 root  wheel  272  5  4 21:32 1.6.0
lrwxr-xr-x   1 root  wheel    1  5  4 21:32 Current -> A
drwxr-xr-x   8 root  wheel  272  5  4 21:32 A
drwxr-xr-x  14 root  wheel  476  5  4 21:32 .
drwxr-xr-x  11 root  wheel  374  6 30 07:07 ..
kenu-heoyi-macbook-air-2:Versions kenu$ pwd
/System/Library/Frameworks/JavaVM.framework/Versions

kenu-heoyi-macbook-air-2:Versions kenu$ which java
/System/Library/Frameworks/JavaVM.framework/Home/bin/java
kenu-heoyi-macbook-air-2:Versions kenu$



+ Recent posts