Working Effectively With Legacy Code 내용 중에 테스트 가능한 프로그래밍 기법이 있는데, 재밌는 예제였습니다.
올바른 값을 가져오는지 테스트하기 위해서 탐침(probe)과도 같은 클래스를 만들어냅니다. 보통 메소드 안에서 흘러가는 흐름을 테스트 때문에 감지를 위한 것이지요.

package net.okjsp;
public class Car {
 public void 급정거(int level) {
  // ...
  System.out.println("버럭! "+level+"번");
  // ...
 }
}

저 부분을 테스트하기 위해서 코드를 분리합니다.

package net.okjsp;
public class Car {
 public void 급정거(int level) {
  // ...
  CarSpeaker speaker = new CarSpeaker();
  speaker.yell("버럭! "+level+"번");

  // ...
 }
}

CarSpeaker 는 내용을 감지하기 위한 미끼역할을 하게 됩니다.
package net.okjsp;
public class CarSpeaker {
 public void yell(String string) {
  System.out.println(string);
 }
}

테스트를 위해서 인터페이스를 뽑아냅니다.
package net.okjsp;
public class CarSpeaker implements Speaker {
 public void yell(String string) {
  System.out.println(string);
 }
}

package net.okjsp;
public interface Speaker {
 public void yell(String string);
}


그리고 speaker를 외부에서 지정할 수 있도록 필드로 만듭니다. 지정은 생성자에서 담당합니다.
package net.okjsp;
public class Car {
 private Speaker speaker;
 
 public Car(Speaker speaker) {
  this.speaker = speaker;
 }
 
 public void 급정거(int level) {
  // ...
  speaker.yell("버럭! "+level+"번");
  // ...
 }
}

이렇게 코드의 구성이 끝나면 감지를 전담하는 FakeSpeaker를 만들 수 있습니다.
package net.okjsp;
public class FakeSpeaker implements Speaker {
 String string;
 public void yell(String string) {
  this.string = string;
 }

 
 public String getString() {
  return string;
 }
}

테스트케이스는 다음과 같이 됩니다.
package net.okjsp;
import junit.framework.TestCase;
public class CarTest extends TestCase {
 public void test급정거() {
  FakeSpeaker speaker = new FakeSpeaker();
  Car car = new Car(speaker);
  car.급정거(1);
  assertEquals("버럭! 1번", speaker.getString());

 }
}


처음 코드 보다 설계는 복잡해졌지만, 테스트를 자동화하는 효과를 얻었습니다.
선택의 시간입니다. 그냥 System.out.println(">>>>"+level); 로 원본 클래스를 바꿔서 테스트할 것입니까, 아니면 테스트 케이스를 위해서 소스 코드의 설계를 바꿔서 하시겠습니까.

참고자료
Working Effectively With Legacy Code, Michael C. Features, Prentice Hall, P23-28
까오기님이 정리한 글
http://kkaok.pe.kr/servlet/KBoard?cmd=view&tableName=kmytip&flag=0&search=&findword=&gotoPage=1&seq=124

www.sdnkorea.com 에 기고한 내용입니다.

카멜레온 개발자

부제- 변화, 익숙하지 않은 것들에 대한 두려움

 

허광남

OKJSP.pe.kr 운영자

GS이숍 EC정보팀 재직

 

자바에 대하여

자바가 나온 지 10년이 넘었습니다. 1982년에 처음 베이직으로 프로그램을 짠 이후로 포트란, 어셈블러, C 등의 몇 가지 언어를 거쳐왔는데, 자바에 대한 첫 느낌은 문자열 처리가 C보다 낫기 때문에 좋았습니다.

1999년 취업을 하기 위해 SCJP과정을 거쳤는데, 당시 jdk1.1에서 1.2 버전으로 가면서 Java2라고 명명되고 있는 과정이었습니다. 그래서 제 SCJP 자격증은 버전이 1.1이었죠.

 

2001,2년 무렵 직장 생활 초기에는 웹을 주로 했기 때문에 jdk의 버전에 민감하지 않았습니다. 대신 OKJSP라는개인 사이트를 운영하면서 정보를 공유하다 보니 1.2에서 1.3으로 업그레이드 되면서 안정성이 높아졌다는 것을 간접적으로 알 수 있었습니다.

 

jdk1.3에서 1.4로 가면서 기능이 확장되었습니다. 로깅, XML, NIO API가 대표적이죠. 버전이 올라가면 항상 그렇듯이 버추얼 머신의 성능도 20%정도 향상됩니다.

 

Java5 2004 Tiger라는 이름으로 정식 출시 했습니다. 공교롭게도 지금 한국에서 작은 파란을 일으키고 있는 Mac OS X 10.4 버전과 코드명이 같았고, 같은 해 샌프란시스코의 바로 이웃한 곳에서 같은 시간 오프닝 쇼를 하고 있었습니다. 썬은 모스콘 센터에서 JavaOne 2004로 애플은 그 옆에서 WWDC로 말이죠.

Java5는 언어적인 완성도를 높였습니다. 제네릭(Generics), 어노테이션(Annotation) 등의 문법적인 변화가 가장 두드러졌습니다.

 

하나 더, 버전얘기를 하고 넘어가죠. Java5부터 jdk1.5 또는 Java5 라고 불려지기 때문에 혼동이 되고는 합니다. 제품 버전(Production Version Number) Java 5입니다. 그럼 1.5는 뭐냐하면 말이죠. 개발자 버전(Developer Version Number)입니다.

 

작년 2006 Java6 Mustang이라는 코드명에서 정식으로 출시되었습니다.

우리 말로는 모피코트로 유명한 무스탕이라고 발음하지만 영어식 발음은 머스탱입니다.

Jdk1.5와 비교해서 도구로서의 유용성을 강화하기 위해 Tools & Tool APIs영역에 jconsole을 추가했고, Integreation Libraries Scripting이 추가된 것을 알 수 있습니다.

 

사용자 삽입 이미지
 

내년 2008년에는 코드명 돌핀(Dolphine) 즉 돌고래가 Java7 으로 우리곁에 정식으로 선 보이게 됩니다. https://jdk7.dev.java.net/ 을 통해서 오픈된 상태로 java 7이 만들어지는 모습을 볼 수 있습니다.

 

 

자바 따라잡기

이렇게 열심히 발전하는 자바와 현실과는 괴리감이 없을 수 없습니다. 최근 두 가지 사건이 있었는데, 애플의 신작 OS 레오파드에 jdk1.5버전이 기본으로 들어가 있고, 맥용 jdk1.6은 프리뷰버전으로 개발도 완료가 안된 상태라는 것 하나와 구글이 야심작으로 내 놓는 안드로이드라는 모바일 애플리케이션에 Rjava라 하여 표준인 JME(Java Mobile Edition)와는 다른 버전의 자바를 내놓는 일이었습니다. 물론 위 그림에서 보듯이 제일 상위에 있는 Java Language에 대한 확장 API 세트가 달라지는 것이라 자바 언어 자체에 대한 도전은 아닙니다만, 현실의 자바는 업계의 이해관계와 맞물려서 쉽지 않은 과정을 거쳐가고 있습니다. 기업용 언어였던 코볼의 전성기를 자바가 차지하고 있기 때문에 거쳐야될 성장통이라고 보여집니다.

 

다른 한 가지 양상은 자바 개발자들의 헉헉 거림입니다. 새로운 기능을 써보고 싶은 것은 얼리어댑터의 특성을 가진 프로그래머들의 공통적인 성향입니다. 하지만, 기업내에서 실험적으로 무엇인가를 만들어 내는 일은 쉽지 않습니다. 더군다나 이미 소프트웨어를 통해서 비즈니스가 진행되고 있는데, 업그레이드를 위해서 그것을 바꾼다는 것은 컴퓨터를 모르는 사업주 입장에서는 무한도전이 아닌 무모한 도전입니다. 그렇기 때문에 기술의 발전과 기업 내에서 기술을 담당하는 인력과의 격차는 점점 커져가는 것이지요.

 

지식 산업에서 인력의 기술을 기름짜듯이 뽑아먹으면 짜고 남은 찌개미처럼 버려지게 됩니다. 오히려 사내 세미라든가 구글의 20:80 업무시간 처럼 개인의 발전을 모색할 수 있는 숨통을 열어줘야 합니다. 요즘 가장 좋은 방법으로는 오픈소스 활동이 되겠지요.

 

카멜레온이 몸의 색을 변화시키는 것을 보면 생존을 위해서 참 피곤하게 산다라고 느낄 수도 있습니다만, 그렇기 때문에 카멜레온이라는 단어의 뉘앙스를 만들어 낼 수 있었습니다. 터미네이터2에 나오는 T1000처럼 완벽하게 몸을 바꾸기는 어렵겠지만, 개발 트렌드를 잘 따라갈 수 있는 스터디 모임이나 소규모 자체 프로젝트들을 자주 접하는 것이 좋을 것 같습니다. 회사 탓하고 앉아있으면 옛날 얘기하는 관리자 되기 쉽상입니다.

 

인간의 본성 가운데 익숙하지 않으면 두려움을 느끼게 됩니다. 익숙해지는 방법이 있습니다. 흔히 얘기하죠. “자꾸 해보면 늘어

 

관련

https://jdk7.dev.java.net/  java 7 정보

https://jdk6.dev.java.net/  java 6 정보

 

Eclipse Code Refactoring

toz 강남대로점

2007/11/01(목) 19:30~21:30 (2시간)

10,000원

15명


메일로 신청받습니다.

kenu 골뱅 okjsp.pe.kr


이름:

닉네임:

이메일:

휴대폰:


간만입니다.

Java, F'cked up by Apple.

메일링 리스트에서 이리도 공분을 자아내는 날은 처음이었습니다. 10월 26일 애플의 새로운 OS X , 레오파드가 출시된 날이었지요. 몇 달 동안 기다려온 가장 대중적이고, 가장 훌륭한 마케팅으로 손꼽히는 그런 OS였습니다.

나왔죠.

그런데, 빠진 게 있습니다. 자바 개발자들에게 말이죠. 일반 사용자는 모르는 일이고, 알 필요도 없는 일입니다.
사용자 삽입 이미지

바로 java "6"가 들어가 있지 않고, 구닥다리(? 벌써 이 말을 들어야 했던가요. 사실 저도 잘 못씁니다.) java "5" 가 깔려 있습니다. 제가 아는 바로는 OS X 10.5 인 레오파드에서 돌아가는 Java 6는 Preview 버전 밖에 없습니다. 정식 버전은 없는 것이죠.

그래서 다음과 같이 자바 개발자 블로그세상은 난리가 났습니다.

Title

Views

Blog

Apple OS X Leopard: Realizing our worst fears

85

Ghetto Java

Apple OS X Leopard doesn’t have Java 6

84

Javablog

Java Apple, Everything you need to know

81

New Adventures In Software

I feel betrayed

67

Labora

Java and Apple: Fallen from love

58

Stephans Blog

Quietly, Shale seeks merger with MyFaces

54

Ghetto Java

Comic: Apple’s Pathetic Java Support? Oh Really?

53

It's Just a Bunch of Stuff That Happens

Making BufferedReader Iterable

52

View from the Fringe

Java desktop wishlist for 2008

52

Pushing Pixels

Please Steve, may I have some Java?

51

Pure Danger Tech

Fluent Programming in Ruby

48

davidflanagan.com

Code That Defines Apple and Java 6

46

Javalobby Front Page

Chumby: Digital picture frame for parents and much more

45

Alex's Outer Thoughts » Java

Joining Sun Developer Network Is a Win-Win for Developers

45

java.net Weblogs

Where it JDK 1.6?

43

Latest entries from kirk.blog-city.com

My "Ajax Experience"

42

DZone: java

We are on Mac OS X 10.5 Leopard now…….

41

Dongyi == 冬屹

My work here is done...

40

Raw

True Nature

39

java.net Weblogs


절반에 가까운 포스팅이 이번 일에 대한 짜증, 실망, 분노, 좌절을 표현한 블로깅입니다.

반대로 Ruby on Rails를 가장 개발하기 좋은 OS가 레오파드라고 선전하고 있다고 하는데, 순간 자바 개발자들은 바보가 된 느낌입니다.

Java 5는 2004년에 정식 출시 되었고, Java 6는 2006년에 정식 출시 되었습니다. 현재 http://java.sun.com 에서 공식적으로 지원하는 버전이 Java 6이지요. 2008년 내년엔 Java 7이 정식으로 출시될 것을 기다리고 있는 중입니다. 이러한 데 최신의 OS에서 Java 6가 찬밥 대우를 받으니 충격인 것이죠.

자바 개발자들은 MS쪽 개발자들보다 더 애플의 맥을 좋아라 하는데, 이번 애플의 작태는 좀 잔인했습니다.

두고 볼 만한 재밌는 일입니다.


related:
http://developer.apple.com/ 애플 개발자 지원 페이지
http://javablogs.com/ 자바 개발자 메타 블로그
관련글 : http://okjsp.tistory.com/1165643085 
모임을 만드신 윤순호 님입니다.


아래는 정준호 님입니다. 저와는 2000년 가을에 만났던 분이고, 7년만의 만남인데, 멋진 팀장님이 되셨네요. 정말 반가웠습니다.






jdk1.6에 같이 들어있군요.
프로그램 설치/제거에서 java DB 항목이 있길래, 어? 이거 언제 깔린거지 생각했었는데, jdk1.6 다시 설치하다보니 들어있군요.

java db - apache derby

java db - apache derby

아주 오래 전 jsp나 ejb책을 보면 나오는 cloudscape 라는 db가 오픈 소스로 변하면서 apache derby가 된 것인데, 이제는 자바개발키트에 기본 포함이군요.

시장 선점을 어떻게 할지는 미지수입니다. mysql이나 cubrid같은 오픈소스DB들의 지원이 막강하기 때문에 말이죠.

자바를 하다 보면 소스 날려먹고, class 파일만 갖고 서비스하는 곳도 있습니다.
이클립스에서는 class 파일만 있는 디렉토리도 참조할 수 있도록 되어있습니다.
디컴파일할 것이 아니라면 이런 클래스들은 jar로 압축해서 관리하는 것이 괜찮습니다.
예를 들어 cos.jar 가 압축이 풀린 상태로 있다면 다음과 같은 디렉토리 구조를 가질 것입니다. jar는 처음부터 없다고 가정하겠습니다.


사용자 삽입 이미지

주의할 점은 class의 루트는 com이 아니라 classes 폴더입니다. 패키지별로 폴더가 구성되는데, 최상위 패키지가 있는 폴더가 기준 위치입니다.
사용자 삽입 이미지

자바계열 프로젝트 속성에서 Java Build Path를 선택하면 나오는 화면입니다. Libraries 탭을 누르면 보입니다. 여기서 우측에 있는 Add Class Folder 버튼을 선택합니다.
사용자 삽입 이미지

클래스의 기준폴더를 선택합니다.

사용자 삽입 이미지

완료된 모습입니다.

좋은 하루 되십시오. ^^
얼마 전 간단한 로직을 구현해서 공개를 한 적이 있습니다. 웹2.0 스타일로 시간을 표시해 주는 기능인데, 간단한 것입니다.
시간 표시를 몇 초전, 몇 분전, 몇 시간전, 몇 일전 처럼 표시해주는 기능입니다. 제 사이트(www.okjsp.pe.kr)에도 적용을 시켰고, 소스를 공개하니까
www.javarss.pe.kr 운영자이신 서영아빠님도 잘 적용하였다고 말씀하시네요.
은근히 기쁘더군요.

어제 처음으로 버그리포팅이 들어왔습니다. 그래서 테스트 케이스에 버그가 발생되는 일자를 테스트 시료로 넣고 어플리케이션을 수정했습니다.
에러가 날 만한 곳에 브레이크 포인트를 찍고 변수 값을 확인하고, 로직을 보강했습니다. 추가한 테스트가 통과를 하고, 전체 테스트를 수행했습니다.
이것을 회귀 테스트(Regression Tests)라고 하죠. 이번 수정이 다른 쪽에 영향을 미쳤는지, 어디에 값이 틀어지는지 확인하는 것입니다.
전체 테스트도 이상이 없는 것을 확인했습니다. 안심하고 사이트 소스에 반영을 시켰고, 수정이 완료된 프로젝트를 전체 압축해서

마이너 버전을 올린 후에 공개했습니다.
http://code.google.com/p/daysago/

더 자세한 이야기는 다른 글로 얘기하도록 하겠습니다.

구글 광고 같지만, http://code.google.com/ 의 Project Hosting을 통해서 소스를 다른 사람들에게 공개하는 오픈소스 활동을 시작할 수 있습니다.

오픈소스 프로젝트 호스팅 by google

오픈소스 프로젝트 호스팅 by google

두 개의 프로젝트의 차이점은 일반 자바 애플리케이션이냐 웹 애플리케이션이냐 입니다. 그에 따라서 개발하는 소스의 디렉토리 구조가 달라집니다. 이클립스에서 프로젝트 아이콘의 모양도 차이가 있습니다. J 글자는 Java라는 의미이고, 웹프로젝트는 동그란 지구 이미지가 하나 더 붙어있습니다.
Java Project and Dynamic Web Project

Java Project and Dynamic Web Project


일단 eclipse 3.3 wtp에서 옵션 조정없이 Java 프로젝트와 Dynamic Web Project를 만들어서 설정파일을 비교해 보았습니다. 퍼스펙티브는 모든 파일이 다 보이는 Resource Perspective로 정했습니다.
compare with each other

compare with each other


만들어진 두 개의 프로젝트를 선택하고 Compare With > each other를 선택합니다. 두 프로젝트의 디렉토리, 파일이 비교됩니다.

directory, file diff

directory, file diff

.classpath 파일은 프로젝트의 클래스패스가 지정되는 파일입니다. 이 파일 덕분에 환경변수에 클래스패스를 지정하는 고전적인 자바 개발법에서 벗어날 수 있죠. 하단의 파일 비교를 보면 웹 프로젝트 쪽에 2줄이 더 추가된 것을 알 수 있습니다.
일반 자바 프로젝트에서 자바 웹 프로젝트로 변하면서 추가된 디렉토리는 .settings , build, WebContent 디렉토리 셋입니다. build/classes 디렉토리는 bin 디렉토리의 대체입니다.
.project를 더블클릭해서 비교해 보시면 프로젝트 속성이 어떻게 변경이 되었는지 확인할 수 있습니다.

이런 리포팅을 받았네요.

http://www.okjsp.pe.kr/seq/101472
김기사  2007-08-09 14:07:42.0 
 
jsp 강좌중에 이클립스 소개한 페이지요... 
이클립스좀 볼려고
옥희네 jsp 강좌에 이클립스 부분(리스트에서 가장 첫번째)

이클립스 한글 문서라고 되어 있어서 그거 클릭했떠니..
성인사이트... 일부로 그러신건가요.. 4번이나 클릭해봤습니다.

잘못 된건지. 알고..

뒤에서 봐 버린 여자 웹디.. 두둥...

2002-09-29 일자로 된 참고사이트 중에 운영을 멈춘 사이트 링크가 문제였습니다.
제 기억으로는 일본자료 번역해서 아주 좋은 내용이 있어서 링크를 소개한 것입니다.
하지만 그 운영자도 사이트 운영을 포기한 듯 합니다.
8년동안 벌써 몇 개나 좋은 사이트들이 사라집니다.

자바 jsp 관련 커뮤니티나 사이트 도메인 등이 사라지는게 맘이 아픕니다.
존재의 의미도 있는데, 외부 링크 조심해야할 것 같습니다.
가능하면 허락받고 로컬에 복사본을 두고 운영해야할 것 같습니다.

+ Recent posts