SpringBoot 2 와 3

최준호·2023년 5월 30일
0

Appling

목록 보기
1/12
post-thumbnail

참고글
Spring Boot 3.0 무엇이 달라질까?
Spring Boot 3 and Spring Framework 6.0 Baeldung
Spring Github Wiki

📗 왜 SpringBoot3을 알아야 하나?

왜 SpringBoot 3을 알아야할까? 그건 간단하다. SpringBoo2는 23년 11월까지 지원 후 지원 종료가 되고 그 이후로는 SpringBoot3으로 사용해야하기 때문이다.

물론 SpringBoot2 지원이 종료된다고 해서 11월부터 서비스에 장애가 생기거나 큰 문제가 발생할건 아니지만 좀 더 나은 환경에서 개발하지 못할 수 있기 때문에 Spring 개발자라면 SpringBoot3에 대해 알아두는 것은 좋을거 같다.

📄 SpringBoot3이 되며 바뀌는 것들

✅ Java17

기존의 SpringBoot2 에서는 기본 설정으로 java8 이상을 권장했고 java8 이상의 프로젝트만 실행이 가능했다.
하지만 SpringBoot3 부터는 기본 설정으로 java17을 사용하도록 권장하고 있다. 또한 java17 이하 버전으로 실행시 프로젝트 빌드에서 에러가 나기 때문에 무조건 17 이상을 사용해야 한다.

그렇기 때문에 기본적인 java17의 문법을 알고 있는게 큰 도움이 될것이다~!
아래 내가 예전에 정리해둔 java8 ~ 17까지의 특징들을 알아두는 것도 좋을것이다~!!

Java17을 왜 고려해야 할까?

✅ JavaEE 대신 Jakarta (javax -> jakarta)

기존에 Spring으로 개발하면서 JPA를 사용하거나 다른 개발을 하다보면 javax.* 파일들을 import해서 사용했을 것이다. 해당 부분이 jakarta.*으로 패키지가 이동되었다.

그 이유에는 JavaEE(Enterprise Edition)에서 지원하는 기능으로는 Servlet, JSP, JDBC, JMX 등이 있었는데 기업용 프로젝트로 사용되고 있었지만 어느 순간부터 오픈소스에 밀리기 시작하여 결국 2017년 9월 오라클이 이클립스 재단에 JavaEE를 이관하였다.
그 후 이클립스에서 JavaEE에 완벽 호환하는 Jakarta를 출시하였고 기존 JavaEE는 오라클사에서 상표권을 갖고 있었기 때문에 Jakarta라는 이름으로 현재 서비스되고 있는 것이다.
그리고 현재 해당 패키지로 변경된것 뿐이다.

✅ Spring Native (w.GraalVM)

요즘 트렌드 Server 트렌드는 빠르게 개발하고 빠르게 배포되는 것이다. 그리고 Server를 스케일 아웃을 통해 동일한 여러대의 서버를 통해 부하를 분산하는 것이 주요 운영 방법이다.

그에 따라 하나의 서버에서 여러대의 서버가 동시에 실행되기 위해서는 메모리 사용도가 낮고 서버의 크기가 작을 수록 좋다. 또한 서버가 새롭게 실행되는 속도도 빨라야 한다.

하지만 아쉽게도... Spring은 프로젝트 규모도 클 뿐 아니라 메모리 사용량도 적은 편이 아니다. 이를 해결하기 위해 나온 개념이 GraalVM이다.

참고글
(nhn cloud) GraalVM, Spring Native 맛보기
Spring GraalVM Native Image 띄어보기

내가 이해한 GraalVM의 동작은 Docker를 사용하여 실행되는 서버를 이미지로 Docker에 올려두고 해당 이미지를 실행하는 방식으로 동작한다.
그러므로 이전에 build를 해야하는 시간을 확 줄여 실행 속도를 빠르게 만들었다.

여기서 알아두고 갈 개념으로는 JIT(Just In Time) Compile과 AOT(Ahead Of Time) Compile이다. GraalVM에서 사용되는 개념은 AOT이며 기존에 우리가 사용하던 방식이 JIT이다.

JIT은 런타임시에 컴파일을한다. 그래서 런타임시 메모리를 많이 사용하게 되고 느리다.

AOT는 실행 전 코드에 대한 정적 테스트를 만들고, 데이터 결과로 컴파일해둔다. 그래서 실행시에 컴파일하지 않고 미리 컴파일 해두기 때문에 속도가 빠르다.

✅ RFC 7807

이전에 Spring에서 API를 만들면 에러 코드에 대해 정의하기가 애매했다 그 이유는 Spring에서 사용하는 HttpStatus Code 값과 실제 API에서 통용되고 있는 상태값을 정의하는 값이 달랐기 때문이다.

ex) Spring의 HttpStatus에는 Unauthorized가 없다...

또한 에러를 핸들링 하기 위해서 API의 공통된 명세가 없어 대부분 자기 입맛대로 만들거나 선두주자(페이스북, 구글, 네이버, 카카오) 등 회사의 API 에러 핸들링 코드를 참고하여 해당 명세를 따라했었다.

그래서 SpringBoot3 부터는 에러를 명세하는 부분을 공통으로 사용할 수 있도록 명세해둔 것이다.

예시로는 아래와 같은 규격들이 있다.

HTTP/1.1 403 Forbidden
Content-Type: application/problem+json
Content-Language: en

{
  "type": "https://myexample.com/issues/out-of-credit", 
  "title": "You do not have enough credit to book a room.", 
  "detail": "Your current balance is 30 EUR, but a room costs 50 EUR per night.",
  "instance": "/accounts/12345/errors/out-of-credit/err_instance_id=123",
  "balance": 30,
  "account": "/accounts/12345"
}
HTTP/1.1 400 Bad Request
Content-Type: application/problem+json
Content-Language: en
{
 "type": "https://example.net/validation-error",
 "title": "Your request is not valid.",
 "errors": [
       {
        "detail": "must be a positive integer",
        "pointer": "#/age"
       },
       {
        "detail": "must be 'green', 'red' or 'blue'",
        "pointer": "#/profile/color"
       }
     ]
 }

참고글 Spring Boot 3.0 무엇이 달라질까?
참고글 링크드인

이외에 더 많은 내용은 Spring Github Wiki를 참고하면 도움이 될것 같다!

이 외에도 SpringBoot3 & Spring Framework 6.0으로 변경되며 적지 않은 것들이 바뀐다. 나같은 경우 Security 설정이 이전에 사용하던 2버전 설정과 모두 상이해져 3을 시작해보려고 마음 먹었다. 앞으로 SpringBoot3에 익숙해질 수 있도록 변경된 부분들은 앞으로 토이프로젝트를 진행하면서 확인해봐야겠다!

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글