[Java/Spring Boot] AWS 환경에서 DB 직접 접근이 어려운 경우: Java 애플리케이션에서 SQL 파일을 실행하여 데이터 삽입하기
·
개발 (Development)/Java
회사 프로젝트 중 AWS에 배포된 서비스 환경에서는 보안상의 이유로 데이터베이스에 직접 접근할 수 없었습니다. 운영 서버에서 PostgreSQL DB를 직접 수정하거나 삽입 쿼리를 실행하는 것이 제한되었고, SSH나 DB 툴 접속도 허용되지 않았습니다.이러한 제약을 해결하기 위해, Java 애플리케이션 내부에 SQL 파일을 포함시키고 애플리케이션 실행 시 이를 실행하도록 구성하는 방식을 선택했습니다. 과정 중 삽입 대상 데이터에 문자열로 포함된 세미콜론(;) 때문에 실행 오류가 발생하는 중요한 시행착오도 있었기에, 그 내용을 중심으로 아래와 같이 단계별로 정리합니다.1. Python으로 CSV 파일을 읽어 INSERT SQL 생성우선 삽입할 데이터는 CSV 형태로 정리되어 있었습니다. 이를 기반으로 Py..
[Java/Spring Boot] Spring Boot + MyBatis 환경에서 쿼리 조회용 API를 만들기 전에 꼭 고려해야 할 5가지
·
개발 (Development)/Java
회사 내부 시스템에서 데이터를 빠르게 조회하기 위한 목적으로 Spring Boot + MyBatis + PostgreSQL 기반 백엔드 앱에 간단한 쿼리 조회용 API를 추가하고자 했습니다.하지만 단순히 API를 만드는 것만으로 끝나지 않고, 실무에서는 몇 가지 중요한 점들을 반드시 고려해야 한다는 사실을 알게 되었습니다. 이 글에서는 조회용 API를 만들기 전 꼭 고민해야 할 사항들을 정리해봅니다.1. 보안 이슈가장 주의해야 할 부분입니다.조회 전용이라고 해도 다음과 같은 보안 취약점에 노출될 수 있습니다.SQL 인젝션 위험: 입력받은 쿼리를 그대로 실행하면 악의적인 요청이 DB를 손상시킬 수 있습니다.인증/인가 없이 데이터 노출: 내부용이라도 인증 없이 공개되면 사용자 정보, 로그 등 민감한 데이터가..
[PostgreSQL] 실전 활용 - 문자열 포함, 쉼표 구분 배열 매칭, JSON 배열 필터링
·
개발 (Development)/PostgreSQL
업무 중 PostgreSQL을 다루면서 특정 컬럼의 값이 다른 컬럼에 포함되는 경우를 추출하거나, 쉼표(,)로 구분된 문자열 배열에서 완전 일치 여부를 확인하거나, JSON 배열 안에서 특정 값을 필터링해야 할 일이 있었다. 각각 다른 상황이지만, 공통적으로 SQL을 조금만 다듬으면 깔끔하게 해결할 수 있었다. 정리해보면 다음과 같다.1. 문자열 포함 여부 비교 (col_a 값이 col_b 안에 포함되는 경우)예를 들어 col_a 컬럼은 'abc', col_b 컬럼은 'abcdf'처럼 저장되어 있을 때, col_a 컬럼 값이 col_b 컬럼 안에 포함되는지 비교하고 싶었다.PostgreSQL에서는 POSITION() 함수나 STRPOS() 함수를 이용하면 쉽게 해결할 수 있었다.SELECT *FROM e..
[PostgreSQL] PostgreSQL JSON 쿼리 성능 개선과 Java에서의 활용
·
개발 (Development)/PostgreSQL
대용량 JSON 데이터를 PostgreSQL에서 조회하면서 분석 지표를 만들던 중, 생각보다 쿼리 속도가 느리고 결과가 기대와 다르게 나오는 문제가 있었습니다. 특히 JSON 필드 안의 특정 값들을 기준으로 통계 데이터를 구하고, 그 결과를 Java + MyBatis 환경에서 리스트 형태로 받아야 했기 때문에, 정렬이나 형식까지 모두 신경 써야 했습니다.문제 상황초기에 작성한 쿼리는 다음과 같은 형태였습니다:WITH filtered_data AS ( SELECT t."timestamp", (t."json_field" ->> 'target_metric')::double precision AS value FROM "data_table" t WHERE ..
[PostgreSQL/TimescaleDB] TimescaleDB 사용 중 hypertable 및 chunk 포함 전체 백업과 복원하기
·
개발 (Development)/PostgreSQL
TimescaleDB 사용 중 hypertable 및 chunk 포함 전체 백업과 복원하기PostgreSQL에서 TimescaleDB 확장을 사용할 때, 일반적인 pg_dump 명령어를 사용해서 전체 데이터를 백업할 수 있습니다. 하지만 hypertable과 chunk가 일반 테이블과는 다르게 동작하기 때문에, 복원 시 문제가 생길 수 있습니다. 특히 restore 시에 chunk를 찾지 못한다는 오류가 발생하면 당황스럽죠. 이 글에서는 hypertable과 chunk를 포함한 전체 백업 및 복원 방법과 그 과정에서 자주 발생하는 문제점 및 해결법을 정리해봤습니다.pg_dump를 이용한 전체 백업TimescaleDB는 PostgreSQL의 확장이므로 pg_dump 명령만으로 hypertable, chun..