본문 바로가기

전체 글

(215)
EntityManager와 @PersistenceContext (24.05.23) EntityManager는 Bean으로 관리되는 싱글톤 객체이지만, 이것 자체를 사용할 수는 없다. 그 이유는 생성자 주입으로 이것을 사용한다고 해도, 여러 클래스에서 공유항 사용한다면 트랜잭션 간 내부 데이터가 꼬일 가능성이 높기 때문이다. (데이터 중복 및 무결성에 문제)@PersistenceContext를 사용한다면 이 EntityManager의 Bean 객체의 '프록시'를 만들게 된다. 각각의 트랜잭션마다 이 프록시 객체를 할당함으로써, 여러 트랜잭션이 동시에 실행되더라도 EntityManager 내부에서 관리되는 데이터의 무결성을 보장할 수 있게 된다. 각각의 트랜잭션이 독립적인 EM 프록시를 할당받기 때문이다.정리EntityManager는 Bean으로 관리되는 싱글톤 객체이지만, 이것 자체를 ..
gradle heap 초과 시 해결 방법 (Expiring Daemon because JVM heap space is exhausted) (24.05.21) Spring 프로젝트를 빌드할 때 Gradle이 메모리 부족으로 인해 실패하는 경우, JVM 힙 메모리를 늘려 문제를 해결할 수 있다.  Starting Gradle Daemon...Gradle Daemon started in 5 s 435 ms> Task :compileJavaExpiring Daemon because JVM heap space is exhaustedDaemon will be stopped at the end of the build after running out of JVM memoryExpiring Daemon because JVM heap space is exhaustedExpiring Daemon because JVM heap space is exhaustedExpiring Da..
부하 증가에 따른 로드 밸런싱 정책 고려 (Envoy) (24.06.20) 개요현재 자체적으로 개발한 Collector 서버에서 수집하는 데이터가 많아질 때면, OOM이 발생하고는 한다. (특히 수집하는 타겟 서버에서 갑자기 많은 부하가 일어날 경우, 급작스러운 데이터 증가로 인해 발생하는 일이다.)Major GC를 막을 수는 없지만(자연스러운 현상이니), 문제는 ‘갑작스럽게 허용 수치 이상의 많은 데이터가 들어올 경우 서버가 멈춰버리는 빈도가 꽤 커진다는 것. 이를 위해 Memory Leak 등을 측정하고자 MAT로 힙 덤프를 떠서 분석했었지만, 근본적으로 막을 수 없는 JPA 관련 인스턴스나 캐시 등은 어쩔 수가 없다 (Query Cashe Plan이나.. 기본적으로 매핑에 사용되는 준비된 persistEntity 등.. ). 서버의 멈춤 현상을 막기 위해 할 수 있는 건 ..
Eclipse MAT 전체 Heap 사용량 보기 / 메모리 분석 (24.06.18) 현재 온보딩중인 서버의 Memory Leak을 보기 위해 heap dump를 뜬 뒤, 분석한 overview 값과 실제 APM 및 프로세스 상의 JVM Heap Used가 일치하지 않는다. MAT의 Heap Overview 294.1MB 하지만 Pinpoint 및 외부 APM의 경우 한결같이 600-700MB의 Heap 사용을 이야기하고 있다.이렇게 차이가 날 이유가 없는데.. 실제로 검색을 조금 해본 결과, 다음과 같은 설정을 해주지 않아서 벌어진 문제였다.문제 원인 및 해결 방법1. Eclipse MAT 설정 변경MAT에서 기본적으로 도달할 수 없는 객체는 분석에 포함되지 않는다. 이를 포함하려면 설정을 변경해야 한다.MAT 실행:Eclipse Memory Analyzer (MAT)를 실행한다.Pre..
[트랜잭션, EM]네이티브 쿼리 임시 테이블 미적용 문제 (24.06.17) 최근 프로젝트에서 JPA를 사용하여 네이티브 쿼리를 실행하는 도중 임시 테이블에 데이터가 삽입되지 않는 문제를 겪었다. 원인을 트러블슈팅한 결과를 여기에 정리한다.문제 상황JPA 네이티브 쿼리를 사용하여 임시 테이블에 데이터를 삽입하고 이를 기반으로 조회하는 로직을 구현했다.하지만, 데이터가 임시 테이블에 삽입되지 않는 문제가 발생했다. 로그를 확인한 결과, 데이터가 삽입되는 과정에서는 문제가 없었지만 조회할 때는 데이터가 없는 것으로 나타났다.@Service@RequiredArgsConstructorpublic class SpansServiceImpl implements SpansService { private final ResourceService resourceServiceImpl; pr..
(in 연산 → join) 및 커스텀 NativeQuery (24.06.14) 현재현재 사용하고 있는 IN 연산 최적화에 대한 접근 방식은 다음과 같다시간 단위로 파티셔닝을 통해 필요한 데이터의 범위를 줄인 후,(where created_at between (a, b) .. create_at을 기준으로 파티셔닝)IN 연산을 사용하여 특정 조건의 값들을 필터링하고 있음.이 과정에서 IN SET의 경우 SET을 사용하며, 최대 배치 사이즈 = 5000으로 실시한 뒤 스플릿하여 IO를 여러 번 보내고 있음.//조회 로직 중 일부 public List getSpansUseTraceIdSet(List inputTraceIdSet, Long minTime, Long maxTime ) { try { Timestamp createdAtMin = new Timest..
PostgreSQL partioning table (24.06.11) PostgreSQL Partitioning Table1. 개념 정의Partitioning Table: 대량의 데이터를 효율적으로 관리하고 조회 성능을 향상시키기 위해 테이블을 작은 단위(파티션)로 나누는 기술이다. 각 파티션은 독립된 테이블처럼 동작하며, 전체 테이블은 이러한 파티션의 집합으로 관리된다.2. 파티셔닝의 종류Range Partitioning: 특정 열의 값 범위에 따라 데이터를 나눈다.예시: 날짜 열을 기준으로 월별로 데이터를 분할.CREATE TABLE measurement ( city_id int, logdate date, peaktemp int, unitsales int) PARTITION BY RANGE (lo..
JSONB 타입 다뤄보기 - 1 (24.05.22) PostgreSQL의 경우 다른 RDB와 달리, 특별한 타입의 데이터를 저장할 수 있다.Attribute로 bigint가 아니고 bigint[]의 배열 형태나, JSONB 등의 조금 더 자유로운 데이터 타입으로 저장할 수 있다는 점이다.이것은 실제 DB에서 JDBC를 통해 넘어오는 데이터 중 일부이다.[ { "id": 592492460020000000, "scope_name": "io.opentelemetry.spring-scheduling-3.1", "scope_version": "2.1.0-alpha", "trace_id": "E'\\\\\\\\x32058E6FA0A913CCA9D567F003A0AD2A'", "span_id": "E'\\\\\\\\x82A02E838327..