Development/Code

Spring Boot 3.3의 고급 기능 : 종합 가이드

Danny Seo 2024. 6. 26. 16:11

Spring Boot 3.3 버전

Java 생태계에서 중요한 역할을 하는 Spring Boot는 정기적인 업데이트를 통해 개발자가 견고한 애플리케이션을 쉽게 구축할 수 있도록 도와줍니다. 2024년 5월에 발표된 최신 버전인 Spring Boot 3.3은 성능 개선, 신기술 지원, 개발자 워크플로우 간소화를 위한 다양한 향상된 기능을 제공합니다. 이 글에서는 Spring Boot 3.3의 주요 기능을 자세히 설명하고, 실용적인 예제와 실제 애플리케이션에서 이러한 기능을 어떻게 활용할 수 있는지에 대한 통찰을 제공하겠습니다.

Spring Boot 3.3 : CDS Support

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

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

 

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

What is CDS?

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

 

CDS 구현 단계

 

CDS 아카이브 생성: JDK 12부터 Oracle JDK 바이너리에는 JDK 코어 라이브러리 클래스를 위한 기본 CDS 아카이브가 포함되어 있습니다. 그러나 Spring Boot 애플리케이션에서는 사용자 정의 CDS 아카이브를 생성해야 합니다. 다음은 그 방법입니다:

  1. JAR 콘텐츠 추출
    java -Djarmode=tools -jar my-app.jar extract --destination application
  2. CDS 아카이브 생성:
    cd application java -XX:ArchiveClassesAtExit=application.jsa -Dspring.context.exit=onRefresh -jar my-app.jar

CDS 아카이브 사용: CDS 아카이브가 준비되면 이를 사용하여 애플리케이션의 시작을 최적화할 수 있습니다:

java -XX:SharedArchiveFile=application.jsa -jar my-app.jar

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

Spring Boot 3.3 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 지원을 사용하는 간단한 예제입니다:

@Testcontainers
@SpringBootTest
public class MessagingIntegrationTest {

    @Container
    public static 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을 위한 가상 스레드 구현

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 container image

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 자동 구성: JWT 토큰을 사용한 애플리케이션 보안을 더욱 쉽게 설정할 수 있도록 구성합니다.

다음은 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;
    }
}

결론

Spring Boot 3.3은 프레임워크의 기능을 계속해서 향상시키며 성능 개선, 현대적인 컨테이너 환경 지원, 고급 스레딩 모델을 중심으로 발전하고 있습니다. 이러한 새로운 기능은 애플리케이션 성능을 향상시킬 뿐만 아니라 개발 워크플로우를 간소화하여 Java 개발자들에게 더욱 강력한 도구가 됩니다.

 

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

 

Spring Boot 3.3의 새로운 기능 및 개선 사항에 대한 전체 목록은 Spring Boot 3.3 공식 릴리스 노트를 참조하세요.

질문이나 제안이 있으시면 아래 댓글로 남겨주세요.

끝까지 읽어주셔서 정말 감사합니다! 즐거운 하루 되세요 ㅎㅎ