전체 글
-
JVM 클래스로더 알아보기Java 2025. 1. 11. 02:34
JVM 클래스로더를 알아보자.Goal클래스로더의 역할 및 개요에 대한 학습클래스로더가 클래스를 로딩하는 과정 알아보기클래스로더JVM이 클래스 로딩을 하는 과정은 크게 로딩 - 링크 - 초기화 단계로 이루어진다.클래스 로더는 로딩 과정에서 클래스파일을 JVM 내부로 읽어들이는 역할을 한다. 클래스 로더의 종류는 크게 다음과 같다.부트스트랩 클래스로더(Bootstrap ClassLoader)확장 클래스로더(Extension ClassLoader)애플리케이션 클래스로더 또는 시스템 클래스 로더(System ClassLoader)클래스 로더의 특징은 다음과 같다.유일성같은 클래스라도 클래스로더 마다 로드한 결과는 다르다.하나의 클래스를 두개의 서로 다른 클래스로더로 로딩을 하면 결과 값은 동일한 결과가 아니게 ..
-
JVM 클래스 로딩 과정 알아보기Java 2025. 1. 9. 03:50
JVM 클래스 로딩 과정은 어떤 식으로 진행되는 지 살펴보자GoalJVM 의 클래스 로딩 과정을 알아보며 동작 원리를 이해하기얕게 알고 있던 동작 과정을 정확히 설명할 수 있는 수준으로 이해하기클래스 로딩 과정로딩클래스로더가 클래스의 이름으로 바이트 코드를 찾고 해당 바이트 코드의 내용을 읽어 바이트 스트림으로 가져온다.다양한 위치에서 바이트 코드를 읽어올 수 있다. (jar, 네트워크, 동적 생성 등)바이트 코드를 JVM 메모리의 Method 영역에 런타임 데이터 구조로 변환하여 저장한다.Method 영역에 저장을 한 뒤java.lang.Class 객체를 생성하여 힙 메모리에 저장한다.힙 메모리에 저장된 이 Class 타입을 통해 리플렉션을 사용할 수 있다.링크링크는 검증(Verify), 준비(Prep..
-
JVM 바이트코드 알아보기Java 2025. 1. 4. 02:35
바이트코드자바는 익히 알려진대로 자바 가상 머신(JVM) 위에서 실행되는 프로그래밍 언어이다.동작 구조는 다음과 같다. 1. 자바 소스 코드를 작성2. 컴파일하여 바이트 코드로 변환3. 바이트 코드를 JVM에 로딩4. 로드된 바이트 코드를 인터프리터 혹은 JIT 컴파일러를 통해 실행 개발자가 작성하는 자바 코드는 컴파일된 .class 파일, 바이트코드가 되어 JVM에게 전달된다.JVM이 이해하는 바이트코드는 어떤 구조로 되어있는 지 살펴보며, 간략한 동작 과정들을 이해해보았다. 바이트코드는 특정한 구조를 가진 이진 스트림 형태로 자바 가상 머신 명세에 ClassFile 이라는 구조로 정의되어 있다.ClassFile.java 파일을 자바 컴파일러로 컴파일한 .class 파일의 구조JVM(자바 가상 머신)이..
-
MySQL Binlog CDC 구현(2) - Binlog 변환개발 2024. 12. 26. 06:14
지난 포스팅에 이어 Binlog 를 파싱하여 이벤트를 발행하는 과정입니다. Binlog는 크게 다음과 같은 정보를 가지고 있습니다.- 어떠한 EventType의 Binlog 인지- 몇번째 컬럼의 데이터인지를 나타내는 Bitset- 데이터 정보 등등 컬럼명에 대한 정보가 없으니 원본 데이터로 파싱하기란 불가능합니다.따라서 MySQL의 Metadata를 통해 컬럼의 인덱스와 컬럼명을 알고 있어야 적절히 컬럼명과 데이터를 매핑할 수 있습니다.초기화 @PostConstruct public void init() throws SQLException { try (Connection connection = jdbcTemplate.getDataSource().getConnection()) { Resul..
-
MySQL Binlog CDC 구현(1) - Binlog 읽기개발 2024. 12. 5. 04:28
Binlog란?Binlog는 Binary Log라고도 불리며, 데이터베이스에서 발생하는 변경 사항(예: 테이블 생성, 데이터 변경 등)을 기록한 이벤트(Event)를 포함하는 로그 파일입니다.아래는 MySQL 공식 문서에서 발췌한 설명입니다:The binary log contains “events” that describe database changes such as table creation operations or changes to table data.(출처: MySQL 8.4 Reference Manual)이처럼, Binlog는 데이터베이스의 변경 작업을 이벤트로 기록하며, 데이터 복구와 복제(Replication)와 같은 중요한 작업에서 핵심적인 역할을 합니다.Binlog를 활용한 CDC 구현저..
-
AOP를 활용하여 로깅 기능 개발개발 2024. 11. 13. 00:03
개발을 진행하다 보면 디버깅을 통해 에러를 찾고 해결하는 일이 많습니다. 하지만 운영 환경, 즉 배포된 서버에서는 개발 환경처럼 쉽게 디버깅하기 어렵습니다. 이때 중요한 것이 로그입니다. 로그는 문제의 원인을 빠르게 파악하고 해결하는 데 도움이 됩니다.현재 프로젝트에서는 커스텀 에러를 발생시키고, ControllerAdvice에서 이를 일괄적으로 처리하고 있습니다. 그러나 요청별로 어떤 정보를 담고 있는지까지 파악하기 위해서는 추가적인 정보가 필요합니다. 특히 다음 정보들을 로그에 포함하면 에러 처리 뿐만 아니라 사용자의 요청을 분석하여 캐시할 데이터를 선정하는 데 도움이 될 수 있다고 판단하여 로그에 남기기로 했습니다.HTTP 요청 정보사용자 정보위 정보들은 모든 요청에 대해 적용되어야 하며, 이를 A..
-
findAll vs Stream vs Batch처리 비교개발 2024. 11. 7. 17:41
프로젝트에서 특정 경로에 대한 이벤트 발생 시 해당 경로를 일정 시간 내에 지나갔거나 근처에 있었던 모든 유저들에게 알림을 발송해야 합니다. 만약 알림을 보내야 하는 회원이 적다면 findAll()을 통해 전체 회원을 조회하여 처리해도 문제가 없겠지만, 서비스가 확장되어 알림 대상 회원 수가 급증할 경우에는 성능 및 메모리 사용 문제가 발생할 수 있습니다. 이에 따라, 데이터 양이 증가할 때 발생할 수 있는 문제를 분석하고, 여러 방식으로 성능 테스트를 진행해 보았습니다.이번 테스트는 초기 1만 건의 데이터를 기준으로 시작하여, 힙 사이즈 512MB를 초과할 때까지 데이터 수를 2배씩 증가시키며 진행했습니다. 테스트 방식은 다음과 같습니다.전체 회원 조회 후 한 건씩 알림 발송:전체 데이터를 메모리에 한..
-
JPA N+1 감지 기능 구현기개발 2024. 10. 30. 23:14
N + 1 문제는 JPA를 사용할 때 자주 겪는 성능 문제로, 연관된 엔티티들을 반복적으로 조회하면서 추가적인 쿼리가 발생하는 현상입니다. 이러한 N + 1 문제는 쿼리 수 증가와 메모리 점유율을 높여 성능 저하를 유발할 수 있습니다. 프로젝트를 진행하며 N + 1 개념을 모르고, 해결법을 몰라서가 아닌 개발자의 실수로 N + 1 문제가 발생하는 상황을 종종 볼 수 있었습니다. 개발 환경에서 발생되는 쿼리를 보고도 충분히 문제를 방지할 수 있지만 N + 1 문제가 발생하면 로깅을 통해 문제상황을 감지, 개발생산성을 높이고자 하여 기능 개발을 하게 되었습니다.접근 방식우선, 로깅을 남기기 위해 N+1 문제의 명확한 정의가 필요했습니다. 다음과 같이 정의를 내렸습니다.즉시 로딩(FetchType.EAGER..