1. 스프링 부트 3의 변화
- 스프링 부트 2 : 자바 8 버전 이상 사용
- 스프링 부트 3 : 자바 17 버전 이상 사용
2. 자바 17의 주요 변화
2.1. 텍스트 블록
- 이전 : 여러 줄의 텍스트 작성 -> \n 추가 필요
- 현재 : """ 로 감싼 텍스트 사용 -> 여러 줄 텍스트 표현 O
String query11 = "SELECT * FROM \"items\"\n" +
"WHERE \"status\" = \"ON_SALE\"\n" +
"ORDER BY \"price\";\n";
String query17 = """
SELECT * FROM "items"
WHERE "ststus" = "ON_SALE"
ORDER BY "price";
""";
=>가독성 좋아짐!
2.2. formatted() 메서드
: 값 파싱 위해 사용
- formatted() 메서드 없던 시절 -> 매우 불편한 방법의 값 파싱
String textBlock17 = """
{
"id" : %d
"name" : %s,
}
""".formatted(2, "juice");
=> 자리 표시자 %d를 2로, %s를 "juice"로 대체
<결과>
2.3. 레코드
- 데이터 전달을 목적으로 하는 객체를 더 빠르고 간편하게 만들기 위한 기능
- 상속 X
- 파라미터에 정의한 필드는 private final 로 정의 됨
- getter 를 자동으로 만듦 -> 애너테이션이나 메서드로 게터 정의를 하지 않아도 됨
record Item(String name, int price){
// 이렇게 하면 파라미터가 private final로 정의 됨
}
Item juice = new Item("juice", 3000);
juice.price();//3000
2.4. 패턴 매칭 ( instanceof )
- 타입 확인을 위해 사용하던 instanceof 키워드를 조금 더 쉽게 사용할 수 있게 해줌
- 이전 : instanceof 키워드와 형변환 코드를 조합해야 했음
- 현재 : 바로 형변환 한 다음 사용 가능
// 패턴 매칭( instanceof )
// 11버전
if (o instanceof Integer){
Integer i = (Integer) o;
}
- instanceof 연산자: 객체 o가 특정 클래스(Integer)의 인스턴스인지 확인하는 데 사용
- 타입 캐스팅: o가 Integer의 인스턴스인 경우(if문이 참인 경우), true가 반환
- o를 명시적으로 캐스팅하여 Integer i = (Integer) o;처럼 i라는 변수에 할당
=> 먼저 타입을 확인한 다음, 명시적으로 캐스팅해야 하므로 두 번의 작업이 필요
// 17 버전
if (o instanceof Integer i){
// 여기서 i는 Integer 타입의 지역 변수로 사용됨
}
- 자바 17에서는 instanceof 연산자와 함께 패턴 매칭 기능이 도입
- instanceof를 사용해 타입을 확인하면서 동시에 해당 타입의 변수로 자동 캐스팅을 수행
- if문의 조건 (o instanceof Integer i) : o가 Integer의 인스턴스인지 확인
-> 조건이 true일 경우 : o는 Integer 타입으로 자동 캐스팅되어 i라는 변수에 할당
=> 타입을 확인하고, 캐스팅하는 두 단계를 한 번에 처리
- 패턴 매칭을 통해 instanceof를 사용하면서, 동시에 변수를 선언하고 자동으로 타입 캐스팅까지 가능
=> 코드의 가독성을 높이고, 코드 중복을 줄이는 데 큰 도움
ex.
Object o = 10;
// 자바 11방식
if (o instanceof Integer) {
Integer i = (Integer) o;
System.out.println("Integer: " + i);
}
// 자바 17 방식
if (o instanceof Integer i) {
System.out.println("Integer: " + i);
}
=> 두 코드 모두 o가 Integer 타입이면 i라는 변수를 통해 그 값을 사용할 수 있지만, 자바 17 방식은 코드가 더 간결하고 명확
2.5. 자료형에 맞는 case 처리
- switch-case 문으로 자료형에 맞게 case 처리 가능
static double getIntegerValue(Object o) {
return switch (o) {
case Double d -> d.intValue();
case Float f -> f.intValue();
case String s -> Integer.parseInt(s);
default -> 0d;
};
}
- Java 17에서 도입된 switch 표현식을 사용
- 입력된 객체 o의 타입에 따라 다른 값을 반환하는 getIntegerValue라는 정적 메서드
- 주어진 객체 o의 타입에 따라 처리
- 결과를 double 타입으로 반환
<getIntegerValue 메서드>
- static 메서드 : 클래스의 인스턴스를 생성하지 않고 호출가능
- double: double 타입의 값을 반환 (return)
- Object o : 모든 타입을 받을 수 있는 Object 타입의 매개변수 o를 입력으로 받음
< switch 표현식>
- switch (o)는 o 객체의 타입을 검사
- 그 타입에 따라 다른 동작을 수행
- switch 표현식의 각 케이스는 ->를 사용하여 해당 타입에 맞는 처리를 정의
- 만약 o가 Double 타입인 경우, o는 Double로 캐스팅되어 d라는 변수로 사용
-> d.intValue()는 Double 객체를 int 값으로 변환
-> int 값은 switch 표현식에 의해 double 타입으로 변환되어 반환
<자동 형 변환 (Widening Conversion)>
switch 표현식에서 반환된 값이 메서드의 반환 타입과 일치하지 않을 경우
-> Java는 자동으로 타입 변환(형 변환)을 수행 가능
- 이 과정에서 작은 범위의 데이터 타입->큰 범위의 데이터 타입으로 변환되는 경우 존재
- Java에서는 int 타입-> double 타입으로 자동으로 변환 가능
∵ int(32bit 정수 타입)보다 double(64bit 부동 소수점 타입)이 더 넓은 범위의 숫자를 표현할 수 있기 때문 ( int 값을 double로 변환하는 과정에서 데이터 손실이 발생x -> Java 컴파일러는 이 변환을 안전하다고 간주 - >자동으로 수행 )
switch 표현식에서 int 값을 반환하더라도, 메서드의 반환 타입이 double로 선언되어 있으면,
-> Java는 자동으로 이 int 값을 double로 변환
=> 자동 형 변환(Widening Conversion)의 한 예
-> Java에서는 작은 타입에서 큰 타입으로의 변환을 자동으로 처리
2.6. servlet, JPA의 네임 스페이스가 Jakarta로 대체
- Java EE가 Jakarta EE로 변경되면서, 주요 패키지 네임스페이스가 javax.* 에서 jakarta.* 로 변경
-> Java Servlet, JPA, JMS 등의 여러 Java EE 기술에 영향 미침
- 스프링 부트 2 버전 사용 중? : 패키지의 이름을 javax -> jakarta를 사용하게 변경해야함
(+ 마이그레이션 시 의존성, 코드, 라이브러리의 호환성을 주의 깊게 살펴보고 테스트하는 것이 중요)
2.7. GraalVM 기반의 스프링 네이티브 공식 지원
- 스프링 부트 3.0 ~ : GraalVM 네이티브 이미지를 공식 지원
- 기존 사용하던 자바 가상머신에 비해 훨씬 빠르게 시작 됨, 더 적은 메모리 공간 차지
- JVM 실행 파일과 비교해 네이티브 이미지 사용 시 ?
=> 가동 시간 짧아짐, 메모리 소모 더 적음
<GraalVM>
: 고성능 런타임 환경, Java 애플리케이션을 네이티브 실행 파일로 컴파일할 수 있는 기능을 제공
- 정적 컴파일: Java 애플리케이션을 GraalVM을 사용하여 네이티브 코드로 컴파일하면, JVM이 필요 없는 독립 실행형 바이너리 파일이 생성됨
- 빠른 시작 시간 서버리스 컴퓨팅이나 빠른 부팅이 중요한 환경에서 유리
Java 문법을 한동안 쓰지 않아서 많이 잊어버렸는데, 애초에 처음 접하는 개념도 있어서 더 생소하게 느껴지는 것 같다.
아직도 새로운
'Spring Boot' 카테고리의 다른 글
[Spring Boot] 9. 스프링 부트 3 구조 살펴보기 (0) | 2024.08.20 |
---|---|
[Spring Boot] 8. 스프링 부트 3 코드 이해하기 (0) | 2024.08.20 |
[Spring Boot] 6. 스프링 부트 자동 구성 (0) | 2024.08.19 |
[Spring Boot] 5. 스프링 부트 스타터 (Spring Boot Starter)살펴보기 (0) | 2024.08.19 |
[Spring Boot] 4. 예제1) @RestController, @GetMapping 으로 컨트롤러 만들기 + Spring Boot 동작원리 이해해보기 (0) | 2024.08.19 |