[PostgreSQL/Java] shared memory 에러 해결: Java + MyBatis 대용량 쿼리 처리
·
개발 (Development)/PostgreSQL
최근 프로젝트에서 PostgreSQL 기반의 대용량 데이터를 한 번에 집계하려다가 shared memory segment 에러를 자주 겪었습니다. 처음 한 달 정도는 잘 동작했지만, 기간을 늘려 6개월·1년 단위로 조회하는 순간 DB 메모리 관련 에러가 발생했습니다. 운영 환경에서 서버 파라미터를 크게 건드리기도 부담스러워서, 결국 쿼리를 기간 단위로 쪼개어 조회하고 자바에서 합산하는 방식으로 우회했습니다.아래는 제가 직접 적용했던 과정과 방법들입니다.1. 문제 원인장기간 데이터를 한 번에 조회 → 정렬/집계 단계에서 메모리 과부하PostgreSQL은 공유 메모리 한도를 넘으면 바로 오류 발생DB 설정(work_mem, shared_buffers)을 조정하면 해결 가능하긴 하지만, 운영 중인 환경에서는 ..
[Docker/Java] Java 기반 Docker 이미지에서 SQLite 관련 취약점 제거 방법 (CVE-2025-6965)
·
개발 (Development)/Docker
문제 상황adoptopenjdk/openjdk11:jre 이미지를 기반으로 자바 애플리케이션 Docker 이미지를 빌드하던 중, 보안 스캐너에서 CRITICAL 등급의 SQLite 관련 취약점(CVE)이 지속적으로 발견되었습니다.보안 점검 도구(Trivy 등)로 스캔한 결과, libsqlite3-0 라이브러리에서 발생하는 취약점이 주기적으로 보고되었고, 빌드 파이프라인이 이를 이유로 차단되는 상황이었습니다.원인 분석adoptopenjdk/openjdk11:jre는 Debian/Ubuntu 계열 기반으로 제작되어 있으며, 기본적으로 sqlite3와 libsqlite3-0 패키지를 포함하고 있습니다.문제는 다음과 같습니다.해당 이미지는 최신 보안 패치 적용 주기가 느립니다.저희 애플리케이션에서는 SQLite..
[PostgreSQL/TimescaleDB] 데이터 적재 시 발생하는 statement_timeout 및 row is too big 오류 해결 방법
·
개발 (Development)/PostgreSQL
최근 TimescaleDB에 실시간 센서 데이터를 적재하는 과정에서 몇 가지 오류를 경험하였습니다. 로그를 분석하고 해결 방법을 찾아가는 과정을 정리해봅니다.1. 문제 상황Kafka에서 수집한 수천 개의 센서 데이터를 TimescaleDB에 적재하는 컨테이너 로그에서 다음과 같은 오류가 반복적으로 발생했습니다.1.1 statement_timeout 오류ERROR: canceling statement due to statement timeout이는 PostgreSQL의 statement_timeout 값(쿼리 실행 최대 시간)을 초과하면 발생하는 에러입니다. 대량 데이터를 한 번에 Insert하거나, 인덱스 부재, 네트워크 지연, 병렬 쓰기 병목 등으로 실행 시간이 길어질 경우 나타납니다.1.2 row i..
[Python] MAU(Monthly Active Users) 계산 방법
·
개발 (Development)/Python
이번 글에서는 텍스트 파일 형태의 사용자 접속 로그를 활용하여 MAU(Monthly Active Users) 를 계산하는 방법을 소개합니다.MAU는 한 달 동안 한 번이라도 활동한 고유 사용자 수를 의미하며, 서비스 이용 현황을 파악하는 데 중요한 지표입니다.1. 데이터 확인저는 다음과 같이 user, ip, event_time 세 컬럼을 가진 로그 파일을 준비했습니다.IP는 보안상 위험이 있을 수 있으므로, 아래 예시에서는 임의의 비공개 대역 IP(192.168.x.x)로 대체하였습니다.useripevent_timeadmin192.168.0.102023-11-08 01:02:17.883guest192.168.0.102023-11-08 01:04:47.914admin192.168.0.112023-11-0..
[Java] JPA에서 DTO는 Interface로 구현할까? Class로 구현할까?
·
개발 (Development)/Java
JPA를 사용할 때 DTO(Data Transfer Object)를 어떻게 정의할지 고민이 되는 경우가 많습니다. 특히 interface 기반 DTO와 class 기반 DTO 중 어떤 방식을 선택해야 할지 혼란스러울 수 있는데요, 이번 글에서는 두 방식의 차이점과 사용 목적에 따라 어떤 방식을 선택하면 좋을지 정리해보았습니다.Interface 기반 DTO예시public interface UserDto { String getName(); int getAge();}@Query("SELECT u.name as name, u.age as age FROM User u")List findUsers();장점코드가 간단하며, getter만 정의하면 JPA가 구현체를 자동으로 생성합니다.읽기 전용 DTO에 적..