query bean의 찾을 수 없단 오류
query bean을 찾을 수 없다는 오류가 납니다.
특이한 것은
같은 DB로 Local PC로 접속해서 실행하면 문제가 없는데
개발서버에서만 이같은 메시지가 보이고 있습니다.
설정문제일것 같은데 ...
도움 부탁드립니다.
======= 에러 로그 ===================================================
org.springframework.context.NoSuchMessageException: No message found under code 'error.sembomsearchserviceimpl.selectmodifybomlist' for locale 'en'.
at org.springframework.context.support.AbstractMessageSource.getMessage(AbstractMessageSource.java:179)
at ext.pmdm.common.aspect.ExceptionTransfer.transfer(ExceptionTransfer.java:55)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
======= JAVA 소스 ===================================================


Message Properties파일을 찾아 보세요
위에 에러로그를 보면 SembomSearchServiceImpl클래스의 selectModifyList메소드에서 Exception이 발생했고
해당 메소드가 포인트 컷으로 설정되어 있어서 Exception이 발생했을 경우
ext.pmdm.common.aspect.ExceptionTransfer.transfer()가 실행되도록 되어 있는데
제 예상 대로라면 위의 메소드에서 사용자 Exception 메세지를 생성하다가
org.springframework.context.NoSuchMessageException이 발생한 것으로 예상됩니다.
NoSuchMessageException은 MessageResoruce에 정의된 Message Properties파일에 찾고자 하는
키값 "error.sembomsearchserviceimpl.selectmodifybomlist"이 정의되어 있지 않기 때문에 발생하는 Exception입니다.
Message Properties 파일에 키값과 메세지를 등록해 주셔도 되고
Exception이 발생하는 근본적인 원인을 보고 싶으시다면
Spring의 속성정의 파일(context-aspect.xml)파일의
<aop:config>
<aop:pointcut id="serviceMethod" expression="execution(* ext.pmdm..*ServiceImpl.*(..))" />
<aop:aspect ref="exceptionTransfer">
<aop:after-throwing throwing="exception"
pointcut-ref="serviceMethod" method="transfer" />
</aop:aspect>
</aop:config>
이 부분을 주석으로 막고 실행해 보세요.
참고 : Exception과 같은 공통 처리 부분을 AOP를 적용해 개발하면 언제든지 변경된 Exception정책을 적용할 수 있다는 장점이 있습니다.
Re: query bean의 찾을 수 없단 오류
올려주신 로그정보로는 자세히 알 수 없지만 상황을 유추해보면 아래와 같습니다.
1. 특정 로직을 처리하다 Exception 발생(제공된 로그 정보만으로는 알 수 없습니다)
2. 해당 Exception에 해당하는 Messsage를 MessageSource를 통해 찾아보지만 찾을 수 없음
>> 로컬에서는 정상으로 오류처리가 되는데 개발서버에서는 위와 같은 에러로그 출력
(분 석)개발서버의 JVM의 LOCALE이 EN(영문)으로 설정되어 MessageSource가 defaultMessage를 찾다가 실패한 상황으로 보입니다.
아마도 로컬 JVM LOCALE은 KR로 되어 있어 오류상황 발생시 메세지소스에서 메시지 프로퍼티 파일을 찾아 정상적으로 오류 처리가 되지만
개발서버는 LOCALE이 다르게 설정되어 있어 해당 EXCEPTION에 대한 메세지를 찾지 못해 위와 같은 에러 메세지가 출력 되는 것 같습니다.
(해결책)로컬 JVM LOCALE과 개발서버 LOCALE을 동일하게 설정 하거나 EN LOCALE환경에 대한 MESSAGE를 작성하시면 될 것 같습니다.
근본적 해결책은 해당 로직을 처리할때 왜 Exception이 발생하는지 여부를 파악하고 그 문제 해결을 선행 하셔야 할 듯 합니다.
메시지 properties 파일에 해당 key 값에 대한 메시지가 있는지 확인해 보세요.
안녕하세요? blade993 님.
전체 Exception trace 가 아니라서 명확하지 않지만 일단 올려주신 로그로 보건데 뭔가 다른 이유로 개발서버에서는 해당 기능 처리시 Exception 이 발생했을 겁니다. 그래서 AOP 로 일괄 공통으로 Exception 을 재처리하는 ExceptionTransfer 의 transfer 메서드가 실행되고 있음을 위 로그에서 확인하실 수 있고요..
at ext.pmdm.common.aspect.ExceptionTransfer.transfer(ExceptionTransfer.java:55)
에서 위 ExceptionTransfer 의 55번 라인을 확인해보면, 아마도 "error" + "대상클래스명" + "대상메서드명" 에 대해 자동으로 에러메시지 key 를 계산하여 messageSource 를 통하여 해당 메시지를 찾게 될걸로 보입니다.
일단 위 문제가 로컬 pc 에서는 동일한 유형으로 나타나지 않는다면 로컬에서는 본인 서비스에 대한 메시지 파일을 정의하였고 messageSource 빈 정의시 해당 메시지 파일이 잘 로딩이 된 것으로 보입니다만, 개발서버 쪽에는 메시지 파일을 정의하지 않았던지, messageSource 에서 해당 메시지 파일을 잘 로딩하지 못한 것으로 보이구요..
locale 'en' 을 찾는 것을 보니 messageSource 에서 메시지를 찾을 때 Loacale.getDefault(); 로 JVM 의 기본 로케일을 사용할 걸로 의심이 되고, 로컬은 기본 loacale 이 'ko' 인데 개발서버는 기본 locale 이 'en' 으로 다르게 설정되어 있을 가능성도 있어 보입니다. locale 이 틀려지지 않도록 맞추는 것이 기본일 것 같구요.. 또는 JVM 의 기본 로케일을 쓰는 것이 아니라 Spring 의 LocaleResolver 등을 활용토록 확인할 필요도 있을 것 같습니다.
message-업무명_en.properties - locale 이 en 일때 매칭됨
message-업무명_ko.properties - locale 이 ko 일때 매칭됨
message-업무명.properties - 기본 로케일 - 매칭되는 로케일이 없을 때 선택됨.
Spring 설정 파일에서 아래와 같은 부분을 찾아 확인해 보세요.
로케일에 따른 postfix (_en / _ko 또는 _en_US / _ko_KR ) 와 .properties 확장자는 messageSource 에 설정하실 때 작성하지 않음에 유의하세요.