SpringBoot 3.0의 개선사항
언젠가부터 Spring Initializr에서 spring 3.0부터만 지원하게 되었다...
그래서 이번 포스트에서는 springboot 3.0에 대해서 알아보도록 하겠다.
참고로 springboot는 java 17이상을 지원하기때문에, java17의 다른점을 알고 싶은 분들은 아래 링크 클릭!
2024.01.11 - [java] - [java] java 17의 새로운 점들!
3.0의 개선사항은 아래와 같다.
- Java 17 이상을 지원
- Java EE를 jakarta EE 로 대체 (javax.* 에서 jakarta.* 로 변경) ( java 상표권 이슈로 변경)
- GraalVM 기반의 Spring Native가 3년간의 실험을 마치고 공식 지원을 시작
- HTTP/RSocket Interface Client를 제공
- Micrometer Observation API가 자동으로 구성되며, Observability 가 공식 지원 시작.
- HTTP API 에러 처리를 위한 RFC 7807 스펙을 지원. (ProblemDetail 클래스 지원 )
- 보안상 이슈로 /api/hello 와 /api/hello/ 는 더 이상 일치하지 않음.
- Logback 및 Log4j2 날짜 및 시간의 기본값이 ISO-8601 표준을 따름. (2017-03-16T17:40:00+09:00 국제표준)
- 사용되지 않는 (Deprecated) 모든 코드가 제거됨.
무슨 말인지 하나씩 짚어보자.
Java EE를 jakarta EE 로 대체
java관련 회사들이 인수되고 합병되고 그런 과정에서 상표권이슈가 있었다고 한다. 그래서 javaEE가 jakarta EE로 대체되었다.
Spring Native?
SpringNative는 2021년만해도 베타 릴리즈였다.
Java와 Kotlin을 지원하며 독립실행파일로 배포/실행이 가능하다(JVM설치가 필요없다)
GrallVM을 활용하여 네이티브 이밎로 컴파일하여 JVM에 비해 빠른 빌드, 빠른 어플리케이션 시작시간, 적은 메모리를 사용한다.
RSocket?
binary, point-to-point communication protocol로 분산 application환경에서 사용된다. HTTP의 대안이다.
Micrometer Observation API
먼저 observability란 출력을 통해 내부 시스템을 얼마나 잘 이해할 수 있는가를 뜻한다. (로그 등)
Micrometer Observation API란 low lever API들 (metrics, logging, tracing) 을 숨길 수 있는 기능을 제공하는 API이다. 이에따라 어떻게 감시할지는 숨기고 무엇을 감시할지에 더 집중할 수 있다.
예를들어
비즈니스코드를 보자
여기에 API를 사용해보자
=> logger를 쓸 필요 없다. 코드가 섞이지 않는다 -> 하고자 하는 일에 집중할 수 있다.
ex) observe가 시작될때, 끝날때, error가 날 때, event를 탈 때
또 이벤트를 handling할수도 있다.
Problem Detail Class RFC 7807
기존의 RFC7230은 오류가 났을 때 충분한 정보 전달이 어려웠다. 더 자세한 정보를 전달하기 위해 RFC 7807이 나왔다.
예를 들어 아래는 403 코드가 떨어진 이유에 대해 상세히 설명한다.
java에서는 이렇게 사용한다.
/api/hello 와 /api/hello/의 차이
/api/hello는 해당 리소스에 직접 접근하는 것을 의미한다.
/api/hello/는 해당 리소스의 컬렉션을 나타내거나 리소스에 대한 작업을 수행하는것을 의미한다. 이때 이 방법은 트레버스 경로공격(Path Traversal Attack)에 노출 될 수 있다.
* 트레버스 경로공격
- ../../로 탐색하며 부모 디렉토리로 이동하여 정보를 빼내는 방법.
기존에는 정규화 및 리다이렉션이 일반적이었다. 물론 보안 정책에 따라 슬래시가 있는것과 없는 것의 접근 권한을 다르게 설정 할 수도 있었다.
트레버스 경로 공격을 예방하기 위해 서버는 경로를 정규화처리해서 일관된 방식으로 처리해야한다. 일반적으로 슬래시의 유무에 상관없이 동일한 리소스를 가리키게끔 정규화한다.
하지만 3.0부터는 달라졌다. 요즘에는 URL경로는 가능한 정규화를 피하고 그대로 두어야 한다고 주장하는 글들을 볼 수 있다. 하지만 이 업데이트로 migration 하는데 반발이 많았다....
https://github.com/spring-projects/spring-framework/issues/28552
참고
'Spring' 카테고리의 다른 글
[Spring] 정적파일 경로 (0) | 2024.04.05 |
---|---|
[Spring] Spring MVC 설정(XML방식) (0) | 2024.04.05 |
[spring] swagger-fox 연동하기 (0) | 2023.08.04 |
[springboot] ApplicationPidFileWriter 란? (0) | 2023.08.03 |
[spring] form데이터 @RequestPart vs @RequestParam (2) | 2023.07.20 |