[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..
[Java] Interface란? 클래스와 다른 점은?
·
개발 (Development)/Java
Java를 공부하다 보면 interface라는 개념이 등장합니다. 처음에는 추상 클래스와 비슷하게 느껴질 수 있지만, 인터페이스는 Java에서 매우 중요한 설계 도구입니다. 이번 글에서는 interface의 정의부터 사용 예시, 특징까지 정리해 보겠습니다.1. 인터페이스란 무엇인가요?Java에서 interface는 클래스가 구현해야 할 메서드의 목록을 명세한 일종의 규격서입니다. 실제 동작(구현)은 포함하지 않고, 메서드 이름과 매개변수 등 구조만 정의합니다. 클래스가 이 인터페이스를 implements로 구현하면, 반드시 해당 메서드들을 정의해야 합니다.public interface Animal { void sound();}Animal 인터페이스를 구현하는 클래스는 sound() 메서드를 반드시 ..
[Java] MyBatis와 JPA 속도 비교: 어떤 상황에 어떤 선택이 더 나을까?
·
개발 (Development)/Java
Java 백엔드 개발에서 가장 많이 사용되는 ORM 프레임워크인 JPA와, SQL 매핑 프레임워크인 MyBatis는 각기 다른 장점을 지니고 있습니다. 저 역시 프로젝트를 진행하면서 "어떤 상황에 어떤 것이 더 빠를까?"라는 질문을 갖고 두 프레임워크를 비교해 보게 되었습니다.이번 글에서는 MyBatis와 JPA의 속도와 성능 측면에서의 차이를 중심으로, 실제 사용 시 고려할 점들을 정리해보았습니다.1. MyBatis와 JPA는 어떤 프레임워크인가요?MyBatis는 SQL을 직접 작성하여 사용하는 SQL 매퍼 프레임워크입니다. 개발자가 SQL을 전적으로 통제할 수 있어 성능 최적화에 유리합니다.JPA는 객체지향 프로그래밍과 데이터베이스를 매핑하는 ORM 프레임워크입니다. SQL 작성을 최소화하고 생산성을..
[Java] PostgreSQL의 timestamptz를 Java MyBatis에서 Instant로 받는 방법
·
개발 (Development)/Java
PostgreSQL에서 timestamptz는 시간대(time zone) 정보를 포함한 타임스탬프를 의미합니다. 이를 Java에서 MyBatis를 통해 받아올 때, 어떤 자료형을 사용해야 할지 고민이 생길 수 있습니다.이번 글에서는 Instant로 매핑하는 방법을 중심으로 정리하였습니다.1. timestamptz란?timestamp with time zone의 약자로, UTC 기준으로 저장되며 클라이언트의 타임존에 맞춰 자동으로 변환되는 타입입니다.예를 들어 다음과 같이 저장된 값이 있다면:2025-07-28 15:00:00+00한국 시간대(KST)에서는 2025-07-28 24:00:00으로 변환되어 표시됩니다.2. Java에서 매핑 가능한 자료형PostgreSQL의 timestamptz는 Java에서..