# JDK 22
- 들어가기 전에
- Features
- Previews
- Incubators
- 요약
---
### 들어가기 전에
- 2025년에 JavaOne 재개된다고 합니다. 2025년은 java 30주년이 되는 해입니다.
- 30년을 버틴 프로그래밍 언어가 몇 개나 될까요?
- General Availablility : 2024/03/19
- preview와 incubator는 관심있으신 분들만 보시면 될 듯 합니다.
- 언제 정식으로 포함될 지 모르니
---
## Features
- 메모리, JNI 관련
- JEP 423: Region Pinning for G1
- JEP 454: Foreign Function & Memory API
- 언어 스펙
- JEP 456: Unnamed Variables & Patterns
- 메이븐 죽이기?
- JEP 458: Launch Multi-File Source-Code Programs
---
### JEP 423: Region Pinning for G1
- component : hospot / gc (hotspot)
- 요약 : G1에서 영역 고정을 구현하여 대기 시간을 줄이므로 Java Native Interface(JNI) 중요 영역 동안 가비지 수집을 비활성화할 필요가 없습니다.
- JNI : 하드웨어 또는 운영체제에 종속적인 응용프로그램들, C, C++, 어셈블리 등 다른 언어로 작성된 라이브러리들을 호출하거나 그 반대의 경우를 가능하게 하는 프레임워크
- GC가 비활성화 되었을 때, 메모리 부족, VM종료 등의 상황이 발생할 수 있다.
---
### JEP 454: Foreign Function & Memory API
- component : core-libs / java.lang.foreign (panama)
- third preview 까지 진행 되었었네요. jdk19 preview로 시작.
- 요약 : JVM 외부 코드를 효출적으로 호출하고 JVM에서 관리하지 않는 메모리에 안전하게 접근할 수 있게 한다..
- 텐서플로, 루씬, 네띠 와 같이 성능이 중요한 경우 off-heap 메모리에서 관리 되어야한다. 기존에는 두 가지 방법을 제공했다. ByteBuffer API, sun.misc.Unsafe API
- JDBC, HTTP client, NIO channels, Unix-domain sockets 등
- 약어로 FFM API 라고 하네요
---
### JEP 456: Unnamed Variables & Patterns
- component : specification / language (amber)
- 요약 : 매개변수가 절대 사용되지 않을 때 '`_`' 를 사용
- 이름이 지정되지 않는 필드나 메서드 매개변수를 허용하려 만든 것은 아니다.
- (주의) `_`를 변수로 사용하는 기존의 코드가 없다고 가정했다.
---
#### 사용되지 않는 변수 (1/2)
```java
static int count(Iterable orders) {
int total = 0;
for (Order order : orders) // order is unused
total++;
return total;
}
```
- 정적 분석 도구는 사용되지 않는 변수에 대해 경고를 표시할 수도 있다.
```java
static int count(Iterable orders) {
int total = 0;
for (Order _ : orders) // Unnamed variable
total++;
return total;
}
```
---
#### 사용되지 않는 변수 (2/2)
```java
String s = ...;
try {
int i = Integer.parseInt(s);
... i ...
} catch (NumberFormatException ex) { // ex is unused
System.out.println("Bad number: " + s);
}
```
```java
String s = ...
try {
int i = Integer.parseInt(s);
... i ...
} catch (NumberFormatException _) { // Unnamed variable
System.out.println("Bad number: " + s);
}
```
---
#### 사용되지 않는 패턴변수
```java
ealed abstract class Ball permits RedBall, BlueBall, GreenBall { }
final class RedBall extends Ball { }
final class BlueBall extends Ball { }
final class GreenBall extends Ball { }
```
```java
Ball ball = ...
switch (ball) {
case RedBall red -> process(ball); // red 사용안됨
case BlueBall blue -> process(ball); // blue 사용안됨
case GreenBall green -> stopProcessing();// green 사용안됨
}
```
```java
switch (ball) {
case RedBall _ -> process(ball); // Unnamed pattern variable
case BlueBall _ -> process(ball); // Unnamed pattern variable
case GreenBall _ -> stopProcessing(); // Unnamed pattern variable
}
```
---
### JEP 458: Launch Multi-File Source-Code Programs
- component : tools / launcher (compiler)
- 요약
- 외부 라이브러리 종속성을 쉽게 사용하는 것이 목표는 아니다.
---
#### JDK 11에서 지원했던 방법
```java
// Prog.java 아래 두개의 클래스를 포함하고 있다.
class Prog {
public static void main(String[] args) { Helper.run(); }
}
class Helper {
static void run() { System.out.println("Hello!"); }
}
```
```sh
$ java Prog.java
```
- 멀티파일이라면 얘기가 달라진다.
---
#### 멀티 파일로 구성
- 테스트해봅시다.
```java
// App.java
import help.Helper;
class App {
public static void main(String[] args) { Helper.run(); }
}
// Helper.java
package help;
class Helper {
static void run() { System.out.println("Hello!"); }
}
```
---
## Previews
- 447: Statements before super(...) (Preview)
- 457: Class-File API (Preview)
- 461: Stream Gatherers (Preview)
- 459: String Templates (Second Preview)
- 462: Structured Concurrency (Second Preview)
- 463: Implicitly Declared Classes and Instance Main Methods (Second Preview)
- 464: Scoped Values (Second Preview)
---
## Incubators
- 460: Vector API (Seventh Incubator)
---
## 요약
- JNI 를 사용할 때 외부 메모리 관리와 관련된 업데이트
- Exception이 조금은 줄어들까?
- `_` 로 변수명을 사용했던 것들은 리팩토링합시다.
- 아직은 아니지만 java 진영의 빌드 도구, IDE 들이 많이 바뀔듯.
Session 대신 JWT를 사용하는 이유 실 서버는 하나의 인스턴트로만 동작하지 않는다. 서버의 고가용성(high availabliity, HA)을 확보하기 위해 두 개 이상의 병렬서버로 운영하게 된다. 서버가 병렬로 운영되는 상황에서 세션을 사용하면 각 서버간의 세션을 동기화하는 문제가 발생한다. 이를 해결하기 위해 공유 데이터베이스를 이용한 세션공유 기법들을 사용하기도 한다. 서버가 많아지면 세션동기는 더 어렵다. JWT를 사용하면 세션사용으로 인한 서버 자체에 부담도 줄이면서 공유 세션에 대한 관리가 한층 수월하다. 스프링 시큐리티 - SecurityConfig.java session을 사용하지 않도록 설정 jwtAuthFilter 추가 httpBasic 제거 - JwtAuthenticationFilter.java config.filter 패키지에 파일 추가 jwt dependency 추가 (3개). gradle refresh하는 거 까먹지 말기 config.service 패키지에 [JwtService.java](http://JwtService.java) 추가 jwtService와 UserDetailService final field 추가. @RequiredArgsConstructor 까먹지 말기 - config.service.JwtService 소스 참조해서 파일 작성 - controller, service 수정 User 를 리턴하면 pwd가 그대로 노출되므로 AuthResponse와 AuthRequest로 교체 Github https://github.com/ohhoonim/factory.git 유튜브 영상 스프링부트 - 보안 JWT JWT - refresh 토큰과 logout
Inlay Hint > Parameter names java.inlayHints.parameterNames.enabled: literals java.inlayHints.parameterTypes.enabled java.inlayHints.variableTypes.enabled editor.inlayHints.enabled: offUnlessPressed Code lens editor.codeLens: true editor.codeLensFontSize java.referencesCodeLens.enabled java.implementationCodeLens: all ligature 폰트 설정 editor.fontFamily: 'D2Coding ligature’ "editor.fontLigatures": true, 편집기 확대 축소 단축키 설정 zoom 으로 검색 Google Style Formatter 설정 java.format.settings.url https://raw.githubusercontent.com/google/styleguide/gh-pages/eclipse-java-google-style.xml JDK 설정 java.configuration.detectJdksAtStart Language Server JAVA_HOME 설정 java.jdt.ls.java.home Gradle JAVA_HOME 설정 java.import.gradle.java.home Installed JDK 설정 java.configuration.runtimes Static 클래스, 메서드 import java.completion.favoriteStaticMembers "org.springframework.test.web.client.match.MockRestRequestMatchers. ", "...
얼마전부터 sublimetext 에서 vintage 모드를 주로 이용하고 있는데 영문입력상태에서 키보드의 특정키를 누르고 있으면 이상한 팝업창이 뜨길래 몹시 당황했네요. 보통 키보드의 키를 누르고 있으면 해당키가 빠르게 반복 입력되는 것이 당연한 것으로 생각하고 있었는데 mountain lion 버전부터 아래 그림처럼 키를 누르고 있으면 액센트 입력 팝업창이 나타나는 것이 기본이라고합니다. 저야 영문을 쓰는 경우는 대부분 프로그래밍할 때 뿐이므로 액센트 입력같은 것은 전혀 이용할 일이 없지요. 영문키가 반복 입력되게 하려면 아래와 같은 방법으로 진행하면 됩니다. (구글링 한참 했네요. ) 출처.. http://mac.software.com/tweaks/change-key-repeat-vs-character-picker 맥에서 터미널을 연 뒤 defaults write NSGlobalDomain ApplePressAndHoldEnabled -boolean false 를 입력한 뒤 엔터, 맥을 재 부팅해주면 됩니다. 위 명령어는 매버릭스인 경우이구요. 원상복구 하려면 false를 true로 바꿔주면 됩니다. defaults write NSGlobalDomain ApplePressAndHoldEnabled -boolean true mountain lion인 경우는 다를 수도 있습니다. (구글에서 mountain lion Character Picker 로 검색하면 나올 듯 해요) 반복입력을 싫어한다던가(설마 그런분이...) 특수문자 입력을 많이 하는 경우 다른 특수문자를 세팅해주고 싶다면 파인더에서 /System/Library/Input Methods/PressAndHold.app/Contents/Resources/ 폴더로 이동후 Keyboard-en.plist 파일을 수정해주면 됩니다. 파일열어보면 어디를 수정해야할지쉽게 알 수 있습니다. 근데 바꾸고 나니 '' 따옴표 입력시 조금 불편하네요...'a 를 입력하면 엑센...
댓글
댓글 쓰기