싱글톤과 프로토타입 객체에 대한 성능 비교를 위해 아래와 같이 테스트 코드를 작성하였다. 싱글톤은 객체 한 개만 생성한 후 그 안에 있는 test() 메소드를 호출하였고, 프로토타입은 매번 객체를 생성한 후 test() 메소드를 실행하였다. 헌데 테스트 결과가 이상하다. 쓰레드 count 싱글톤 프로토타입 10,000 1.651초 1.594초 20,000 3.158초 3.306초 30,000 4.59초 4.978초 40,000 6.545초 6.261초 50,000 8.41초 7.81초 60,000 9.456초 9.65초 70,000 10.617초 11.552초 80,000 12.78초 12.752초 90,000 14.952초 14.354초 100,000 16.184초 15.169초 1,000,000 21..
#!/bin/sh LIB_CLASSPATH="/svc/idp/was/app/Altibase.jar"LIB_CLASSPATH="/svc/idp/was/app/idpWebApp/WEB-INF/classes:${LIB_CLASSPATH}" echo "$LIB_CLASSPATH" java -cp ${LIB_CLASSPATH}:. DecodeSocialNumber 리눅스에 특정 class 파일을 업로드한 후 커맨드 명령창에서 class를 실행할 일이 생겼다.DB에서 데이터 조회 후 파일로 데이터를 쓰는 작업인데 이클립스에서만 작업하다가 커맨드 명령창에서 자바 main을 실행하려고 하니 시행 착오가 많아 기록해둔다. DecodeSocialNumber 클래스에서는 아래와 같이 import문으로 다른 class를 사용..
2009년에 개발된 프로젝트를 맡게 되었다.헌데 이 프로젝트 개발 장비 및 상용 장비 빌드 처리 방식이 웃긴다.ant를 이용하는데 로컬 이클립스의 프로젝트 소스를 기반으로 war를 생성한 후 개발 장비 및 상용 장비에 FTP접근하여 war를 업로드 하는 식이다. 간단하게 설명하면 다음과 같은 방법으로 빌드를 한다.로컬 이클립스에서 ant 스크립트를 이용하여 war 생성개발 장비 FTP 로그인 후 war 업로드tomcat shutdown업로드 된 war 디렉토리에 존재하는 shell을 실행하면 기존 소스 백업 후 war를 푼다.tomcat startup 위와 같이 빌드를 하면 수작업으로 처리해야 할 일들이 많아지고, 결국 빌드 하는데 손이 많이 간다.더군다나 상용 장비는 총 4대이므로 한 장비 배포하는데 ..
공통 상수 값을 인터페이스에 정의하는 이유가 예전부터 궁금했었다.처음에는 메소드가 필요 없어서 interface로 설계를 했나라고 그러려니 했었는데 다른 사람이 만들어놓은 소스를 보다보니 그 이유를 알게 되었다. 아래 코드는 다른 사람이 작성한 코드의 일부분이다.public class MdnChangeServlet extends HttpServlet implements CodeDefinition { CodeDefinition 인터페이스에는 static 상수 값이 정의되어 있고, MdnChangeServlet에서 상수 값을 사용하기 위해 인터페이스를 구현했다.static으로 정의되어 있는 상수 값을 굳이 인터페이스 구현을 통해서 사용하려는 목적은 CodeDefinition.IS_CHECK 와 같이 코드를 ..
자바 1.5에서부터 제너릭 기능이 추가 되었다. 내가 아는 제너릭은 타입 캐스팅의 비용을 줄이고, 런타임시에 발생하는 오류를 줄이며, 가독성이 좋은 코드를 만들기 위해 나온 기술이라고 알고 있다.또 한 가지 제너릭을 통해 메소드의 return 타입의 제약을 해소하고, 타이트하게 문법을 체크하는 정적 타입 언어의 특성에서 동적 타입 언어와 같은 느슨한 스타일의 언어로 변화되기를 원하는 것 같다. 정적 타입 언어는 IDE툴을 이용하여 컴파일 타임에 문법 체크 및 오류를 사전에 발견할 수 있는 장점이 있다. 그러나 문법의 타이트한 체크로 인해 코드양이 많아진다.이런 단점을 자바에서는 제너릭을 이용해 해소하고 있다. 동적 언어는 런타임 시에만 문법 오류를 확인할 수 있고, 강력한 개발 도구도 많지 않다.또한 동..
현재 프로젝트에서는 commons dbcp pool과 tomcat jdbc pool을 사용하고 있다. 몇일 전에 스터디 그룹에서 나왔던 얘기가 apache commons dbcp는 하드웨어 멀티 코어를 제대로 활용하지 못해서 성능이 떨어지고, 소스 버전 업데이트는 거의 이뤄지지 않는다고 한다.몇 가지 더 알아보니 commons dbcp는 하나의 쓰레드를 사용하기 때문에 멀티쓰레드 안전성을 보장하고자 전체 connection pool에 대한 lock을 건다고 한다. dbcp의 단점에 비해서 tomcat jdbc pool은 하드웨어의 멀티 코어를 충분히 활용하고 성능이 좋다고 한다.성능이 좋다는 기준이 dbcp보다 좋은 건지 다른 컨넥션 풀링보다 좋다는 건지는 모르겠지만 어느 정도의 안전성을 보장한다는 의미..
[*.do에서 /* 로 바꾸게 된 이유]스프링 3.1 샘플 프로젝트의 web.xml(DD) 구성 시 url-pattern을 *.do와 같이 설정하였다. 이유는 단순하다.프로젝트를 진행할 때 항상 *.do를 사용했기 때문이다. 하지만 REST 방식의 웹 어플리케이션을 구성하기 위해서는 다음과 같은 URL 형식을 제공해야 하는데 현재는 *.do와 같이 되어 있기 때문에 pattern을 /* 와 같이 변경해야만 했다.http://localhost:8080/user/list [현상]이제 내가 만들어 놓은 프로젝트는 REST 방식을 지원하는 spring web application이 되었다.허나 controller mapping url을 호출하면 404 에러가 발생하면서 아래와 같은 로그가 찍힌다.No mappi..
콜렉션 클래스들은 저장된 객체들에 대한 순차적 접근을 제공한다.그러나, 순차적 접근이 모두 끝나기 전에 콜렉션 객체에 변경이 일어날 경우 순차적 접근이 실패되면서 ConcurrentModificationException 예외를 return하게 되는데 이를 fail-fast 방식이라고 부른다. Enumeration은 순차적 접근 시 콜렉션 객체에 변경이 일어나도 이를 무시하고, 끝까지 동작하는 반면에Iterator는 fail-fast 방식으로 동작한다. 아래는 fail-fast 동작에 대한 테스트 코드이다. 테스트 결과자바 콜렉션 프레임워크에 포함되어 있는 List, Vector, HashTable 등은 모두 fail-fast 방식으로 동작 Enumeration 인터페이스만 fail-fast 방식이 아님
@RunWith() 스프링의 테스트 컨텍스트 프레임워크 JUnit 확장 기능 지정 Junit은 각각의 테스트가 서로 영향을 주지 않고 독립적으로 실행됨을 원칙으로 하기에 @Test 마다 오브젝트를 생성한다. 이와 같은 Junit의 특성으로 인하여 ApplicationContext도 매번 새로 생성되기 때문에 테스트가 느려지는 단점이 있다. 그러나 @RunWith 애노테이션은 각각의 테스트 별로 오브젝트가 생성 되더라도 싱글톤의 ApplicationContext를 보장한다. @RunWith() 대신 AbstractJUnit4SpringContextTests를 상속받아 사용할 수 있음. @ContextConfiguration() spring bean 메타 설정 파일의 위치를 지정할 때 사용되는 애노테이션이며..
화면 입력, 수정, 상세 보기 페이지를 개발할 때 다음과 같이 두 가지 방법을 생각해 볼 수 있다. 첫 째는 insert.jsp, update.jsp, detail.jsp 세 개의 파일을 생성하여 각각의 화면 구성을 file 단위로 분리하는 것이고 둘 째는 memberInfo.jsp 와 같이 하나의 파일에 if(flag)와 같은 조건문을 추가하여 분리하는 것이다. 하지만 위의 두 가지 방법은 큰 문제가 있다. 코드의 중복이 발생하고, 당장은 개발이 편하고 고민할 거리가 없다고 생각하겠지만 이후 유지보수에 상당한 비용이 발생하게 되기 때문이다. 그럼 어떻게 하면 코드의 중복이 발생하지 않고, 유지보수의 어려움을 최소화 할 수 있을까? 나의 생각은 다음과 같다. 회원 가입 페이지 접근 시 memberInfo..
API에 있는 HashMap 클래스의 모든 메소드에 대해서 테스트 케이스를 작성해 보았다. 나 요즘 테스트 코드 작성하는 재미에 푹 빠진 것 같다. 아래는 소스 코드 게시판인 github gist를 이용하여 코드를 보여주고 있다.
synchronized 키워드를 사용하는 전형적인 3가지 케이스에 대해서 테스트 코드를 작성해 보았다. 첫 번째는 메소드에 synchronized 키워드를 추가하여 메소드 lock을 걸어주는 방법두 번째는 synchronized(객체)와 같이 객체의 레퍼런스 변수를 이용하여 lock을 걸어주는 방법세 번째는 synchronized(this)와 같이 메소드 구현부에 자기 자신의 객체에 대한 lock을 걸어주는 방법 테스트는 Junit을 이용하여 구현하였고, Junit으로 Multithread test 코드 작성 시 Program Argument 영역에 아래 옵션을 추가해 줘야 한다. 실행할 class 선택 후 오른쪽 마우스 클릭 > Run As > Run Configurations...Argument 탭으..
junit 테스트 메소드를 여러 개 생성하였을 때 특정 메소드에서만 테스트를 진행하고 싶을 때가 있다. 그럴 때에는 메소드 명에 살포시 커서를 올려 놓은 후 ctrl + F11을 누르도록 하자. 또 다른 방법은 @Ignore 애노테이션을 이용하여 테스트를 제외시킬 수 있다.
@Testpublic void if테스트() {boolean isSuccess = false;isSuccess = userIdCheck(); // 실패 return if (isSuccess = false) {assertThat(isSuccess, is(false));} else {fail("failed test case!!");}} public boolean userIdCheck() {return false;} 위의 테스트 코드는 실패일까? 성공일까?답은 실패이다. userIdCheck() 메소드에서 false를 return 받은 후 if 조건문에서 false라면 assertThat 테스트 코드를 만나야 하지만 fail 코드를 만나게 되어 테스트는 실패하게 된다. 이유가 무엇일까? if (isSucces..
Java generic에는 T(type), E(element) 가 있는데 이 둘의 차이점을 모르겠다.일단 이 둘의 차이점이 뭔가 확인하기 위해 다음과 같이 테스트 코드를 작성하였다. Element 클래스는 E 를 받을 수 있게 처리하였고, Type 클래스는 T 를 받을 수 있게 코드를 작성@Datapublic class Element { private E id;private String pw; } @Datapublic class Type { private T id;private String pw; } 도메인 클래스 생성 후 다음과 같이 Junit 테스트 코드를 작성위에서 생성한 Type, Element 클래스에 String 타입을 전달하였다.package generic; import static org...