# 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. ", "...
# 5-Step Architecture Spec 이 문서는 헥사고날 아키텍처를 실무적으로 변형하고, DDD의 전략적 설계를 극대화한 5-Step Architecture의 표준 공정을 정의한다. 샘플 리파지토리 : https://github.com/ohhoonim/smart-factory/tree/main/back/factory-api-module ### Core Philosophy > "Service는 배달부(Messenger)일 뿐, 뇌(Brain)는 **Model**에, 법(Law)은 **Policy**에 둔다." > --- ## The 5-Step Standard Process ### Step 1: 도메인 자아 확립 (Domain Model Discovery) 비즈니스의 핵심 상태와 행위를 관리하는 Aggregate Root(AR)를 정의한다. - **원칙**: 데이터 필드가 아닌 '상태 변화의 규칙'과 '생애주기'에 집중한다. - **핵심**: AR 내부에서만 상태 변경이 가능하도록 캡슐화하며, 외부로부터의 직접적인 필드 수정을 금지한다. ### Step 2: 법전 정의 (Policy Abstraction) 비즈니스 제약 조건 중 변하기 쉬운 규칙(보안, 한도, 계산 로직)을 인터페이스로 추상화한다. - **원칙**: 도메인 모델이 프레임워크(Spring)나 환경 설정에 오염되지 않도록 보호한다. - **효과**: 정책의 변경이 모델이나 서비스의 코드 수정을 유발하지 않도록 결합도를 낮춘다. ### Step 3: 도구 제작 (Activity Implementation) 도메인이 외부 세계와 소통하기 위한 구체적인 기술(DB, Storage, 외부 API)을 구현한다. - **원칙**: 헥사고날의 **Output Adapter** 역할을 수행하며, 기술적 복잡성을 이 계층에 가둔다. - **명칭**: `QueryActivity`(조회), `CommandActivity`(...
댓글
댓글 쓰기