Kotlin이란? 코틀린은 2011년 7월 IntelliJ를 만든 JetBrains 에서 최초 공개했다. 다중패러다임 언어이며 자바와 같은 객체지향 특성과 함수형 언어의 특징을 가지고 있다. 자바의 보일러플레이트를 삭제하기 위해 언어 차원에서의 고민이 느껴지고 무엇보다 스프링에서 공식 지원한다. 안드로이드의 공식 지원 언어이기도 하다. 기본문법 java의 문법을 조금이라도 간결하게 표현하기 위해 조금씩 바뀐 모습이 있다. 1. 코틀린에서는 문단의 끝을 알리는 ; (세미콜론)을 사용하지 않는다. 2. primitive type이 없다. (char, int, double 등.. 변수 선언을 var, 상수 선언을 val로 한다.) 3. 변수의 타입이나 메소드의 리턴 타입이 이름 뒤에 따라오는 콜론(:) 뒤에 ..
Java version에 따라 추가된 새로운 기능에 대한 좋은 자료가 있어서 퍼왔다. 빨간색으로 강조한건 아래 예제도 있다. 사용 예제도 이해하기 쉽게 써놓은 글이 있어서 퍼왔다. 버전 (Preview-Production) 기능 종류 설명 8 Lambda Expression 및 Method Reference 도입 Language anonymous inner class 표현 간략화 (함수형 표현) 인자로 method reference를 전달 (함수형 표현) 8 Collections & Streams Language Collections에서 Streams API를 사용하여, 이전의 반복문이 아닌 함수형 구현 8 Interface Default Method 도입 Language interface 내부에서 de..
작년 말쯤 나온 JDK17 버전이 LTS 버전으로 나오고 또 Spring 6가 JDK17 base인걸 공지하면서 곧 JDK17이 많이 사용될것 같다. 사실 JDK8 버전 이후부터는 나오는 주기도 빨라지고 혁신적인 점이 없어서 새로운 Java version에 대한 관심도가 많이 떨어졌다. Maven 프로젝트 JDK 8 에서 JDK 11로 migration 요즘 JAVA 버전이 참 정신없이 나오고 있다. 6개월에 한번씩 버전업데이트라니... 유료화 되면서 구독형 라이센스니 뭐니 해가지고 신경써야 되는게 늘었다... 개발환경을 구성해야 하는 입장에서 oingdaddy.tistory.com 예전에 8에서 11로 migration 가이드는 작성을 한적이 있다. 이번 글은 실제 소스 migration이 아니라 11..
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..
hs_err_pid 파일은 JVM이 어떤 이유에 의해 강제로 종료되면서 왜 종료되었는지 단서를 남긴 파일이다. [13:50:05.414][INFO ]19108[org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.prepareWebApplicationContext:line290] - Root WebApplicationContext: initialization completed in 655 ms OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000093b00000, 4005# # There is insufficient memory for the Jav..