라즈베리 파이 Zero 2, 드디어 Java 21을 품다 (충돌 해결)
최근 IoT나 임베디드 환경에서 Java가 활용되는 사례가 늘어나고 있는 상황에서 저전력 마이크로 컴퓨터의 대명사 격인 라즈베리 파이 Zero 2와 Java 21이상 버전 사이의 충돌 문제가 해결되었다는 소식이다.
배움의 즐거움, 나눔의 가치를 실천하는 DevLog
최근 IoT나 임베디드 환경에서 Java가 활용되는 사례가 늘어나고 있는 상황에서 저전력 마이크로 컴퓨터의 대명사 격인 라즈베리 파이 Zero 2와 Java 21이상 버전 사이의 충돌 문제가 해결되었다는 소식이다.
Java 애플리케이션을 개발하다 보면 스레드 사용은 매우 중요한 요소다. 그동안 ExecutorService나 CompletableFuture를 사용하면서 기능적으로 하나의 트랜잭션 기능으로 묶인 여러 스레드 중에서 하나라도 예외가 발생하는 스레드가 있다면 나머지 스레드를 관리하기 위한 복잡한 에러 로직을 사용했을 것이다.(cancel() 호출..) 하지만 이번에 소개할 Structured Concurrency는 이러한 골치아픈 문제를 해결해 줄 것이다. 또한 JDK21 버전에서 정식 릴리즈된 가상 스레드에 맞춰 병렬로 실행 되는 여러 스레드에 대한 관리 측면에서도 많은 도움이 될 것 같다.
Java 기반 시스템을 운영하다 보면 보안 설정을 위해서 인증서나 비밀 키를 저장하는 키스토어를 자주 다루게 된다.
특히 java.io.IOException: Invalid Keystore Format 예외는 어쩌면 가장 자주 마주치는 예외일 것이다.
이번 포스팅에서는 Baeldung의 최신 가이드를 바탕으로 이 에러의 원인을 파악하고 해결하는 실무 노하우에 대해서 정리하고자 한다.
이 에러는 keystore 파일 형식과 Java 코드에서 기대하는 형식(JKS, PKCS12등)이 일치하지 않거나 빌드 과정 또는 전송 중에 파일이 손상된 경우 발생하며 정확한 진단 도구와 설정을 통해 해결할 수 있다.
지난 9월에 Java25 버전이 정식 릴리즈 됐다. 여러가지 개선과 변화가 있었지만 그 중 눈에 띄는 항목 중 하나가 있었다. 바로 Compact Object Header 기능으로 객체의 헤더 사이즈를 기존 12~16byte에서 8byte로 줄였다는 내용이다. 8byte 라는 수치가 상당히 작게 느껴질 수 있겠지만 수천, 수만개의 객체들이 생성되는 애플리케이션에서 객체당 4~8byte 절약은 메모리 절감 효과를 기대할 수 있다. 이번 포스팅에서는 JOL(Java Object Layer)를 사용하여 정말 객체의 헤더 사이즈가 줄어드는지 확인해 보자.
java 21 부터 preview기능으로 시작한 범위 지정 값(이하 scoped value) API가 java 25부터 정식 기능으로 채택되었다.
java scoped value API는 메서드 매개변수를 사용하지 않고 메서드에 안전하고 효율적으로 데이터를 공유할 수 있도록 한다.
특히 java21 부터 도입된 가상 스레드를 사용할 때 ThreadLocal을 사용하면서 발생할 수 있는 문제에 대해서 scoped value 기능은 ThreadLocal에 대한 문제들을 해결할 수 있을 것이다.
이번 포스팅에서는 scoped value에 대한 도입 배경과 ThreadLocal 사용에 대한 문제와 함께 scoped value를 사용하는 방법에 대해서 정리해 보고자 한다. 샘플코드는 Java21 (preview)로 작성하였다.
Server Sent Event (SSE)는 웹 어플리케이션에서 실시간 업데이트를 제공하는 데 사용되는 웹 기술 중 하나이다. Spring에서는 Spring MVC에서 사용되는 SseEmitter 클래스를 제공하여 손쉽게 SSE 스트림을 생성하고 클라이언트에게 이벤트를 푸시할 수 있도록 한다. 이를 통해 클라이언트가 연결을 유지하면서 서버로부터 데이터를 지속적으로 수신할 수 있도록 한다. 이번 포스팅에서는 Spring에서 SSE를 사용하는 방법에 대해서 정리해보고자 한다.
Spring Boot의 application.yml(.properties)과 같은 설정 정보 파일에는 데이터 베이스 연결 정보나 API 키, 비밀번호와 같은 민감한 정보를 설정해야 하는 경우가 있다. 이러한 민감한 정보를 평문으로 설정하게 되면 간혹 정보가 노출되었을 때 심각한 문제를 초래 할 수 있다. Jasypt 라이브러리를 사용하여 어플리케이션의 설정 정보를 암호화하여 민감한 정보를 보호할 수 있다. 간단한 예제 코드와 함께 spring에서 Jasypt 라이브러리를 사용하는 방법에 대해서 정리해 보고자 한다.
자바 애플리케이션 개발을 하다 보면 종종 문자열 타입의 시간 정보를 자바의 LocalDateTime 혹은 LocalDate, LocalTime과 같은 인스턴스로 변환을 하거나 역으로 원하는 시간 형식으로 문자열로 변환을 해야 하는 경우가 있다. 또한 지역 시간(timezone)에 맞도록 시간을 변경해야 하는 경우도 있을 것이다. 이번 포스팅에서는 java time과 java time convert(시간 변환)에 대해서 정리해 보고자 한다.
Multipass는 쉽고 빠르게 가상 머신을 생성하고 관리할 수 있는 도구다. MacOS, Linux, Windows 등 다양한 운영체제에서 사용할 수 있으며, 단시간에 클라우드와 유사한 환경을 로컬에 구축할 수 있다. Multipass는 기본적으로 우분투 이미지를 제공하지만, 다른 이미지를 사용할 수도 있어 다양한 개발 환경을 지원한다.
Spring Boot JSON 데이터 처리는 RESTful API를 구축하거나 데이터 전송을 수행할 때 필수적인 요소라고 할 수 있다.
Spring Boot는 기본적으로 Jackson 라이브러리를 사용하여 JSON 직렬화 및 역직렬화를 자동으로 처리한다. 따라서 개발자는 복잡한 설정 없이도 객체를 JSON으로 변환하고, JSON 데이터를 객체로 손쉽게 맵핑할 수 있다.
이번 포스팅에서는 Spring Boot의 JSON Auto Configuration 방식과 주요 설정 방법에 대해서 정리하고자 한다.