전체 글

가치있는 글 쓰기!
백엔드 개발을 하다 보면 데이터가 시스템 내부를 넘어 외부(네트워크, 디스크)로 이동하는 상황을 끊임없이 마주합니다. 이때 필수적으로 일어나는 과정이 바로 직렬화(Serialization)입니다.Spring 프레임워크가 많은 부분을 추상화해주기 때문에 무심코 지나치기 쉽지만, 성능 최적화와 트러블슈팅을 위해서는 이 직렬화의 동작 원리를 정확히 이해해야 합니다. 오늘은 직렬화의 개념부터 포맷별 특징, 그리고 Spring에서의 동작 방식까지 깊이 있게 정리해 보겠습니다.1. 직렬화(Serialization)란 무엇인가?메모리 상에 존재하는 객체나 데이터 구조는 불연속적인 주소에 흩어져 있습니다. 이를 네트워크로 전송하거나 파일/DB에 저장하기 위해서는 일련의 바이트 스트림(Byte Stream) 형태로 변환..
· 📗Java
삼색 마킹 알고리즘실행할 때 노드의 상태를 삼색으로 표시하며 GC를 하는 알고리즘흰색 (White): 초기 상태로, 아직 방문하지 않은 객체 GC 마킹 시작 시 모든 객체는 흰색, 최종적으로 흰색인 객체들은 도달 불가능한 객체로 판단되어 GC 대상회색 (Gray): 탐색 중인 객체회색 객체는 자기 자신은 살아있지만, 자신이 참조하는 자식 객체들은 아직 방문하지 않았다는 의미GC는 회색 객체의 자식 객체들을 탐색하며, 탐색이 완료되면 이 객체를 검은색으로 변경검은색 (Black): 탐색이 완료된 객체검은색 객체는 자신과 자신이 참조하는 모든 객체가 살아있는 객체라는 것이 확인된 상태GC는 더 이상 검은색 객체를 탐색하지 않습니다.GC가 진행되는 동안 새로운 객체가 할당된다면?예를 들면 탐색 완료되어 검정으..
· 📗Java
자바 객체 표현: OOP와 Klass자바에는 기본 타입(Primitive Type)과 객체 참조 타입(Reference Type) 두 가지 종류의 값만 존재합니다. 특히 객체 참조 타입은 내부적으로 Ordinary Object Pointer(OOP)라는 구조체를 통해 관리됩니다.1. OOP와 객체 헤더자바에서 new로 객체를 생성하면 JVM 힙에 객체가 할당됩니다. 이 객체는 크게 객체 헤더와 인스턴스 데이터로 나뉩니다.객체 헤더: 모든 객체에 공통으로 존재하는 메타데이터 영역입니다. 주로 두 개의 '머신 워드'로 구성됩니다.Mark Word: 객체의 런타임 상태를 추적합니다. 해시 코드, 가비지 컬렉션(GC) 정보, 동기화 락 정보 등이 여기에 저장됩니다.Klass Pointer: 이 객체가 어떤 클래..
· 📗Java
JVM 핵심 정리: 자바 성능 최적화의 첫걸음자바 애플리케이션의 성능은 JVM(Java Virtual Machine) 에 대한 깊은 이해로부터 시작됩니다. 이번 글에서는 JVM의 기본 구조부터 클래스 로딩, 컴파일러, 그리고 최적화 기법까지 핵심 내용을 정리해봅니다.1. JVM 기본 구조: 스택 기반 머신과 클래스 로더JVM은 스택 기반 머신으로, 모든 연산은 스택의 최상단 값을 기준으로 이루어집니다. JVM의 가장 중요한 역할 중 하나는 클래스를 메모리로 불러오는 클래스 로더입니다. 자바 9 이후 JDK는 다음과 같은 계층 구조의 클래스 로더를 제공합니다.부트스트랩 클래스 로더 (Bootstrap Class Loader): JVM 내부에 내장된 네이티브 로더입니다. java.base와 같은 핵심 모듈의..
· 📗Java
자바 최적화 들어가며자바 최적화에 대한 글을 검색하다 보면, 과거 JVM 환경을 기준으로 한 이야기들이 아직도 상위에 랭크되어 있는 경우가 많습니다.예를 들어, "메서드 디스패치 성능을 위해 작은 메서드를 만들지 말고, 큰 메서드 하나로 작성하라" 라는 조언이 있습니다.하지만 현재의 JVM에서는 이런 최적화는 큰 의미가 없습니다. 이유는 JIT(Just-In-Time) 컴파일러의 발전 덕분에 메서드 디스패치 오버헤드가 더 이상 병목이 아니기 때문입니다. 메서드 디스패치란?메서드 디스패치(Method Dispatch)는 "메서드를 호출할 때 어떤 구현을 실행할지 결정하는 과정"을 의미합니다.- 오버로딩(Overloading) → 컴파일 시점에 호출 메서드가 결정 (정적 디스패치)- 오버라이딩(Overrid..
· 📗Java
static class 와 static method 차이`static class` 는 inner class 에서 사용되는 개념으로 Outer class 를 인스턴스화 없이 사용하는 클래스를 (inner) static class 라고 합니다. 그리고 `static method` 또한 속한 클래스의 인스턴스화 없이 사용되는 메소드를 의미합니다.예시를 보면 이해가 더 쉽습니다.class Outer { class NonStaticInner { } static class StaticInner { } public static void print() { }}Outer.NonStaticInner = new Outer.NonStaticInner(); // 컴파일 에러Outer.StaticInner in..
· ☘️Spring
이전 글까지는 SpringBoot 가 부팅될 때 일어나는 톰캣 설정과 초기화를 알아보았습니다. 해당 글에서는 톰캣이 논블락킹으로 요청을 받아내고 처리하는 과정과 함께, 왜 톰캣이 NIO 여도 Spring MVC 는 블락킹 서버인지 알아보도록 하겠습니다.Tomcat의 논블로킹(NIO) 소켓 처리Tomcat은 Java NIO(Non-blocking I/O)를 사용하여 소켓을 처리함으로써 높은 성능과 효율적인 자원 관리를 실현합니다. 이번 글에서는 Tomcat이 어떻게 논블로킹 방식으로 요청을 처리하는지에 대해 코드 레벨에서 자세히 알아보겠습니다.Tomcat 의 전체적인 구조를 한번 보도록 하겠습니다. 먼저, Coyote Connector 는 요청을 받아 프로토콜 스펙 (EndPoint) 에 맞게 프로세싱 해..
· ☘️Spring
프로젝트 코드 리뷰 시간에, 한 캠퍼 분께서 Tomcat의 내부 구조를 설명해 주셨습니다. 특히, Acceptor Thread가 모든 요청을 받아 Worker Thread에 전달하고, Worker Thread에서 실제로 요청을 처리한다고 말씀하셨습니다. 당시에는 잘 몰랐지만 주말 동안 공부해보니 이는 바로 `Tomcat NIO Connector`에 대한 이야기였습니다. 이 이야기를 듣자마자 Tomcat 서버와 Spring WebFlux가 비슷하다는 느낌이 들었습니다. 그렇다면 Tomcat을 이용한 Spring Web MVC도 논블로킹이어야 할 것 같은데, 왜 우리는 여전히 one thread per request 동기 블로킹 서버로 알고 있을까요?  먼저 Tomcat 자체를 공부해보며 Servlet과 어..
InnoDB 엔진 기준으로 작성된 글 입니다. 클러스터링 인덱스 MySQL 은 물리적으로 데이터를 저장함에 있어 두 가지 특징이 있다.비슷한 PK 를 가진 데이터는 같은 페이지에 저장된다. 즉, PK 가 데이터 저장 위치를 결정한다. 예를 들면, 그림에서 emp_no 가 PK 일 때, PK 4번 5번은 페이지 번호 9에 같이 저장되어 있고, PK 11 12번은 페이지 번호 10에 저장되어 있다.페이지 안의 데이터는 정렬되어 저장되어 있다. 예를 들면, 그림에서 페이지 번호 안의 데이터는 PK 를 기준으로 오름차순 정렬되어 있다.이 때, PK 가 비슷한 데이터끼리 물리적으로 저장된다는 이유 때문에 PK 를 `클러스터링 인덱스` 라고 부른다.  인덱스에 대한 오해?여기서 짚고 넘어가야할 점이 있다. 흔히 C..
MySQL 서버MySQL 서버는 크게 `MySQL 엔진` 과 `스토리지 엔진` 으로 나뉜다. MySQL 엔진이 사람의 머리 역할을 하고 스트로지 엔진은 손발 역할을 하는데 구성 요소는 다음과 같다. MySQL 엔진클라이언트 접속 및 쿼리 요청을 처리하는 `커넥션 핸들러`, `SQL 파서 및 전처리기`, `옵티마이저` 가 해당된다.스토리지 엔진실제 데이터를 디스크 스토리지에 저장하거나 디스크 스토리지로부터 데이터를 읽어오는 부분이다. MySQL 엔진은 하나지만 스트리지 엔진은 여러 개 동시 사용 가능하다. MySQL 엔진은 `핸들러 API` 를 통해 스토리지 엔진에 읽기 쓰기 요청을 하는데, 그렇게 되면 스토리지 엔진의 `핸들러` 가 실제 액션을 실행한다.MySQL 스레딩 구조MySQL 서버는 프로세스 기..
kkyu0718
개발 로그 스토리지