회사에서 서비스 현황을 한눈에 볼 수 있는 대시보드를 만들게 되었다.이번 대시보드를 개발하면서, DB 쿼리 레벨의 집계와 설계YouTube 대시보드 요청 쿼리 구조백엔드–프론트엔드 간 효율적인 네트워크 통신실제 사용자 관점에서의 UX 개선까지 한 번에 고민해볼 수 있었던 점이 매우 재밌었고, 유익한 경험이었기에 이를 기억하고자 또 공유하고 기록을 남긴다.대시보드 요구 사항처음 요구사항은 비교적 단순해 보였다.달력을 통한 자유로운 기간 선택집계 단위 선택 (Hour / Day / Week / Month / Year)멀티 리전/여러 고객사(프로젝트) 지원각 집계 단위마다 표출할 수 있는 데이터 최대 수량을 지정 할 수 있어야 한다.(e.g. 시간 단위 선택시 최근 24시간 표출)그런데 꼭 기간 마다 표출할 ..
java,springboot
1. 서론Spring WebFlux + R2DBC + MariaDB 조합으로 서비스를 개발하다 보면, 대량 INSERT가 필요한 구간에서 성능 이슈를 마주하게 된다. 특히 “키 생성”, “로그 적재”, “배치성 데이터 적재”처럼 한 번에 수천~수만 건을 넣어야 하는 상황에서Reactive니까 알아서 빠르겠지 라는 기대와 달리,실제로는 몇 분 단위로 시간이 걸리는 경우를 겪게 된다.이 글은Spring WebFlux + R2DBC + MariaDB 환경에서대량 INSERT 성능이 잘 나오지 않았던 원인을 분석하고,다중 VALUES 기반 Bulk Insert 유틸리티로 성능을 개선한 사례와,그 과정에서 고려해야 할 보안·유지보수 관점의 트레이드오프까지 정리한 기록이다. 2. 문제 상황개발하고 있는 차량 키 관..
컨트롤러에 로직이 묻히고, 로그 한 줄 남기기 위해 수십 줄의 코드가 반복되던 레거시 로깅 시스템. 결국 주말을 반납하고 고군분투 끝에 AOP 기반으로 리팩토링했다.이번 포스트에서는 이 리팩토링 과정을 정리 해보려고 한다. ✨ 리팩토링 배경1. 기존 Logging 기능기존 레거시 로그코드는 아래와 같은 기능과 모습을 가지고 있었다.6하원칙 기반 로그 메시지: 누가, 언제, 어디서, 무엇을 했는지를 기반으로 성공/실패 여부와 메시지를 남긴다.다국어 지원: 한국어 및 영어 메시지를 국제화 키로 관리WebFlux 대응: 비동기 환경에서도 동작 가능2. 문제점문제 항목상세 설명⚠️ 관심사 혼재컨트롤러에 비즈니스 로직과 로깅 로직이 섞여 있어 가독성 저하(가장 문제가 되는 부분이었다.)⚠️ 반복 코드API마다 유..
이번 포스트에서는 Java에서 JSON을 다루는 방법에 대해 정리해보고자 합니다. 간단하게 유틸화시켜 사용해보니 꽤나 편리합니다. Object to JsonString POJO를 JsonString으로 변환하는 방법입니다. 다양한 방법이 있지만 만약 아래처럼 field명과 jsonProperty가 달라야 한다면 ObjectMapper를 사용하는 것이 편리합니다. 따라서 저는 ObjectMapper를 사용하는 방법을 중심으로 설명하도록 하겠습니다. public class SampleClass{ @JsonProperty("Test Custom Field") private String testCustomField; } import com.fasterxml.jackson.databind.ObjectMapper;..
사내에서 Springboot를 사용하면서 Reactive Redis를 쓰고 있습니다. 이번 포스트에서는 config는 어떻게 설정하는지, 테스트 코드 작성방법, Generic하게 클래스에 맵핑해서 꺼낼 수 있는방법에 대해 정리해보고자 합니다. Dependency springboot 3.2.2, java17을 사용하고 있으며, dependency는 아래와 같습니다. dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-redis-reactive' implementation 'org.springframework.boot:spring-boot-starter-webflux' compileOnly 'org.projectlo..
사내에서 Excel Export/Import 기능을 구현 하던 중, try-with-resources를 남용하다 아래와 같은 에러를 만났다. "Cannot write data, document seems to have been closed already" try-with-resources이 무엇인지, webflux환경에서 reactive하게 개발할 때 주의할 점에 대해 알아보도록 하자. try-with-resources? 1. java7 이전의 try-catch-finally java7 이전에는 Closable인터페이스를 구현하고 있는 자원들은 사용이후에 반드시 close 메소드를 호출 해줘야 했다. 예를 들어 아래와 같은 코드처럼 말이다. //... SXSSFWorkbook workbook = new ..