간혹 스프링 트랜잭션을 적용하였는데 예외 발생 시 롤백이 되지 않을 때가 있다.안되는 이유야 여러 가지가 있겠지만 난 그 중 한 가지 문제에 대해서 작성하려고 한다. 일단 테스트하는 스프링 애플리케이션 컨텍스트의 트랜잭션 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..
대게 서비스 개발 완료 후 상용 장비에 배포할 때 한 대에 하는 것이 아닌 여러 대의 장비에 배포한다.헌데, @Scheduled 애노테이션의 cron 표현식을 자바 코드 안에 넣게 되면 같은 시간에 여러 대의 장비에서 배치가 구동 될 것이기 때문에 문제가 발생한다. 그래서 프로퍼티로 크론 표현식을 분리했다. 다음은 SpEL 설정 부분인데 @Scheduled(cron = "#{appConfig['cron.time']}) 와 같이 하면 SpEL에서 값을 가져오지 못하고 오류가 발생한다. 오류가 발생되는 이유는?SpEL로는 설정 분리가 안 되는 것인가?잘 모르겠다. ㅠㅠ (알고 계신분이 계시다면 comment 부탁 드립니다.) 여하튼 다음과 같은 표현식을 통해서만 크론 표현식을 프로퍼티로 분리할 수 있다.
토비의 스프링 책을 보다 SpEL을 알게 되었고, 이를 샘플 프로젝트에 설정해 보았다.간단하게 끝날 줄 알았던 설정이 1시간 동안의 삽질을 선물해 주었고, 이런 삽질을 다른 분들은 겪지 마시길 바라며 SpEL 설정 시 조심해야 할 사항에 대해서 간략하게 정리해 본다. 기존 프로퍼티 설정은 전용 태그인 를 이용하였는데, 책을 보니 명시적이고, 이해하기 쉬우며 오류도 잘 잡아주는 SpEL 사용을 적극 권장하기에 이를 도입하기로 결정 프로퍼티 설정이 담겨 있는 설정 파일은 다음과 같이 xml 형식으로 되어 있다. (db-config.xml)database configcom.mysql.jdbc.Driverjdbc:mysql://localhost:3306/spring3lng198211111111 자. 이제 SpE..
스프링을 공부하다 보면 빈, 빈 팩토리, 애플리케이션 컨텍스트, 스프링 컨테이너, IoC 컨테이너 등 다양한 용어들이 나온다. 궁극적으로 이 용어들이 가리키는 것은 스프링 설정 xml 파일을 말한다.단순하게 스프링 xml 설정 파일을 가리키는 것 뿐이라면 왜 이렇게 많은 용어들이 탄생했고, 또 사용되어져 있는지 궁금하지 않을 수 없다. 솔직히 난 불편하다. (아주 쬐금~)가정 먼저 개발자들간의 커뮤니케이션 시 위에서 언급한 용어들을 무분별하게 사용하다보니 혼란스럽다.또한 애플리케이션 컨텍스트의 용어는 흔히 tomcat server.xml에 정의한 context를 말하는 것 같다. 물론 용어들을 세분화하면 각 용어들이 뜻하는 바를 정확하게 설명할 수 있겠지만 조금은 불편하게 사실이다. 여하튼 내 불만에 대..
[*.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..
spring 기반으로 되어 잇는 웹 어플리케이션의 web.xml에 대한 정리정리의 목적은 곧 있을 스프링 3.1 교육을 위해 머리로 알고 있는 것들을 기록으로 남겨 좀더 자세하게 정보를 전달하기 위함이다. 일단 web.xml은 서블릿 배포 서술자 (DD) 라고 부른다.영어로는 Deployment Descriptor DD의 용도는 WAS 구동 시 /WEB-INF 디렉토리에 존재하는 web.xml 파일을 읽어 들여 웹 어플리케이션 설정을 구성하기 위함이다. 가령 스프링, 스트럿츠 등 다양한 프레임워크를 사용하여 웹 어플리케이션을 구성하거나 로그, 인코딩 설정 등 초기 셋팅을 위한 설정 파일이라고 생각하면 된다.결국 설정을 위한 설정 파일이라고 정리되는 것인가? ㅋ DD 파일의 title 정도라고 생각하면 좋..
스프링 메타 애노테이션 이란? 스프링에서는 기본적으로 클래스 선언부 위에 @Component 애노테이션이 붙어 있으면 스프링 빈으로 생성한다.하지만 실무에서는 다음과 같이 한다.Controller 클래스에는 @ControllerService 클래스에는 @ServiceDAO 클래스에는 @Repository 위의 3가지 애노테이션도 스프링 빈으로 생성해주는 애노테이션들이다. 분명 위에서 설명하기를 @Component 애노테이션이 스프링 빈으로 생성해준다고 했는데 왜 위의 3가지 애노테이션도 빈으로 생성해 주는 걸까?이유는 @Component 애너테이션이 메타 에노테이션으로 달려 있기 때문이다. 이말이 무슨 말이냐하면@Target(ElementType.TYPE)@Retention(RetentionPolicy...
다음과 같이 동일한 이름으로 된 input file name을 submit하면 스프링의 CommonsMultipartResolver 는 "not supported by MultipartResolver" 라는 에러를 뱉어낸다. 이유인 즉슨, 스프링 2.5에서는 동일한 input type name upload를 지원하지 않기 때문이다. 이를 해결하기 위해 검색을 해보니, SimpleFormController를 이용하여 해결을 할 수 있다고 나온다.하지만 지금 진행하고 있는 프로젝트는 @Controller와 같이 애노테이션 기반으로 개발을 진행하고 있다. 그렇기에 다른 방법을 생각해 봤고, 나는 아래와 같이 처리를 하게 되었다. 1. application-context.xml 2. MultiFileSuppor..