Freemarker를 Tiles와 같이 써야하는 상황이 생겼다. 그래서 Tiles + Jsp 하던것처럼 tiles-layout.xml (tiles 구성 파일)을 설정을 했더니 정상적으로 동작하지 않는다. 다음과 같은 오류가 발생하였다. [14:34:13.723][ERROR][org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet].log:line175] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Could not resolve view with name 'freemarker.hello' in..
프로젝트 초기 구성중 다음과 같은 오류가 발생하였다. java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ~[na:na] at org.springframewo..
project 소스를 Sonarqube로 분석을 해보니 다음과 같은 조치내역이 발견되었다. Make field transient or serializable! 이 필드를 직렬화에서 제외 시키거나 직렬화를 시킬수 있도록 하라! 라고 해석할 수 있다. 하지만 dataRows라는 필드는 사용이 되어야 해서 transient를 하는 상황은 제외하도록 하겠다. (transient 를 사용하면 직렬화할때 해당 필드를 제외하므로 역직렬화시 필드값이 null이 들어간다.) 이 소스를 클래스 정의 부분까지 확장시켜보면 다음과 같다. public class ProjectDataset implements Serializable { private static final long serialVersionUID = -434333..
파일 다운로드 시 보통 다음과 같은 로직을 구현한다. ... response.reset(); response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";"); response.setHeader("Content-Length", String.valueOf(destFile != null ? destFile.length() : 0)); ... 이렇게 했을 때 4번째줄에 나오는 fileName은 클라이언트로부터 넘어온 파일의 정보 중 파일이름이다. 파일 이름을 추출하여 Content-Disposition 값으로 그대로 넣으면 한..
Stream 관련 기능을 사용하다 보면 가끔 겪는 증상이다. java.io.IOException: Stream Closed at java.base/java.io.FileOutputStream.writeBytes(Native Method) at java.base/java.io.FileOutputStream.write(FileOutputStream.java:349) at java.base/java.io.BufferedOutputStream.write(BufferedOutputStream.java:123) at java.base/java.io.FilterOutputStream.write(FilterOutputStream.java:108) 결론부터 얘기하자면 이 오류의 원인은 내용 그대로 Stream으로 뭘 써..
Sonarqube로 소스 분석 결과를 보다가 다음과 같은 지적을 받았다. 이게 왜 문제가 된다는거고 심지어 Critical인가?? finally에서 자원 해제도 잘 했는데 왜?? java7 이후부터는 위의 방식처럼 자원을 열고 자원 해제를 위해 finally에서 닫아주고 하는 방식이 아니라 다음과 같이 사용하는 방법을 권고한다고 한다. try ( FileReader fr = new FileReader(fileName); BufferedReader br = new BufferedReader(fr) ) { return br.readLine(); } catch (...) {} 즉 try 안에 FileReader, BufferedReader와 같이 자원과 관련된 객체를 만들어 주면 된다. 이렇게 하면 final..
jsp에서 springboot에서 사용하는 설정파일 (application.yml, application.properties)의 값을 바로 가지고 올 수 있다. application.properties (or application.yml) 파일은 다음과 같이 정의가 되어 있는 상황이다. oing.daddy=cool guy 이 값을 jsp에서 바로 가지고 와서 사용하고 싶다. 가지고 오는 방법은 다음과 같다. 1. @environment.getProperty 를 통해 가져오는 방법 ${oingDaddy} 위와 같이 spring tag를 선언해주고 spring:eval 을 통해서 값을 가지고 올 수 있다. @environment.getProperty 를 통해 properties 파일 (or yml 파일) 의..
언제부턴가 JSP를 사용하면 노후화된 시스템이라는 딱지가 붙게 되었다. 10년을 넘게 JSP를 사용하며 영원할것 같았던 이 기술은 어느샌가 고인물의 영역이 되어가고 있는것 같다. JSP는 Spring 진영에서 정식 template engine으로 지원하지 않고 JavaEE에 종속적인 한계가 명확한것이 사람들이 점차 안쓰는데 가장 큰 이유가 아닐까 싶다. 하지만 여전히 JSP의 성능은 뛰어나다. Java template engine을 비교한 자료인데 성능은 JSP+JSTL이 최고고 그다음이 freemarker이다. 그래서 성능의 차이는 최소로 하며 현재 트랜드에 맞는 구조로 가기 위해서 freemarker로 프로젝트를 진행하기로 하였다. 이번에는 프로젝트를 만들고 HelloWorld만 찍어보는 프로젝트를 ..