[Java] Spring Boot 프로젝트에서 MyBatis와 JPA를 함께 사용하는 방법과 오류 해결 과정
·
개발 (Development)/Java
Spring Boot 2.5.5, Java 11, Maven, MyBatis 기반의 프로젝트에 JPA를 추가하면서 겪은 설정 및 오류 해결 과정을 정리합니다.MyBatis와 JPA를 병행하고자 할 때 주의해야 할 설정 방식과 실제 발생했던 오류의 원인을 함께 소개합니다.프로젝트 환경Spring Boot: 2.5.5Java: 11빌드 도구: MavenORM 프레임워크: MyBatis (기존), JPA (추가)데이터베이스: PostgreSQL1. JPA 기본 설정 방법1-1. Maven 의존성 추가 org.springframework.boot spring-boot-starter-data-jpa org.postgresql postgresql runtime1-2. application.yml 설정 예시..
[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에서..
[PostgreSQL] 문자열을 timestamp with time zone으로 변환하는 방법
·
개발 (Development)/PostgreSQL
PostgreSQL을 사용할 때 문자열을 timestamp로 변환해야 하는 경우가 자주 있습니다. 이때 단순히 ::timestamp로 캐스팅하면 될 것 같지만, 시간대(time zone) 를 고려해야 할 상황에서는 주의가 필요합니다. 이번 글에서는 문자열을 timestamp with time zone으로 정확하게 변환하는 방법을 정리해보았습니다.문제 상황: 단순한 캐스팅의 한계예를 들어 다음과 같이 문자열을 ::timestamp로 캐스팅하면,SELECT '2025-07-21 15:00:00'::timestamp;이 결과는 timestamp without time zone 타입으로 변환됩니다. 즉, 시간대 정보가 없는 순수한 날짜 및 시간 값만 저장됩니다. PostgreSQL에서는 timestamp와 ti..
[PostgreSQL] MyBatis foreach + UNION ALL 쿼리의 성능 문제와 PostgreSQL 최적화
·
개발 (Development)/PostgreSQL
최근 프로젝트에서 MyBatis를 사용하여 여러 자산(asset) 정보를 기준으로 태그(tag) 데이터를 조회하는 기능을 구현하던 중, 성능 저하 문제가 발생했습니다. 문제의 원인을 추적해보니 foreach 루프 안에서 UNION ALL로 다수의 SELECT 구문을 반복 생성하는 방식이 주요 원인이었습니다. 본 글에서는 해당 구조의 문제점과 PostgreSQL에 적합한 최적화 방법을 실제 경험을 바탕으로 정리하였습니다.문제 상황: MyBatis foreach + UNION ALL 사용처음 작성한 쿼리는 아래와 같은 형태였습니다. SELECT item_code, tag_code, tag_name, #{item.assetId} AS asset_physical_na..
[PostgreSQL] PostgreSQL에서 threshold 값 이력 관리 및 최신값 조회 테이블 설계하기
·
개발 (Development)/PostgreSQL
요구사항 정리PostgreSQL을 사용하여 특정 설정값(threshold 등)을 관리해야 하는 상황이 있었습니다. 요구사항은 다음과 같았습니다.설정값을 데이터베이스에 저장하고, 나중에 읽어올 수 있어야 함설정값이 변경될 때마다 이력을 남기고, 기존 값을 덮어쓰지 않아야 함항상 가장 최신의 설정값을 쉽게 조회할 수 있어야 함나중에 다른 설정값이 추가될 수도 있으므로, 확장성 있게 설계하고자 함이러한 조건을 만족시키기 위해 다음과 같은 방식으로 스키마를 설계하였습니다.테이블 설계 방향설정값의 이름과 값을 key-value 형태로 저장하는 방식으로 테이블을 구성하였고, 이력 관리를 위해 created_at 컬럼을 추가하였습니다.테이블 구조 예시CREATE TABLE config_history ( id S..