Dynamic Code Evolution VM (DCEVM) 우연하게 Hotswap 기능을 제공해 주는 DCEVM 오픈 소스를 알게 되었다.그것도 공짜이면서 설정이 복잡하지도 않고, 간단하며 hotswap이 빠르게 적용된다. 방금 적용 한 후 테스트를 해보니 hotswap이 정상적으로 동작하는 것을 확인했다.저장할 때 마다 hotswap을 진행하는데 reload 속도도 빠르고, 최초 애플리케이션 구동 시 오래 걸리지도 않는다. 설치 방법은 다음과 같다. 1. DCEVM 다운로드https://github.com/dcevm/dcevm/releases 페이지 이동 후 최신 버전을 다운로드 받는다. 2.다운로드 받은 installer-light-jdk7u51.10.jar 파일을 더블 클릭하면 다음과 같은 화면이..
메이븐 멀티모듈 프로젝트로 개발을 하게 되면 jar 또는 war와 같은 형태로 서브 모듈을 구성하게 된다. jar 파일에는 대게 공통적으로 사용되는 java 코드들을 몰아 넣고, 메이븐 빌드 시 war 프로젝트의 WEB-INF/lib 디렉토리에 배포하여 사용되어지는데 jsp, css, js 같은 파일들도 이와 같이 사용하기 위해서는 어떻게 해야 하는지에 대해서 찾아보았다. 방법은 간단하다. (servlet 3.0에서만 가능)다음과 같이 META-INF 하위에 resources 디렉토리를 생성한 후 그 안에 여러 프로젝트에서 공유할 resource를 추가해 주면 된다.META-INF/resources/image/test.pngMETA-INF/resources/css/test.cssMETA-INF/resou..
Apache HTTP Client를 이용하여 multipart/form-data content-type으로의 요청을 서버로 보내는 유틸을 개발하게 되었다.흔히 웹 브라우저에서 파일 첨부를 한 후 "저장하기" 버튼을 클릭했을 때의 동작을 Java 코드로 구현하는 것 뿐이다. client와 server코드를 완성한 후 서버측으로 다음과 같은 정보로 요청을 보냈다.request URL : http://localhost:8080/file/upload업로드 파일 : test.txt, test1.txt 로그 레벨을 DEBUG로 설정한 후 파일 업로드 요청을 보내게 되면 다음과 같은 request raw 데이터가 남게 된다.실제 client 에서는 다음과 같은 데이터를 서버로 보내게 되는 것이다. multipart/..
요즘 자바8이 대세이고, 앞으로를 위해 hello world를 찍어보고자 한다. 지금 사용하고 있는 이클립스 버전이 indigo(3.7)인데 안타깝게도 1.7까지 밖에는 지원하지 못하는 관계로 kepler(4.3)을 설치하게 되었다. 설치만 하면 바로 자바8 코딩이 가능할 줄 알았지만 플러그인을 설치해야지만 가능하니 marketplace에서 다운을 받도록 하자. "Java8"로 검색하기만 하면 "Java 8 support for Kepler SR2"가 나오니 해당 플러그인을 설치하기만 하면 된다. 메이븐 프로젝트를 생성하고, Java Build Path에서 JDK8 라이브러리를 추가해 주고, Java Compiler에서 컴파일 레벨을 1.8로 지정해주기만 하면 설정 끝~ 람다 표현식을 쓴것과 안 쓴것을 ..
현재 진행하고 있는 프로젝트에서 Tiles를 사용하고 있는데 다음과 같이 defaultLayout의 left를 동적으로 바꿀 수 있는 방법에 대해서 얘기가 나왔다. 흔히 tiles를 이용할 때 사용하는 방법은 다음과 같이 새로운 definition을 정의한 후 body와 left를 put하는 방법을 이용한다. 하지만 특정 요구 사항으로 인하여 xml 설정이 아닌 코드를 이용하여 left 영역을 동적으로 바꿀 수 있는 방법을 찾아야 했다. 찾아보니 ViewPreparer 인터페이스가 있었고, 해당 인터페이스를 구현하면 tiles definition을 렌더링하기 전에 execute 메소드가 실행된다. 해당 메소드 안에서 다음의 코드와 같이 putAttribute 메소드를 이용하여 layoutId 변수 값에 ..
HTTP request 시 json 스트링을 서버에 넘겨주고, 서버는 interceptor에서 먼저 HTTP request body에 있는 json 스트링을 읽어와 값에 대한 체크를 진행하는 로직을 개발하고 있었다. json 스트링 검증 후 spring controller에서 @RequestParam 으로 데이터를 받으려고 할 때 다음과 같은 예외가 발생java.lang.RuntimeException: java.io.EOFException: No content to map to Object due to end of input interceptor에서 request body의 데이터를 이미 읽어 들였기 때문에 나오는 증상이다.시퀀스 다이어그램으로 표현하자면 다음의 4번에 해당하는 부분에서 예외가 발생된다...
Cafe24에서 호스팅 받고 있는 장비의 tomcat이 느린 것 같아 이를 모니터링 할 수 있는 툴을 찾아 보았다. 그중에서 가장 눈에 띈 것은 JConsole 인데 로컬 환경에 JDK 설치 시 기본적으로 탑재되어 있는 Java 모니터링 툴이다. 내 로컬 PC에서 Cafe24에 호스팅 하고 있는 tomcat 장비에 접속하기 위해서는 다음과 같은 설정을 추가해 줘야 한다.나는 ${CATALINA_HOME}/bin 디렉토리의 catalina.sh 쉘 파일에 다음의 설정을 추가해 주었다. (port는 9999로 설정)export JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.su..
지금껏 테스트 케이스를 작성할 때 public 메소드를 통하여 private 메소드를 테스트 하곤 했는데 private 메소드를 테스트 할 일이 생겨 reflection을 이용하여 유틸 클래스를 작성하게 되었다. private 접근 제어자가 필드 및 메소드에 존재할지라도 외부 클래스에서 setAccessible(true)로 지정하면 접근이 가능하다. 한 가지 아쉬운 점은 reflection을 이용하여 메소드 테스트를 하고 싶을 때 메소드 이름을 문자열로 넘겨야 한다는 것이다. 이와 같이 메소드 이름을 하드 코딩으로 넘기게 되면 리펙토링에 취약하다는 단점이 있다. (private method 이름을 바꿔버리면? 테스트 실패) powermock 라이브러리도 private method를 테스트 할 때 메소드 ..
제너릭 메소드를 만들다 문법이 잘 기억이 나질 않아 테스트 코드를 작성해 보았다.내가 헷갈려 했던 부분은 다음의 코드에서 T 부분이였다. public T getObj(String objKey, Class type) { 정리를 하자면 는 메소드 아규먼트에 타입 매개변수 T가 선언되어 있으면 추가되어야 하는 것이고, 그 옆에 있는 T 는 return type을 의미한다.이제 정리가 되었으니 테스트 코드를 작성해 보자. 테스트 코드는 Map 객체에 저장되어 있는 특정 클래스 type을 추출하는 방식이다.첫 번째 방법은 제너릭을 사용하지 않은 방법이고, 두 번째 방법은 제너릭을 사용한 방식이다. 코드를 보면 알겠지만 첫 번째 방법은 Map에 저장되어 있는 객체를 추출하기 위해서 여러 개의 메소드를 생성해야 추출..