개요
PM2의 역할과 사용법을 간단하게 알아보자.
Continue reading
개요
Spring Cloud OpenFeign에 관해 간단하게 알아보자.
Continue reading
개요
실무에 필요한 HTTP 핵심 기능과 HTTP API설계 방법을 학습한다.
Continue reading
개요
JAVA 버젼별 특징을 알아보자
JAVA 1.0a2 - 1995년
JAVA 1.0 - 1996년
- 안정화 작업을 거친 1.0.2 버전에서 Java로 이름 변경.
JAVA 1.2 (Playground) - 1998년
- 해당 버젼부터 코드명 등장
- 플렛폼을 J2SE, J2EE, J2ME로 구성
JAVA 1.3 (Kestrel) - 2000년
- Java XML API, JNDI 등이 추가됨
JAVA 1.4 (Merlin) - 2002년
- IPv6 지원
- 정규표현식 지원
- 논블로킹 IO : IO를 비차단으로 최적화하여 실행 중인 애플리케이션 속도 향상.
- 이미지처리 API : 컴포넌트 개발자가 JAVA코드로 이미지를 조작할 수 있음.
- JAVA 커피잔 로고는 2003년 (릴리즈 버젼 1.4 와 5.0 사이에) 자바 컨퍼런스에서 처음 사용함.
JAVA 5 (Tiger) - 2004년
- 처음에는 1.5로 명명되었으나 성숙도, 안정성, 확장성 및 보안이 크게 향상된 새로운 기능이 포함된 주요 릴리스였기 때문에 5.0으로 공개함. (이때부터 앞의 1.이 없어짐.)
- Generics : 외부에서 형태를 정해주는 제너릭. ClassCastException을 컴파일시 검증 가능.
- 메타데이터라고도 하는 어노테이션은 메타데이터 인식 유틸리티가 클래스와 메서드를 처리할 수 있도록 태그를 지정하는 데 사용(즉, 구성 요소를 다른 구성 요소가 인식하고 특정 작업을 수행하는 것으로 레이블이 지정됨).
- Auto Boxing/Unboxing : 오토 박싱/언박싱 기능을 통해 원시타입 객체를 래퍼 클래스로 자동 변환 해줌.
- Enumeration : 열거형(enum) 기능 추가됨
- 변수는 한 유형의 임의 개수의 매개 변수를 지원하는 메서드에 대한 약어 제공. 메서드의 마지막 매개 변수는 형식 이름과 세 개의 점(예: String…)을 사용하여 선언되며 이는 해당 형식의 임의의 수의 인수를 제공하고 배열에 배치할 수 있음을 의미.
- for each문 기능 향상 : 컬렉션 및 배열에서도 사용 가능.
- 멀티쓰레드 상의 시멘틱스 향상
- Static imports
- RMI(Remote Method Invocation, 원격 메소드 호출), Swing, 동시성 유틸리티(Processes and Threads) 및 Scanner 클래스 개선
- Java 5는 Apple Mac OS X 10.4에서 처음 사용할 수 있으며 Apple Mac OS X 10.5에 설치된 기본 버전.
JAVA 6 (Mustang) - 2006년
- 가비지 컬렉터 G1(Garbage First) 테스트용으로 추가.
- 2010년 1월 오라클이 Sun Microsystems를 인수하게 됨에 따라 Sun Microsystems에서 출시한 마지막 주요 릴리스 버전.
- 핵심 플랫폼의 성능 향상(애플리케이션 실행 속도 향상. 실행에 필요한 메모리 또는 CPU 감소).
- 향상된 웹 서비스 지원(웹 응용프로그램 개발에 필요한 최적화된 구성요소).
- JDBC 4.0(데이터베이스를 사용한 애플리케이션 개발에 필요한 최적화된 구성 요소).
- Java 컴파일러 API(코드에서 코드를 컴파일하는 데 사용되는 구성 요소를 호출할 수 있습니다.)
- API에서의 SwingWorker 통합, 테이블 정렬 및 필터링, Swing 이중 버퍼링(회색 영역 효과 제거)과 같은 전반적으로 데스크톱 애플리케이션을 위한 인터페이스를 만드는 데 사용되는 구성 요소의 개선.
- 2008년 12월 JavaFX 1.0 SDK 출시. JavaFX는 모든 플랫폼의 그래픽 사용자 인터페이스를 만드는 데 적합. 초기 버전은 스크립트 언어. 2008년까지 자바에서는 사용자 인터페이스를 만드는 두 가지 방법 존재했음(AWT, Swing)
JAVA 7 (Dolphin) - 2011년
- 동적 바이트 코드(기본적으로 Java 코드는 Python, Ruby, Perl, Javascript 및 Groovy와 같은 비 자바 언어로 구현된 코드를 사용할 수 있음)를 사용하여 dynamic languages를 JVM에서 지원.
- 압축된 64비트 포인터(JVM의 내부 최적화로 메모리 사용량 감소)
- 프로젝트 “Coin” 하에 그룹화된 작은 변경 사항들:
- Switch-case 문에서 문자열 사용 가능
- Try-catch 문에서 자동 리소스 관리
- 제네릭의 개선된 유형 추론
- 이진 정수 리터럴: 정수 숫자는 0b(또는 0B) 형식과 하나 이상의 이진 숫자(0 또는 1)를 사용하여 이진 숫자로 직접 나타낼 수 있음
- 다중 예외처리 개선
- 동시성 향상
- 새 I/O 라이브러리(파일에서 데이터 읽기/쓰기에 추가된 새 클래스)
- Timsort 알고리즘은 성능이 더 좋기 때문에 병합 정렬 대신 객체의 컬렉션과 배열을 정렬하기 위해 도입됨. (Merge Sort(병합 정렬) + Insertion Sort(삽입 정렬))
Java 7을 시작으로 Java SE Platform Edition의 오픈 소스 레퍼런스 구현체인 OpenJDK가 탄생.
JAVA 8 (Spider) - 2014년
Java 8부터는 상표법상의 문제를 피하기 위해 코드네임 삭제됨. 대신 메이저, 마이너 및 보안 업데이트 릴리스를 쉽게 구분하는 시맨틱 버전이 채택됨.
$Major.$minor.$SECURITY
터미널에서 Java 버전을 실행할 때(Java 8이 설치된 경우) 아래와 유사한 로그가 표시됩니다.
$ java -version
java version "1.8.0_162"
JavaTM SE Runtime Environment build 1.8.0_162-b12
Java HotSpotTM 64-Bit Server VM build 25.162-b12, mixed mode
로그 버전 번호의 의미 :
- 1은 Java SE Platform Specification의 새 버전에 지정된 대로 중요한 새 기능이 포함된 주요 릴리스에 대해 증분된 주 버전 번호를 나타냅니다.
- 8은 부 버전 번호를 나타내며, 호환되는 버그 수정, 표준 API에 대한 개정 및 기타 작은 기능을 포함할 수 있는 부 업데이트 릴리스에 대해 증가합니다.
- 0은 보안 향상에 필요한 수정 사항을 포함하여 중요한 수정 사항이 포함된 보안 업데이트 릴리스에 대해 증가된 보안 수준을 나타냅니다. $MINOR가 증가하면 $SECURITY가 0으로 재설정되지 않으므로 사용자는 이 버전이 더 안전하다는 것을 알 수 있습니다.
- 162는 빌드 번호입니다.
- b12는 추가 빌드 정보를 나타냅니다.
이 버전 관리 스타일은 Java 애플리케이션에 매우 일반적이기 때문에 일반적인 업계 관행에 맞추기 위해 이 버전 관리 스타일을 채택했습니다.
JAVA 9 - 2017년
- 직소 프로젝트 시작
- 런타임이 모듈화된 것이 가장 큰 특징. 서로 다른 패키지간의 캡슐화가 가능해짐. jigsaw는 모듈을 만들고 모듈에 명시적으로 외부에서 호출할 수 있는 API를 선언함. 언어 레벨에서 API 작성자가 외부에 노출한 API 외에는 접근불가. 모듈은 그 모듈에서 사용할 다른 모듈을 선언. JDK는 이 기능을 통해 모든 내부 API를 캡슐화하여 구성.
// Java 코드 최상위에 module-info.java 파일을 만들고, 아래와 같이 사용함
module java.sql {
requires public java.logging;
requires public java.xml;
exports java.sql;
exports javax.sql;
exports javax.transaction.xa;
}
- Java를 쉘 처럼 사용할 수 있는 JShell 추가
- interface에서 private method 지원
- 향상된 try-with-resources : final 변수도 리소스로 사용가능
- “_” 이 올바른 식별자명에서 제거됨
- G1(Garbage-First) 가비지 수집기에 대한 향상된 기능. 이 기능이 기본 가비지 콜렉터가 됨
- 내부적으로 더 작은 규모의 String 표현 사용
- 동시성 업데이트(병렬 실행 관련)
- collections 을 위한 Factory methods
// 기존 collection
List<String> temp = new ArrayList<>();
cars.add("A1");
cars.add("B1");
cars.add("C1");
...
// collection factory
List<String> temp = Arrays.asList("A1", "B1", "C1");
- 이미지를 처리하는 코드를 작성하는 데 사용되는 구성 요소의 이미지 처리 API 최적화 업데이트
- 프로퍼티 파일에 UTF-8 지원
- 이 버젼부터 64비트만 출시. 32비트는 나오지 않음
JAVA 10 - 2018년 3월
- Oracle은 Java 릴리스 스타일을 변경하여 6개월마다 새 버전이 릴리스 됨.
- Local-Variable Type Interface (로컬변수 타입추론)
- 로컬 변수 타입을 var 로 선언 가능.
- 제약사항 :
var list = new ArrayList<String>(); //ArrayList<String> 으로 추론
var numbers = List.of(1, 2, 3, 4, 5); //List<Integer> 으로 추론
for (var number : numbers){ //Integer 추론
System.out.println(number);
}
- GC 성능 향상
- Appliction CDS(class data sharing) 기능 추가
- 애플리케이션 로딩의 시작 시간 향상을 위한 JVM의 주요 기능. 서로 다른 JVM 간에 클래스 메타데이터를 공유할 수 있으므로 시작 시간과 메모리 사용량이 줄어듬.
- 추가 동시성 업데이트(병렬 실행 관련)
- 대체 메모리 장치에 힙 메모리 할당(JVM이 Java 프로그램을 실행하는 데 필요한 메모리(힙 메모리)를 대체 메모리 장치에 할당할 수 있으므로 힙을 휘발성 RAM과 비휘발성 RAM 간에 분할도 가능)
- Thread-Local Handshakes VM safepoint(모든 쓰레드를 일시정지 시키는 작업)를 수행할 필요 없이 개별 스레드를 stop 시키고 콜백을 수행하도록 할 수 있는 기능.
JAVA 11 - 2018년 9월
- LTS 버젼. JAVA 11 : 2026년 9월까지 지원
- enterprise Java applications 및 Corba(원격 호출을 위한 매우 오래된 기술로 응용프로그램이 다른 컴퓨터에 설치된 응용프로그램과 통신할 수 있음) 모듈을 구축하는 데 사용되는 JEE 고급 구성요소 제거.
- 람다 매개 변수에 대한 로컬 변수 구문을 사용하면 암묵적으로 입력된 람다 식의 형식 매개 변수를 선언할 때 var 키워드를 사용 가능
(var x, var y) -> x.process(y) => (x, y) -> x.process(y)
- 오버헤드가 낮은 가비지 컬렉터인 Epsilon(GC가 없으므로 기본적으로 GC 없이도 애플리케이션을 실행할 수 있음)은 기본적으로 가비지 수집에 더 많은 최적화를 제공
- 병렬 실행과 관련된 더 많은 동시성 업데이트.
- Nashorn JavaScript 스크립트 엔진 및 API는 향후 릴리스에서 제거하기 위해 더 이상 사용되지 않는 것으로 표시. ( ECMAScript 구조가 상당히 빠르게 진화하여 유지의 어려움 때문 )
- Oracle JDK와 OpenJDK가 통합되었으며 Oracle JDK 가 유료 모델로 전환
- 새로운 String 메서드 추가
strip() : 문자열 앞, 뒤의 공백 제거
stripLeading() : 문자열 앞의 공백 제거
stripTrailing() : 문자열 뒤의 공백 제거
isBlank() : 문자열이 비어있거나 공백만 포함되어있을 경우 true를 반환. 즉, String.trim().isEmpty() 호출과 같음
lines() : 문자열을 라인 단위로 쪼개는 스트림을 반환
repeat(n) : 지정된 수 만큼 문자열을 반복하여 붙여 반환
JAVA 12 - 2019년 3월
- GC 일시 중지 시간을 단축하는 Shenandah라는 새로운 실험적 Garbage Collector(GC) 알고리즘.
- switch 문 수정됨. 브레이크 문 필요없음.
switch (day) {
case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
case TUESDAY -> System.out.println(7);
case THURSDAY, SATURDAY -> System.out.println(8);
case WEDNESDAY -> System.out.println(9);
}
- 주요 클래스 파일 및 런타임 아티팩트의 공칭 설명을 모델링하는 JVM 상수 API. 이 API는 클래스와 메서드를 조작하는데 유용.
- G1 가비지 컬렉터 성능 개선
- JDK 빌드 프로세스를 개선하기 위한 CDS(class data sharing) 아카이브를 기본값으로 설정함.
- 약 100개의 마이크로벤치마크16이 JDK 소스에 추가
JAVA 13 - 2019년 9월
- 동적 CDS 아카이브(JDK 12에 추가된 CDS 아카이브의 지원 향상)
- 12에서는 클래스 목록을 만든 다음 해당 클래스 목록을 아카이브에 덤프하는 단계가 필요했음. 13에서는 동적 저장기능이 있어 어플리케이션 종료시에 공유 아카이브 생성 가능.
- 가비지 컬렉터 기능 향상
- 레거시 소켓 API의 새로운 구현
- 유니코드 12.1 지원
- 텍스트 블록 지원
// 줄바꿈 문자 자동 지원
String str = """
This
is
text block
""";
- switch 문에 yield 예약어 추가
var a = switch (day) {
case MONDAY, FRIDAY, SUNDAY:
yield 6;
case TUESDAY:
yield 7;
case THURSDAY, SATURDAY:
yield 8;
case WEDNESDAY:
yield 9;
};
JAVA 14 - 2020년 3월
연산자 인스턴스에 대한 패턴 일치
- Java 애플리케이션 및 JVM이 실행중일 때 프로파일링 및 진단 데이터를 수집하는 JFR Event Streaming API
- G1 가비지 컬렉터의 추가 향상된 기능
- CMS(Concurrent Mark Sweep) 가비지 컬렉터 제거
- macOS용 Z 가비지 컬렉터 지원
- 상용구 클래스를 선언을 줄여주는 record 도입.
// 기존 상용구 클래스
final class Point {
public final int x;
public final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
...
// 레코드 사용
record Point(int x, int y) { }
- Java 힙 외부의 메모리에 안전하고 효율적으로 접근할 수 있도록 지원하는 외부 메모리 액세스 API
- NullPointerExceptions 향상 : 정확히 어떤 변수가 null인지 기술해 줌.
JAVA 15 / 2020년 9월
- Nashorn JavaScript 엔진 제거
- sealed and hidden classes 추가
/*
* Game.java 파일
* permits 로 선언된 Nintendo, Sony class 만 Game class 를 상속할 수 있다.
*/
public sealed class Game permits Nintendo, Sony {}
...
/*
* Nintendo.java 파일
* final 로 선언된 Nintendo Class. 다른 클래스에서 Nintendo 클래스를 상속할 수 없다.
*/
public final class Nintendo extends Game {} // Game Class 상속가능
...
/*
* Sony.java 파일
* non-sealed 선언되었기 때문에 Sony class는 아무 클래스에서나 상속 가능하다.
*/
public non-sealed class Sony extends Game {} // Game Class 상속가능
...
/*
* Playstation.java 파일
* Nintendo 가 final 로 선언된 class 이기 때문에 상속할 수 없다.
*/
public class Playstation extends Nintendo {} // Nintendo Class 상속불가
/*
* Vita.java 파일
* non-sealed class 인 Sony.java 상속이 가능하다
*/
public class Vita extends Sony {} // 상속가능
...
- Edwards-Curve Digital Signature Algorithm(EdDSA) : 암호화 서명 지원
- Legacy DatagramSocket API 성능 향상
- Biased Locking이 비활성화 됨 : 멀티스레드 애플리케이션의 성능이 향상됨
JAVA 16 - 2021년 3월
- Vector API 도입 : 대용량 데이터를 효과적으로 다루는 클래스. 용량 변경이 용이하며 어떤 종류의 객체도 담을 수 있음
- JDK 내부의 강력한 캡슐화
- Foreign Linker API 도입 : 다른 프로그래밍 언어로 작성된 라이브러리 및 외부 메모리에 액세스하기 위해서 사용되던 JNI(Java Native Interface)의 대체제
- 사용하지 않는 HotSpot 클래스 메타데이터(즉, 메타스페이스) 메모리를 운영 체제로 보다 신속하게 반환할 수 있는 Elastic 메타스페이스의 도입
JAVA 17 - 2021년 9월
LTS버젼 : 2029년 9월까지 지원
- JDK 16에 도입된 Vector API의 성능 및 구현 향상
- sealed class 및 interface 개선
- switch 문에 패턴 매칭 기능, Gaurded Patterns, Null Cases 추가
return switch (obj) {
case Integer i -> "It is an integer";
case String s -> "It is a string";
case Employee employee && employee.getDept().equals("IT") -> "IT Employee";
case null -> "It is a null object";
default -> "It is none of the known data types";
};
- macOS별 향상된 기능
- 의사 난수 생성기를 위한 향상된 기능: 예측이 어려운 난수 생성 API 정식 추가
- JDK 내부 캡슐화 기능 향상
- Apple API 사용 안 함(JDK 18에서 제거 준비)
- Security Manager 사용 안 함(JDK 18에서 제거 준비)
- Foreign Function & Memory API는 개발자들이 JNI의 위험 없이 네이티브 라이브러리를 호출하고 네이티브 데이터를 처리할 수 있도록 하기 위해 이전에 인큐베이팅했던 두 개의 API인 Foreign-Memory Access API와 Foreign Linker API를 병합.
JDK 17의 기능 목록은 성능을 향상시키고 오래된 API를 사용/폐기하기 위해 JVM 내부에 초점을 맞추고 있음.
Continue reading
개요
JAVA 8 에서 17 로 넘어가려는 움직임이 보인다. 간략하게나마 이유를 알아보고 진짜 넘어갈 필요가 있는지 한번 생각해 보자.
자세한 내용이 궁금하면 다른 사람의 글을 참고하자.
Continue reading
개요
JBOSS를 사용했던 프로젝트의 JNDI 설정 내용을 간략히 정리해본다.
Continue reading
개요
Spring-data-jpa를 사용하면 Entity Manager 를 사용하지 않고 쉽게 구현 가능하지만 가끔 Entity Manager로 직접 영속성 컨텍스트를 컨트롤 해야할 필요가 생긴다. 어떤식으로 둘을 함께 사용할 수 있는지 헤딩한 내용을 기록해본다.
Continue reading
개요
최근 가성비 휴대용 모니터로 인기가 많은 ZEUSLAP Z16P 휴대용 모니터를 구매한 김에 메뉴얼을 데이터화 한다.
Continue reading
개요
JPA의 정의와 장점을 알아보자.
Continue reading