본문 바로가기
개발/Spring

[Spring] Spring Boot 3 사용해보자!

by baau 2023. 6. 10.

소프트웨어 마에스트로 14기 과정을 참여하면서, 무사히 기획심의를 통과하고 프로젝트 설계 단계에 있다.

서버 개발은 스프링 프레임워크를 사용하기 때문에, Spring Boot 2를 사용할지 Spring Boot 3을 사용할지에 대해 고민하는 중이다.

따라서 Spring Boot 3이 등장하면서 변화한 점과 새로운 개념을 정리하고 이번 프로젝트에 왜 Spring 3을 사용하기로 결정했는지 포스팅하고자 한다.

 

Spring Framework와 Spring Boot

  • Spring Framework
    • 자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로서 엔터프라이즈급 애플리케이션을 개발하기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션
    • 핵심 기능
      • DI (의존성 주입)
      • AOP (관점 지향 프로그래밍)
      • IOC (제어의 역전)
    • 스프링 프레임워크의 다양한 모듈을 사용하여 애플리케이션을 구축하고, 필요한 기능을 선택적으로 추가할 수 있다.
  • Spring Boot
    • 스프링 기반 애플리케이션을 쉽게 구성하고 실행하기 위한 도구
    • 스프링 프레임워크 기능을 기본적으로 제공하면서, 개발자의 생산성을 높이기 위해 핵심 기능을 제공한다.
      • WAS : Tomcat 같은 웹 서버를 내장해서 별도의 웹 서버를 설치하지 않아도 된다.
      • 라이브러리 관리 : 손쉬운 빌드 구성을 위한 Starter 종속성을 제공하고, 스프링과 외부 라이브러리의 버전을 자동으로 관리한다.
      • 자동 구성 : 프로젝트 시작에 필요한 스프링과 외부 라이브러리의 빈을 자동으로 등록한다.
      • 외부 설정 : 환경에 따라 달라져야 하는 외부 설정을 공통화한다.
      • 프로덕션 준비 : 모니터링, 메트릭, 보안 등의 기능을 제공하여 운영환경에 적합한 애플리케이션을 구축할 수 있도록 지원한다.

 

Spring Boot 3.0 요구사항

  • Java 17
  • Kotlin 1.6
  • Jakarta EE 10 (Jakarta EE 9 지원 : 네임스페이스 변경 (javax → jakarta))
  • Spring Framework 6.0 이상
  • Hibernate 6.1
  • Gradle 7.X (7.5 이상)
  • Maven 3 (3.5+)

 

Spring Boot 3.0 변경 사항

  • Java 17
    • 자바 버전이 안정화된 버전으로 Java 8과 Java 11이 존재했고, 그다음으로 안정화된 Java 17 사용한다.
    • 기능이 풍부해진 Java 17은 굳이 Java에서 Kotlin으로 옮겨갈 필요성이 줄고 있다.
  • AOT와 GraalVM, Spring Native 지원 확대
  • 그 외
    • Netty 5를 기반으로 하는 Reactor Netty 2 지원
    • HTTP/RSocket Interface Client 제공
    • Micrometer Observation API 자동 구성
    • HTTP API 에러 처리를 위한 RFC 7807 스펙 지원
    • Logback, Log4j2 날짜 및 시간 기본값 표준 ISO-8601 을 따름
    • Deprecated 된 모든 코드 제거

 

GraalVM

  • Oracle이 만든 JVM과 JDK으로 애플리케이션 성능과 효율성의 향상을 제공하는 고성능 런타임
  • 주요 기능
    • 자바로 만든 JIT 컴파일러 (Graal을 기반으로 하는 고성능 자바)
    • AOT 네이티브 이미지 컴파일러
      • 워밍업 시간 단축 - 서버리스에 적합
    • 다국어 지원
  • Spring Native는 GraalVM을 활용하여 Spring Java 및 Kotlin 애플리케이션을 네이티브 이미지로 컴파일하여 JVM에 구동되는 애플리케이션에 비해 빠른 빌드, 시작 시간과 메모리 오버 헤드를 줄일 수 있다.

 

AOT (Ahead Of Time)

  • AOT는 빌드 시 스프링 애플리케이션을 분석하고 최적화하는 도구
  • 코드를 최적화하고 컴파일 후 네이티브 코드로 제공한다. 
  • 런타임 전에 컴파일이 진행된다.
  • GraalVM Native Configuration이 필요하는 reflection configuration을 생성하여, Spring native 실행 파일로 컴파일하는 데 사용되고 이후 애플리케이션 시작 시간과 메모리 사용량을 줄일 수 있다.
  • AOT 효과
    • JVM 설치 없이 실행이 가능하다.
    • 실행 시 인프라 소모가 줄어든다.
    • 구동시간을 줄일 수 있다.
    • 빈 등록과정을 프로그래밍하여 리플렉션을 줄일 수 있다.
    • 빌드하는 과정이 오래 걸린다는 단점이 있다.
    • 실행 환경 정보 수집이 어렵다.
  • Cloud 환경에서 빌드 시간보다는 실행 과정에서의 부담을 줄여줌으로써 비용을 절감할 수 있다.

 

Spring Boot 3을 선택하는 이유와 걱정..

  • 이번 프로젝트는 MSA와 도커 기반 클라우드 환경에 대해 공부하고 적용할 예정이다.
    • JVM 보다 빠른 애플리케이션 시작 시간과 적은 메모리 사용으로 클라우드 비용을 절감할 수 있을 것이라 기대한다.
    • GraalVM Native Image 컴파일러를 이용하여 클라우드 환경에서 Native Binary를 쉽게 만들 수 있을 것이라 기대한다.
    • AOT Compile을 통해 생성된 바이너리는 적은 오버헤드로 더 적은 CPU와 메모리 자원을 사용하기 때문에, 빠른 부팅과 적은 리소스 사용이 요구되는 클라우드 환경에서 적합하다고 판단하였다.
  • GraalVM의 경우 리플렉션 및 프록시에 대한 구성 필요 등 많은 제약 사항이 존재한다고 한다.
    • 프로젝트 진행 시 여러 이슈가 발생할 수 있지만,,, 경험해 보는 것 또한 중요하다고 생각한다...
  • 최신 버전이라 아직 여러 라이브러리가 호환되지 않을 가능성이 높아 삽질을 해야할 수 있지만, 도저언!