'Java'에 해당하는 글 11건

 

그 동안의 무심함에 미안함을 조금 가지며 JAVA 근황을 좀 살펴 보았다. 보아하니 발전을 많이 했다기 보다 버전만 열심히들 올렸네. 8인가 열심히 쓰고 있었는데 16이라니... 앞으로 신규 프로젝트들은 뭘루 시작해야 하나. OpenJDK 8 과 11 사이에서 어떤 것이 현명한 선택인지 모르겠다.

 

 

OpenJDK

Download and install the open-source JDK for most popular Linux distributions. Oracle's free, GPL-licensed, production-ready OpenJDK JDK 16 binaries are at jdk.java.net/16; Oracle's commercially-licensed JDK 16 binaries for Linux, macOS, and Windows, bas

openjdk.java.net

 

AdoptOpenJDK

AdoptOpenJDK provides prebuilt OpenJDK binaries from a fully open source set of build scripts and infrastructure. Supported platforms include Linux, macOS, Windows, ARM, Solaris, and AIX.

adoptopenjdk.net

 

Java 버전 별 변경점들을 정리해 봤다.


Java SE 17 LTS (2021.09)

  • Java 8, 11 을 잇는 세번째 LTS 버전(3년마다 배포)
  • 애플릿 완전 제거

 

Java SE 16 (2021.03)

  • OpenJDK 버전관리가 Mercurial 에서 Git 으로 변경.
  • jpackage 명령어로 자바 프로그램 손쉽게 배포(pkg, deb, msi 등)
  • 패턴 매칭 정식 지원
  • Record 형식 정식 지원

 

Java SE 15 (2020.09)

  • EdDSA 암호화 알고리즘 추가
  • 다중 텍스트 블록 (""")

 

Java SE 14 (2020.03)

  • instanceof 패턴 매칭
  • record (data object) 선언 기능 추가

 

Java SE 13 (2019.06)

  • switch 문에 yield 예약어 추가

 

Java SE 12 (2019.03)

  • Switch 문의 확장 : case MONDAY, FRIDAY, SUNDAY -> System.out.println(6); 

 

Java SE 11 LTS (2018.09)

  • 일반 지원은 2023년 9월, 연장 지원은 2026년 9월에 종료될 예정
  • Oracle JDK 와 Open JDK 통합 (Oracle JDK는 구독형 유료 모델로 전환)
  • 이클립스 재단으로 넘어간 Java EE가 JDK에서 삭제되고, JavaFX도 JDK에서 분리되어 별도의 모듈로 제공. 
  • 람다 파라미터에 대한 지역변수 문법 변경: (var x, var y) -> x.process(y) => (x, y) -> x.process(y)
  • HTTP 클라이언트 표준화 기능 추가 (jdk.incubator.http 패키지가 표준화되어 java.net.http 패키지로 추가)
  • 엡실론(Epsilon) 가지비 컬렉터 : 오버헤드의 최저지연과 할당 제한이 가능한 완전한 수동 가비지 컬렉터 적용

 

Java SE 10 (2018.03)

  • var 키워드를 이용한 지역변수 선언 및 타입추론 가능
  • 병렬 처리 가비지 컬렉션 도입으로 인한 성능 향상
  • JVM 힙 영역을 시스템 메모리가 아닌 다른 종류의 메모리에도 할당 가능
  • 루트 CA 목록 추가
  • JDK의 Repository가 하나로 통합
  • Deprecated된 API는 Java SE 10에서 모두 삭제

 

Java SE 9 (2017.09)

  • Jigsaw 기반 런타임 모듈화(기존 jar 방식 개선)
  • JAVA 를 인터프리터 언어 쉘처럼 사용할 수 있는 JShell 추가
  • immutable collection / HTTP/2 / private 인터페이스 메소드 / HTML5 Javadoc / 프로퍼티 파일에 UTF-8 지원
  • 1.x 버전에서 9.0 으로 판올림이 일어나며, 6개월마다 새로운 버전 업데이트

 

Java SE 8 (2014.03)

  • Oracle JDK vs Open JDK (오라클 인수 후 첫번째 버전)
  • Lambda 표현식 및 함수형 프로그래밍
  • 날짜 및 시간 API(java.time 패키지)
  • Stream API 추가
  • JavaScript 엔진 Rhino -> Nashorn
  • 32비트를 지원하는 마지막 공식 Java 버전

 

Java SE 7 (2011.07)

  • Switch 문에서 문자열 사용 가능 : case "MON"
  • generics 타입 추론(생략 가능) : Map<String, Object> map = new HashMap<>();
  • try-with-resources 자동 리소스 해제(close) : try (SomeResource resource = getResource()) { ...
  • Diamond Operator <> 지원
  • 멀티프로세서 처리 : Fork/Join Framework
  • ECC 암호화 내장
  • 이진수 표현 (2진수는 0b, 8진수는 0, 16진수는 0x로 시작)

 

Java SE 6 (2006.12)

  • J2SE 에서 Java SE 로 표기가 바뀜.
  • JDBC 4.0, Java Compiler API, Pluggable Annotation 등이 추가
  • Rhino JavaScript 엔진이 기본으로 탑재

 

Java SE 5 (2004.09)

  • generics, annotation, enum, foreach, ...

 


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

파일 mime-type 체크

Daily/Prog 2020. 5. 14. 18:26



얼마전 s3 에 업로드된 상당량의 이미지 mime-type 이 octet-stream 으로 올라가 있는 것을 확인했다. 또 그 파일들은 모두 확장자가 대문자인 것도 확인했다.


String mimeType = Files.probeContentType(path);


위 부분에서 대문자 확장자 파일들에 대한 처리가 정상적으로 되지 않아 null 을 반환한 것이 문제였다. 확장자로 mimeType 을 얻어오는 과정에서 발생할 예외들을 미리 예상하여 처리할 수도 있지만, 업로드시 파일에서 직접 mimeType 을 확인할 수도 있다. Apache 의  Tika 라이브러리를 사용해 봤다.


compile group: 'org.apache.tika', name: 'tika-core', version: '1.24'

...

String mimeType = new Tika().detect(inputStream);


tika-parsers 는 용량이 어마무시하다. parser 가 꼭 필요한게 아니라면 core 만 받자.


그리고 기존에 s3 에 octet-stream 타입으로 업로드된 이미지 파일들은 aws-cli 로 배치처리 하여 image/jpeg 으로 변경하였다.


> aws s3 cp \

 s3://bucket/path \

 s3://bucket/path \

 --exclude "*" \

 --include "*.JPG" \

 --acl public-read \

 --no-guess-mime-type \

 --content-type "image/jpeg" \

 --metadata-directive "REPLACE" \

 --recursive

 --profile myprofile


아쉽게도 include 에 지정한 패턴이 대소문자를 구분하지 못해서 시간이 꽤 걸렸음...




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

Spring boot 웹 어플리케이션 개발시 Local 에서는 잘만 되던게, WAR 파일로 서버에 배포하면 404 error 날 때가 있다. 서버 로그에는 별 메시지가 없다. 단지 배포가 잘됐다는...;


INFO [dev.example.com-startStop-3] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive 
[/var/lib/tomcat8/webapps/auth/ROOT.war] has finished in [2,533] ms
cs


이럴 경우 local 에서 되던게 server 에서 안되는 것이니 서버 설정에 문제를 예상할 수도 있지만, 서버는 에러 발생 시 로그를 남긴다; 로그 없는 이 상황은 뭐라고 검색하기도 난해하고 참... 예상되는 문제를 하나씩 점검해 보는 수 밖에 없다. 내 경우는 main 클래스에 SpringBootServletInitializer 를 상속하지 않아서 생긴 현상임을 알게 됐다...


main 클래스에서 SpringBootServletInitializer 상속받고 configure 오버라이드 하면 된다.


@SpringBootApplication
public class Application extends SpringBootServletInitializer {
 
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }
 
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
 
}
cs


이렇게 하면 컨테이너가 실행될 때 war로 배포된 Spring 웹 어플리케이션 컨텍스트가 준비된다.

Servlet3.0 이전의 web.xml 역할을 하는 셈.

또 깜빡하더라도 빨리 캐치하자.ㅋ


WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

Intellij 한글 깨짐

Daily/Prog 2019. 10. 24. 21:11

이 거지같은 한글 깨짐은 20년 동안 사라지질 않네.ㅋㅋ (한글 디스 아님!)




사건발단


1. 오늘 몇년전 프로젝트를 열었다가 IntelliJ 콘솔에서 우연히 한글깨짐을 발견했다.

2. 최근 프로젝트에서도 한글을 써보니 콘솔에서 한글깨짐이 발생했다. (한동안 영어만 쓰고 살았음...ㅡㅡv)

3. gradle 의 clean 작업을 실행하면서 build.gradle 의 한글이 깨졌으니 tomcat 의 문제는 아니다.

4. IntelliJ 가 실행될 때의 어느 곳에 있는 자바 옵션이 실행되는지를 체크하고 인코딩을 설정해야 한다. -Dfile.encoding=UTF-8



삽질


1. 시스템 환경변수 세팅

2. C:\Program Files\JetBrains\IntelliJ IDEA 2019.2.1\bin 의 idea.exe.vmoptions 과 idea64.exe.vmoptions

3. IntelliJ - Run/Debug Configurations - VM options


다 필요없음...



해결


IntelliJ - Help -  Edit Custom VM Options...  메뉴 열고  -Dfile.encoding=UTF-8  를 추가하여 해결.

파일위치는 C:\Users\username\.IntelliJIdea2019.2\config\idea64.exe.vmoption

오우... 사용자마다 세팅이 가능하게 되어 있나... 아니면 IntelliJ 사용자 등록하면서 별도 세팅이 되었던지...

암튼 이렇게 해결~~






WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  6개가 달렸습니다.
  1. 차분하게꾸준히 2020.02.19 04:52
    오... 도움 됐어요 감사합니다!
  2. 따봉!
  3. 감사합니다 2020.02.26 12:11
    드뎌 해결 되었네요!
secret

s3 업로드시 발생하는 로그.


Sep 30 03:29:32 ip-172-50-10-72 tomcat8: 2019-09-30 12:29:32.717  WARN 27104 --- [io-8443-exec-65] c.amazonaws.services.s3.AmazonS3Client   : No content length specified for stream data.  Stream contents will be buffered in memory and could result in out of memory errors.


s3 업로드시 setContentLength 를 지정하지 않거나 IOUtils.toByteArray(inputStream) 사용시 inputStream 이 소진되어 발생하는 경고이며 다음과 같이 수정이 필요하다.


byte[] bytes = IOUtils.toByteArray(inputStream);
objectMetadata.setContentLength(bytes.length);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
 
PutObjectRequest putObjectRequest = new PutObjectRequest(bucket, key, byteArrayInputStream, objectMetadata);
client.putObject(putObjectRequest);
cs




WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret