Spring

Spring Boot 3.3의 모든 것: 고급 기능 완벽 가이드

Written by 개발자서동우 · 1 min read >
Spring Boot 3.3

안녕하세요! Devloo 입니다. Java 생태계에서 중요한 역할을 하는 Spring Boot는 정기적인 업데이트를 통해 개발자들이 견고한 애플리케이션을 쉽게 구축할 수 있도록 지속적으로 발전하고 있습니다. 2024년 5월에 발표된 최신 버전인 Spring Boot 3.3은 성능 개선, 신기술 지원, 개발자 워크플로우 간소화를 위한 다양한 기능을 제공합니다.

이번 글에서는 Spring Boot 3.3의 주요 기능을 자세히 설명하고, 실용적인 예제와 실제 애플리케이션에서 이러한 기능을 어떻게 활용할 수 있는지에 대해 자세히 알아보고자 합니다 🙂

1. 클래스 데이터 공유(CDS) 지원

Spring Boot 3.3에서 도입된 주요 기능 중 하나는 클래스 데이터 공유(CDS)입니다. CDS는 애플리케이션의 시작 시간을 단축하고 메모리 소비를 줄이기 위해 설계되었습니다. 이 기능은 Spring Boot 3.2에서 도입된 Project CRaC(Checkpoint에서의 복구 조정)을 기반으로 하고 있습니다.

클래스 데이터 공유(CDS)란?
클래스 데이터 공유(CDS)란 무엇인가?
클래스 데이터 공유(CDS)란 무엇인가?

CDS는 여러 JVM 프로세스 간에 클래스 메타데이터를 공유할 수 있게 해주는 JVM 기능입니다. 애플리케이션 시작 시 메모리에 매핑될 수 있는 공유 아카이브를 생성하여 더 빠른 클래스 로딩과 메모리 사용량 감소를 실현할 수 있습니다.

CDS 구현 단계
  1. CDS 아카이브 생성: JDK 12부터 Oracle JDK 바이너리에는 JDK 코어 라이브러리 클래스를 위한 기본 CDS 아카이브가 포함되어 있습니다. 그러나 Spring Boot 애플리케이션의 경우 사용자 정의 CDS 아카이브를 생성해야 합니다. 다음은 그 방법입니다:
java -Djarmode=tools -jar my-app.jar extract --destination application

cd application
java -XX:ArchiveClassesAtExit=application.jsa -Dspring.context.exit=onRefresh -jar my-app.jar
  1. CDS 아카이브 사용: 생성된 CDS 아카이브를 사용하여 애플리케이션의 시작을 최적화할 수 있습니다.
java -XX:SharedArchiveFile=application.jsa -jar my-app.jar

이 공유 아카이브를 사용하면 JVM이 필요한 클래스를 빠르게 로드하여 시작 시간과 메모리 사용량을 줄일 수 있습니다. 자세한 내용은 Oracle JVM 가이드의 CDS 섹션을 참조하세요.

2. 향상된 서비스 연결 지원

Spring Boot 3.1에서 도입된 서비스 연결 기능은 통합 테스트 및 개발 중 외부 서비스에 연결하는 과정을 단순화했습니다. Spring Boot 3.3은 이 기능을 더 많은 컨테이너에 적용하여 다양한 서비스와의 통합 및 테스트를 더욱 쉽게 할 수 있도록 지원합니다.

새롭게 지원되는 컨테이너:
  • Apache ActiveMQ:
    • ArtemisContainer: apache/activemq-artemis 이미지를 사용
    • ActiveMQContainer: apache/activemq-classic 이미지를 사용
  • LDAP: osixia/openldap 이미지를 사용

이 추가 기능들은 개발자들에게 개발 및 테스트 환경을 설정하는 데 있어 더 많은 유연성과 옵션을 제공합니다. 다음은 Spring Boot 애플리케이션에서 새로운 ActiveMQ 지원을 사용하는 간단한 예제입니다:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jms.core.JmsTemplate;
import org.testcontainers.containers.ActiveMQContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;

import static org.junit.jupiter.api.Assertions.assertEquals;

@Testcontainers
@SpringBootTest
public class MessagingIntegrationTest {

    @Container
    private static final ActiveMQContainer activeMQContainer = 
            new ActiveMQContainer("apache/activemq-artemis");

    @Autowired
    private JmsTemplate jmsTemplate;

    @Test
    public void testSendAndReceive() {
        String message = "Hello, ActiveMQ!";
        jmsTemplate.convertAndSend("testQueue", message);
        String receivedMessage = (String) jmsTemplate.receiveAndConvert("testQueue");
        assertEquals(message, receivedMessage);
    }
}

3. WebSocket을 위한 가상 스레드 지원

Spring Boot 3.2에서 도입된 가상 스레드는 3.3 버전에서 WebSocket 지원이 추가되어 더욱 강화되었습니다. 이 기능은 WebSocket ChannelRegistration에 등록된 새로운 AsyncTaskExecutor를 활용합니다. 가상 스레드를 사용할 때는 보통 가상 스레드가 활성화된 SimpleAsyncTaskExecutor를 사용하여 WebSocket 통신을 더 효율적이고 확장 가능하게 만듭니다.

자바의 가상 스레드
자바의 가상 스레드
WebSocket을 위한 가상 스레드 구현

WebSocket에서 가상 스레드 지원을 활성화하려면 WebSocketConfigurer를 다음과 같이 구성합니다:

@Configuration
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new MyWebSocketHandler(), "/ws")
                .setAllowedOrigins("*")
                .setTaskExecutor(new SimpleAsyncTaskExecutor());
    }
}

이 구성을 통해 WebSocket 통신은 가상 스레드의 동시성 이점을 활용하여 효율적으로 처리됩니다.

자바의 가상 스레드
자바의 가상 스레드

4. Bitnami 컨테이너 이미지를 위한 Docker Compose 지원

Spring Boot 3.3은 Docker Compose 통합에서 Bitnami 컨테이너 이미지와의 호환성 문제를 해결했습니다. 이 개선 사항은 Bitnami 컨테이너를 정확하게 감지하고 구성하여 원활한 개발 환경을 제공합니다.

Bitnami 컨테이너 이미지
Bitnami 컨테이너 이미지
Bitnami 컨테이너 이미지 사용하기

다음은 Spring Boot 애플리케이션에서 Bitnami MySQL 컨테이너를 사용하는 예제 구성입니다:

version: '3.8'
services:
  db:
    image: bitnami/mysql:latest
    environment:
      - MYSQL_ROOT_PASSWORD=root_password
      - MYSQL_DATABASE=my_database
      - MYSQL_USER=my_user
      - MYSQL_PASSWORD=my_password
  app:
    image: my-spring-boot-app:latest
    depends_on:
      - db
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/my_database
      - SPRING_DATASOURCE_USERNAME=my_user
      - SPRING_DATASOURCE_PASSWORD=my_password

이 구성을 통해 Spring Boot 애플리케이션은 Bitnami에서 제공하는 MySQL 데이터베이스 컨테이너와 원활하게 상호 작용할 수 있습니다.

추가 개선 사항

Spring Boot 3.3은 관측 가능성, 보안, 전반적인 개발자 경험을 향상시키기 위한 여러 가지 개선 사항을 포함하고 있습니다.

관측 가능성 개선
  • Micrometer의 @SpanTag: 스팬 태그 지원을 추가하여 분산 추적에서의 관측 가능성을 향상시킵니다.
  • Process InfoContributor: 모니터링 목적으로 더 자세한 프로세스 정보를 제공합니다.
  • Prometheus 1.x 지원: 메트릭 수집을 위한 Prometheus 1.x와의 호환성을 보장합니다.
보안 개선
  • JwtAuthenticationConverter 자동 구성(Auto-Configuration): JWT 인증 구성을 간소화하여 애플리케이션 보안을 더 쉽게 설정할 수 있게 합니다.

    JwtAuthenticationConverter 자동 구성

다음은 Spring Boot 애플리케이션에서 JWT 인증을 구성하는 간단한 예제입니다:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers("/public/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .oauth2ResourceServer()
            .jwt()
            .jwtAuthenticationConverter(jwtAuthenticationConverter());
    }

    private JwtAuthenticationConverter jwtAuthenticationConverter() {
        JwtAuthenticationConverter converter = new JwtAuthenticationConverter();
        converter.setJwtGrantedAuthoritiesConverter(new CustomJwtGrantedAuthoritiesConverter());
        return converter;
    }
}

이 구성을 통해 JWT 인증을 손쉽게 설정하고 애플리케이션 보안을 강화할 수 있습니다.

결론

Spring Boot 3.3은 성능 향상, 최신 컨테이너 환경 지원 강화, 고급 스레드 모델 등 다양한 기능을 지속적으로 발전시키고 있습니다. 이러한 새로운 기능들은 애플리케이션 성능을 높이고 개발 워크플로우를 간소화하여 Spring Boot를 Java 개발자들에게 더욱 강력한 도구로 만들어 줍니다.

이 업데이트를 프로젝트에 반영하여 새로운 기능을 활용하면 Spring Boot 애플리케이션을 더욱 빠르고 효율적이며 관리하기 쉽게 최적화할 수 있습니다. Spring Boot의 최신 발전 사항을 계속 따라가며 프로젝트에서 최대한 활용해 보세요.

새로운 기능 및 개선 사항에 대한 자세한 내용은 Spring Boot 3.3 공식 릴리스 노트를 참조하세요.

이번 시간에는 Spring Boot 3.3에 대해 알아보는 시간을 갖았습니다.

끝까지 읽어주셔서 정말 감사합니다 🙂 . 궁금하신 점은 댓글로 편하게 남겨주세요 (_ _) !!

Written by 개발자서동우
안녕하세요! 저는 기술 분야에서 활동 중인 개발자 서동우입니다. 명품 플랫폼 (주)트렌비의 창업 멤버이자 CTO로 활동했으며, AI 기술회사 (주)헤드리스의 공동 창업자이자 CTO로서 역할을 수행했습니다. 다양한 스타트업에서 일하며 회사의 성장과 더불어 비즈니스 상황에 맞는 기술 선택, 개발팀 구성 및 문화 정착에 깊은 경험을 쌓았습니다. 개발 관련 고민은 언제든지 편하게 연락주세요 :) https://linktr.ee/dannyseo Profile

Leave a Reply

Your email address will not be published. Required fields are marked *