QueryDsl 사용 시 date 시작/종료 구간 검색

 

JPAQuery 부분 
query.where(qOrder.createdDate.between(dto.getSearchStartDate(), dto.getSearchEndDate()));


dto 부분
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime searchStartDate;

@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime searchEndDate;

 

LocalDateTime 을 사용할때에는 DateTimeFormat 을 입력해줘야 param 에 2021-02-01 09:52:53 같은 date time을 변환하여 받을 수 있다

개발 중 insert, update 쿼리 중 Exception 이 발생 하였지만 쿼리 요청이 rollback 되지않는 현상 정리

 

1. 액션

 - insert 혹은 update 문이 false 로 떨어질 경우 throw new Exception 을 처리 함

if(!dao.updateBl("updateQuery", dto)){
	throw new BaseException(SystemException.DB_NOT_UPDATE_ACTION);
}

 

2. 기대동작

 - RuntimeException 을 상속 받은 Exception 처리를 했으니 @Transactional 에 의해 rollback 처리를 기대함

 

3. 증상

 - DB update 가 rollback 되지 않고 정상적으로 업데이트가 됨

 

4. 원인 정리

 - update 문을 감싸는 try-catch 문을 신경쓰지 않았으며, catch 문에 처리되는 Exception 이 throw new Exception(e.getMessage()) 만 타고 있었음

 - Exception() 의 경우 checked exception 이므로 rollback 처리가 안됨

 

5. 해결방안

- 첫번째 방법 : try-catch 문의 Exception을 다음과 같이 변경 (RuntimeException 상속받은 클래스)

} catch (Exception e) {
	throw new BaseException(e.getMessage());
}

 - 두번째 방법 : throw new Exception() 으로 처리하고 @Transactional 의 옵션값을 보완함

@Transactional(rollbackFor = {RuntimeException.class, Exception.class})

 

현재 첫번째 방법으로 처리 했습니다.

 

 

참고 : cheese10yun.github.io/checked-exception/

JSONException 에러 관련


JSONArray, JSONException, JSONObject 등 json 처리 후 서버에 업로드 후 부팅 시 아래와 같은 에러가 발생하였음



 Caused by: java.lang.IllegalStateException: Failed to introspect Class [ 파일이름 ] from ClassLoader [ParallelWebappClassLoader

  context: ROOT

  delegate: false

----------> Parent Classloader:

java.net.URLClassLoader@37f8bb67

]

        at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:481) ~[spring-core-5.2.7.RELEASE.jar:5.2.7.RELEASE]

        at org.springframework.util.ReflectionUtils.doWithLocalMethods(ReflectionUtils.java:321) ~[spring-core-5.2.7.RELEASE.jar:5.2.7.RELEASE]

        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:267) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]

        ... 48 common frames omitted

Caused by: java.lang.NoClassDefFoundError: org/springframework/boot/configurationprocessor/json/JSONException

        at java.lang.Class.getDeclaredMethods0(Native Method) ~[na:1.8.0_201]

        at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) ~[na:1.8.0_201]

        at java.lang.Class.getDeclaredMethods(Class.java:1975) ~[na:1.8.0_201]

        at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:463) ~[spring-core-5.2.7.RELEASE.jar:5.2.7.RELEASE]

        ... 50 common frames omitted

Caused by: java.lang.ClassNotFoundException: org.springframework.boot.configurationprocessor.json.JSONException

        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1365) ~[catalina.jar:9.0.37]

        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188) ~[catalina.jar:9.0.37]

        ... 54 common frames omitted



여기저기 검색해 보니 json 관련해서 잘못 dependency 되어 있는 문제였음


기존 : org.springframework.boot.configurationprocessor.json.JSONArray

변경 : org.json.JSONArray


maven


<dependency>

   <groupId>org.json</groupId>

   <artifactId>json</artifactId>

   <version>20200518</version>

</dependency>

 


gradle


implementation 'org.json:json:20200518'

 


디펜던시 참고 : https://javalibs.com/artifact/org.json/json





Xss custom filter (lucy 적용 안되어 임시방편 코드)


유지보수 프로젝트 수행 중 취약점 처리 요청이 들어와서 확인해보니 xss 필터 사용이 안되고 있었다.
lucy 필터가 쉽게 적용이 되어 lucy 필터를 적용 하려고 했으나 레거시 소스 + 특이사항 등.. 문제점이 있어서 정부에서 제공한 취약점 가이드에서 예외 처리 해야할 스크립트 동작 코드만 replace 처리 되도록 필터를 만들었다.

  • 아래 코드는 취약점 가이드에 표시되는 모든 스크립트 코드임 ( <, >, style 등.. 몇가지는 제외시킴 )
  • 해외에서 사용하는 Jsoup.clean() 을 사용하려고 코드를 넣었으나.. 혹시모를 레거시 코드 사이드이펙트를 우려하여 스크립트 코드만 처리함
public class XssEscape {

private static List<String> targetList = Arrays.asList(
"javascript", "script", "iframe", "document", "vbscript", "applet",
"embed", "object", "frame", "grameset", "layer", "bgsound",
"alert", "onblur", "onchange", "onclick", "ondblclick", "enerror",
"onfocus", "onload", "onmouse", "expression", "meta", "xml",
"onreset", "onmove", "onstop", "eval", "cookie", "onstart",
"onresize", "onmousewheel", "ondataavailable",
"onafterprint", "onafterupdate", "onmousedown",
"onbeforeactivate", "onbeforecopy", "ondatasetchanged",
"onbeforedeactivate", "onbeforeeditfocus", "onbeforepaste",
"onbeforeprint", "onbeforeunload", "onbeforeupdate",
"onpropertychange", "ondatasetcomplete", "oncellchange",
"onlayoutcomplete", "onmousemove", "oncontextmenu",
"oncontrolselect", "onreadystatechange", "onselectionchange",
"onrowsinserted", "onactivae", "oncopy", "oncut", "onbeforecut", "ondeactivate",
"ondrag", "ondragend", "ondragenter", "ondragleave", "ondragover", "ondragstart",
"ondrop", "onerror", "onerrorupdate", "onfilterchange", "onfinish", "onresizestart",
"onunload", "onselectstart", "onfocusin", "onfocusout", "onhelp", "onkeydown",
"onkeypress", "onkeyup", "onrowsdelete", "onlosecapture", "onbounce", "onmouseenter",
"onmouseleave", "onbefore", "onmouseout", "onmouseover", "onmouseup", "onresizeend",
"onabort", "onmoveend", "onmovestart", "onrowenter", "onsubmit"
);

public static String replaceValue(String str) {

String safeDoc = str;

if (StringUtils.isNotEmpty(str)) {
safeDoc = Jsoup.clean(str, Whitelist.relaxed().addTags("address"));
}

return safeDoc;
}

public static String replaceParam(String str) {

String returnStr = str;

if (StringUtils.isNotEmpty(str)) {

String str_low = str.toLowerCase();

for (String target : targetList) {
if (str_low.contains(target)) {
str = str.replaceAll(target, "");
returnStr = str;
}
}
}

return returnStr;
}

}


springboot 에서 jsp-config include 사용


spring의 web.xml에 설정되어 있는 전역 사용 jspf파일을 springboot java 코드로 변환하는 방법

기존코드

<jsp-config>
    <jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<include-prelude>/WEB-INF/views/common/layout/taglib/comTaglibs.jspf</include-prelude>
</jsp-property-group>
</jsp-config>


변경코드

import lombok.extern.slf4j.Slf4j;
import org.apache.catalina.Context;
import org.apache.tomcat.util.descriptor.web.JspConfigDescriptorImpl;
import org.apache.tomcat.util.descriptor.web.JspPropertyGroup;
import org.apache.tomcat.util.descriptor.web.JspPropertyGroupDescriptorImpl;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.util.Collections;

@Component
@Slf4j
public class ServletInitailizer extends SpringBootServletInitializer {

@Bean
public ConfigurableServletWebServerFactory configurableServletWebServerFactory ( ) {
return new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
super.postProcessContext(context);
JspPropertyGroup jspPropertyGroup = new JspPropertyGroup();
jspPropertyGroup.addUrlPattern("*.jsp");
jspPropertyGroup.addUrlPattern("*.jspf");
jspPropertyGroup.setPageEncoding("UTF-8");
jspPropertyGroup.setScriptingInvalid("true");
jspPropertyGroup.addIncludePrelude("/WEB-INF/views/common/layout/taglib/comTaglibs.jspf");
jspPropertyGroup.setTrimWhitespace("true");
jspPropertyGroup.setDefaultContentType("text/html");
JspPropertyGroupDescriptorImpl jspPropertyGroupDescriptor = new JspPropertyGroupDescriptorImpl(jspPropertyGroup);
context.setJspConfigDescriptor(new JspConfigDescriptorImpl(Collections.singletonList(jspPropertyGroupDescriptor), Collections.emptyList()));
}
};
}
}


@Slf4j 사용시 log cannot be resolved 에러 처리


전자정부 3.5에서 3.8로 변경 후 log cannot be resolved 에러가 사라지지않는 문제가 발생했다.

검색 결과 아래과 같이 처리함


1. 이클립스의 Maven Dependencies 에서 lombok-1.18.8.jar 파일을 찾는다.

2. lombok-1.18.8.jar 파일을 우클릭 -> run as -> java application -> 프로세스 진행

3. lombok jar 파일이 실행되며 install 창이 표시된다.

4. specify location -> 이클립스 위치의 eclipse.ini 를 선택 -> install/update 진행

5. install 이 정상적으로 실행 된다.

6. 이클립스로 돌아와 프로젝트를 clean -> restart 한다.

7. log 관련 에러가 사라진다.


+ Recent posts