Java Collection Framework: List, Map, Set 탐구
자바 개발자가 반드시 알아야 할 컬렉션 프레임워크(JCF)의 뿌리가 되는 List, Map, Set에 대한 메모리 구조, Big-O 성능 분석, Java 21 Sequenced Collection에 대해서 정리해보았다.
배움의 즐거움, 나눔의 가치를 실천하는 DevLog
자바 개발자가 반드시 알아야 할 컬렉션 프레임워크(JCF)의 뿌리가 되는 List, Map, Set에 대한 메모리 구조, Big-O 성능 분석, Java 21 Sequenced Collection에 대해서 정리해보았다.
우리가 작성한 수많은 서비스 객체들이 어느 시점에 생성되고 어떤 과정을 거쳐 완성되며 어떻게 서로 소통하는지를 아는 것은 프레임워크를 사용하는 단계에서 제어하는 단계로 넘어가는 핵심 역할을 할 수 있도록 한다. 이번 포스팅에서는 Bean의 생성 후 초기 작업(Bean Initialization)과 Bean 생성 시점에 틈새를 공략하는 확장 기법 그리고 부트스트래핑 과정에서 발생하는 이벤트와 이벤트 시스템(Event System)에 대해서 정리해 보고자 한다.
SpringApplication 인스턴스가 생성된 후 인스턴스의 run() 호출시(정적 메서드 run()이 아니다) Application Bootstraping을 위한 13단계를 거치는데 어떤 과정들을 수행하는지 알아보자. SpringApplication 클래스 코드는 Spring Boot 3.2.1 버전을 사용하였다.
Spring Boot 애플리케이션을 개발할 때 우리가 가장 먼저 마주하는 코드는 @SpringBootApplication 어노테이션이 붙은 클래스와 그 안의 main 메서드일 것이다.
몇 줄 안되는 매우 간단한 코드지만 SpringApplication.run() 호출 뒤에는 수십 개의 클래스가 협력하여 복잡한 초기화 과정을 수행한다. Spring Boot는 이러한 복잡성을 숨기고 개발자에게 단순한 인터페이스를 제공하지만 내부 동작을 이해 하면 더 효과적으로 Spring Boot를 활용할 수 있다. 이번 포스팅에서는 SpringApplication 객체가 생성될 때 내부적으로 어떤 동작들이 이루어지는지 정리해 보고자 한다.
Spring Boot 분산 환경(멀티 인스턴스)에서 발생하는 스케줄러 중복 실행 문제를 ShedLock과 Redis를 활용해 해결하는 방법과 상세 설정 과정을 정리했다.
자바에서 InputStream을 다루다 보면 파일의 헤더만 살짝 읽어 파일의 형식을 확인한 뒤 다시 처음부터 전체 데이터를 읽어야 하는 상황이 생기는 경우가 있다. 이 때 직관적으로 reset() 메서드를 떠올리지만 막상 코드를 실행하면 IOException이 발생하는 경우가 있다. 이번 포스팅에서는 스트림에서 이전 위치로 돌아가는 방법과 함께 BufferedInputStream의 mark/reset/fill의 동작에 대해서 분석하고 RandomAccessFile의 사용법에 대해서 정리해보고자 한다.
자바 기반의 Spring Boot로 백엔드 개발을 하다 보면 어느 순간 애플리케이션이 느려지거나 식은땀 나게 만드는 OutOfMemoryError같은 에러를 한번씩은 봤을 것이다. 이 때 GC의 동작 원리를 정확히 알고 있다면 문제의 원인을 찾아 해결하는데 많은 도움이 된다. 이번 포스팅에서는 자바 애플리케이션을 개발하면서도 막연히 알고 있던 가비지 컬렉션(GC)에 대해서 정리해 보고자 한다.
2023년 9월 21일에 java 21이 배포가 되었다. java 21에서 새롭게 소개된 항목 중 하나가 기존의 스레드보다 더 경량화되어 설계된 virtual thread (가상 스레드)라고 할 수 있겠다. 이번 포스팅에서 새롭게 소개된 virtual thread(이하 가상 스레드)에 대해서 정리해 보고자 한다.
자바 애플리케이션의 성능을 결정짓는 핵심은 효율적인 메모리 설계와 이를 뒷받침하는 검증 과정에 있다. 이번 포스팅에서는 문자열 최적화부터 가상스레드까지 메모리를 아끼는 5가지 기법을 소개하고자 한다.