나는 어떤 문제를 풀 때 항상 코딩을 먼저 시작한다. 헌데 이와 같이 생각하지 않은 상태에서 바로 코딩을 하게 되면 알고리즘이 산으로 가는 일이 비일비재하였고, 가장 큰 어려움은 잘못된 알고리즘으로 인한 틀에 갇혀 시야가 좁아진다는 것이다. 결국 1시간 만에 할 수 있는 일을 하루 종일 투자하여도 해결하지 못하는 일이 발생하였다. 이제는 이와 같이 개발을 하면 안되는 것을 느끼기에 다음과 같이 룰을 정하고, 이에 맞게 처리하고자 한다. 1. 풀어야 하는 문제를 종이에 서술형으로 작성한다.2. 서술형으로 나열된 문장에서 변수로 선언할 것들에 동그라미를 친다.3. 조건문에 해당하는 부분은 세모를 친다.4. 변수 네이밍을 한다.5. 코딩한다.6. 성공 케이스의 테스트를 한다.7. 실패 케이스의 테스트를 한다...
enum을 이용하여 클래스를 정의하면 어떤 원리에 의해서 싱글톤으로 제공하는지, 그리고 멤버 변수가 있는데도 thread-safe한지 그 이유에 대해서 알아봤다. public enum EnumClassTest { INSTANCE1("instance1"), INSTANCE2("instance2"); static {System.out.println("init!!");} private String objName; private EnumClassTest(String objName) {this.objName = objName;} public String getObjName() {return objName;} public static void main(String[] args) {EnumClassTest[] typ..
간혹 스프링 트랜잭션을 적용하였는데 예외 발생 시 롤백이 되지 않을 때가 있다.안되는 이유야 여러 가지가 있겠지만 난 그 중 한 가지 문제에 대해서 작성하려고 한다. 일단 테스트하는 스프링 애플리케이션 컨텍스트의 트랜잭션 AOP 설정은 다음과 같이 선언적 트랜잭션을 사용하였다.service 패키지 하위에 있는 모든 클래스 중 insert*, delete*, update* 이름에 매칭되는 메소드에 트랜잭션 설정 테스트 코드는 다음과 같다.문제가 발생되는 원인에 대해서 보여주려고 실패 case에 대한 메소드를 생성하였다.@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = {"/test-application-context.xml"}..
프로젝트를 완료하고, 상용에 배포를 하면 버그가 발생하는 일이 많다.하지만 이런 버그들이 대부분 고객에 의해 발견 되고, 고객 불만으로 접수가 되어서야 문제의 원인을 찾은 후 대처 하는 경우가 많다. 또한, 버그가 발생하고 있는 상태로 방치되어 있다가 결국 고객 민원까지 가서야 발견되는 경우도 비일비재했다. 그래서 이런 예외들을 인터셉터의 afterCompletion 메소드를 이용하여 DB에 저장 후 이를 개발자의 메일로 하루에 한번씩 전송하는 방법을 생각했다. 아래와 같이 메소드 오버라이드 후 예외를 확인하기 위해 로그로 남겨 테스트를 진행해 보았다.@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse r..
스프링의 트랜잭션 AOP는 기본적으로 서비스 계층의 interface를 JDK 다이내믹 프록시 기술을 이용하여 AOP를 지원하지만 인터페이스가 없다면 CGLib를 이용하여 클래스 프록시를 생성한다. 만약 CGLib를 이용한 클래스 프록시를 사용한다면 클래스 패스의 라이브러리에 cglib-x.x.jar 가 있어야 한다. 주의 사항은 final 클래스에는 클래스 프록시를 적용할 수 없다는 것이다.클래스 프록시는 타깃 클래스를 상속해서 프록시를 만들기 때문에 상속을 할 수 없는 final 클래스에는 적용하지 못한다. 또한, 클래스 프록시를 적용하면 클래스의 생성자가 두 번 호출된다. 첫 번째 생성자 호출 로그 (프록시 오브젝트)create bean : com.kyu.svc.component.user.servi..
스프링에서는 예외 발생 시 HandlerExceptionResolver가 예외를 처리하도록 위임할 수 있다. 그래서 난 아래와 같이 SimpleMappingExceptionResolver를 정의한 후 예외 종류에 따라서 사용자에게 보여주는 화면을 달리하였다.common/error/businessLogicErrorcommon/error/runtimeErrorcommon/error/defaultErrorcommon/error/defaultError 헌데, HTTP 404에 대한 예외 처리는 SimpleMappingExceptionResolver에서 처리를 하지 못한다. 스프링의 @RequestMapping 애노테이션에 정의되지 않은 http://localhost:8080/notFoundRequestMappi..
"클래스나 모듈은 확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다" 난 위의 OCP 정의를 처음 접했을 때 이해가 되지 않았다.헌데 토비의 스프링3.1 책을 읽게 되면서 그 의미를 이해하게 됐고, 내가 이해한 것을 토대로 예제 코드를 작성해 보고 싶었다. 아래 예제 코드는 실제 OCP 원칙을 지키지 않은 상태에서의 코드를 보여 줄 것이며 이로 인하여 발생되는 문제에 대해서 설명한다.그런 후 OCP 원칙을 잘 지키는 코드를 설계하여 개방 폐쇄 원칙이라는 것이 얼마나 코드를 유연하고, 확장성 있게 만드는지 알아볼 것이다. 예제는 컴퓨터와 키보드 이 두 가지를 이용하여 설명할 것이다.컴퓨터가 부팅을 하면서 키보드를 연결하는 상황이며, 실제 아래와 같이 컴퓨터 소프트웨어를 설계하고 납품을 하게 된다면 어떤..
spring 테스트 시 이클립스의 Templates 기능을 사용하면 훨씬 편리하게 테스트를 할 수 있다. 예를 들어서 스프링의 테스트 컨텍스트를 생성할 때 우리는 항상 @RunWith, @ContextConfiguration 애노테이션을 추가한다.매번 테스트 클래스를 생성할 때마다 복사해서 붙여 넣는 것도 귀찮고, 그렇다고 타이핑하기에는 시간이 아깝다. 그럼 이런 반복적인 작업을 어떻게 하면 개선할 수 있을까?그 방법은 자동화할 수 있는 툴을 적극적으로 이용하는 것이다. 그래서 난 이클립스의 Templates을 이용하여 이런 반복적인 작업을 단순화 시켰다. (예전 스터디 모임에서 어느 분이 알려주신 방법이다.) 가령 class 선언부의 위쪽에 커서를 놓은 후 springtest 라고 입력하고, ctrl ..
싱글톤과 프로토타입 객체에 대한 성능 비교를 위해 아래와 같이 테스트 코드를 작성하였다. 싱글톤은 객체 한 개만 생성한 후 그 안에 있는 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..
간혹 테스트를 위해 수백만 건의 데이터를 테이블에 넣어줄 일이 생긴다.그럴때 다음의 프로시저 샘플을 이용하여 데이터를 밀어 넣자. DELIMITER $$DROP PROCEDURE IF EXISTS FILL_RATE_TEST_DATA$$CREATE PROCEDURE FILL_RATE_TEST_DATA()BEGINDECLARE i INT DEFAULT 1;DECLARE log_date VARCHAR(255);WHILE i
#!/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대이므로 한 장비 배포하는데 ..