API 접근 기록을 저장하는 기능을 맡으면서 Path, QueryString, Referrer, Body 값을 DB에 저장을 한다. HTTP의 주요 값을 갖고 있는 HttpServletRequest 클래스를 통해서 Path, QueryString, Referrer 조회하면 정상적으로 조회가 되지만, Body 조회를 하면 값이 없다고 나온다. 그 이유를 찾아보니 네트워크로부터 들어오는 데이터여서 한 번만 읽을 수 있도록 제한되어 있다고 한다. 개발환경 : Java 11, SpringBoot 2.7.71. 문제 사례public class TestController { @PostMapping("/test") public void test(@RequestBody String body, HttpSer..
회원들의 정보를 엑셀 다운로드를 했는데 메모리 부족 에러(OOM)가 뜬다. 자세히 들여보니, 대량의 데이터를 조회했을 때 DB에서 애플리케이션한테 데이터를 받는 과정에서 OOM 발생하였다.발생한 원인을 파악하기 위해 JVM heap 메모리 최대 크기에 대해 알아보았다.메모리 최대 크기는 운영 체제 및 시스템의 물리적 메모리 등 따라서 정해진다.내 PC 기준(mac, 64bit, 메모리 32GB) 사용 가능한 최대 메모리와 JVM heap memory 조회해봤더니// 사용 가능한 최대 메모리long maxMemory = Runtime.getRuntime().maxMemory();// JVM heap memorylong heapSize = Runtime.getRuntime().totalMemory();- 사..
다국적 고객을 대상으로 하는 서비스에서는 사용자 경험을 높이기 위해 다양한 언어로 메세지를 제공해야 합니다. 이 과정에서 MessageSource, Locale, MessageCode와 같은 요소들이 필요합니다. 그러나 이러한 요소로 인해서 다국어 메세지 처리가 애플리케이션에서 문제점을 낳게 되는데, 어떤 문제점이 있는지 어떻게 해결했는지 살펴보도록 하겠습니다. 개발환경 : Java 11, SpringBoot 2.7.71. 문제점 - 의존성 증가와 복잡한 코드주문 조회 예제 코드OrdersController 클래스public class OrdersController { private final OrdersService ordersService; @GetMapping("/order/{o..
들어가며 자바 언어를 공부하면서 인터페이싱과 추상화에 대해 이론적으로 공부는 어느정도(많이?) 했다. 처음에 인터페이스 클래스 썼을 때 서비스 클래스를 만들면 그 해당 서비스의 인터페이스 클래스를 만들어서 상속 받아 처리하는 구조로 썼지만 "왜 이렇게 해야하지? 이러면 불필요한 클래스 하나 더 추가하는 게 아닌가?" 생각이 들곤 했다. 이번에 다시 공부하면서 왜 사용하는지? 어떻게 써야 좋은건지? 어떤 경우에 써야하는지? 질문에 대한 답을 찾은 거 같아서 글을 남기기로 하였다. 요구사항 요구사항은 메세지 발송 기능이다. 메세지 발송 종류는 이메일 발송, 카카오 알림톡 발송, 앱 푸쉬 발송 3가지가 있다. 각 메세지 발송마다 여러가지 형태가 존재한다. 예를 들어 카카오 알림톡일 경우 메세지 종류는 자유형식..