NUMA와 JVM과 k8s
2025. 10. 31. 20:14
Java & Kotlin
1. NUMA란 무엇인가CPU가 빠르게 발전하던 시기, 컴퓨터는 코어를 점점 더 많이 탑재하기 시작했다. 이때 문제는 메모리였다. 모든 CPU가 동일한 메모리 버스 하나에 매달리는 구조 (UMA, Uniform Memory Access)에서는 CPU 수가 늘어날수록 메모리 접근 대역폭이 병목이 되었다. UMA는 단순하고 일관된 접근 속도를 제공하지만 확장성 면에서 구조적인 한계가 존재했다. 이 시점에서 하드웨어 엔지니어들은 “CPU마다 자기 전용 메모리를 붙여주면 어떨까”라는 발상을 하였다. 이 발상이 바로 NUMA(Non-Uniform Memory Access)의 시작이다.NUMA의 핵심 아이디어는 간단하다. CPU가 많은 시스템에서, 모든 CPU가 하나의 메모리 풀을 공유하기보다는 각 CPU(소켓)에..
[Java] Java 프로세스 메모리 - Reserved, Committed, RSS 이해하기
2025. 10. 19. 18:54
Java & Kotlin
1. 들어가며서버를 운영하다보면 힙 설정을 하였는데 k8s pod OOM kill이 나기도 하고, jcmd로 본 JVM 메모리 사용량과 top으로 본 Java 프로세스의 메모리가 차이가 나기도 한다. Java 프로세스가 사용하는 메모리는 단순히 -Xmx로 정한 힙 크기로 끝나지 않는다. JVM은 메모리를 예약(Reserved)하고, 그 중 일부를 커밋(Committed) 해서 논리적으로 확보한 뒤, 필요할 때마다 OS가 실제 물리 메모리(RAM)를 할당하는 과정을 거친다. 즉, JVM과 OS는 다른 기준으로 메모리를 바라본다. JVM은 “쓸 수 있는 공간”을 기준으로, OS는 “이미 매핑된 페이지”를 기준으로 계산하는 것이다. 이 글에서는 JVM의 메모리 관리 단계를 Reserved → Committed..
[Java/Spring] JAR의 변천사를 알아보자.
2025. 10. 13. 01:14
Spring
0. 들어가며 JAR, WAR, Fat JAR, Executable JAR 같은 용어들을 자주 접하는데 제대로 알고 있는 것 같지 않아서 이에 대해 정리해보려한다. 1. JAR가 무엇인가JAR(Java Archive)는 ZIP 포맷 기반의 압축 파일이다. JAR는 클래스 파일(.class), 리소스 파일, 메타데이터를 하나로 묶은 ZIP 압축 파일이라고 보면 된다.JAR 파일을 열어보면 내부 구조는 다음과 같이 구성되어있다.hello.jar ├── META-INF/ │ └── MANIFEST.MF └── com/ └── example/ └── Hello.class여기서 핵심은 META-INF/MANIFEST.MF 파일이다. 이 파일은 JAR의 메타데이터, 즉 “이 JAR가 어떻게..
[Java] TypeReference는 어떻게 동작하는거지?
2025. 10. 8. 22:40
Java & Kotlin
0. 들어가며ObjectMapper 관련 코드를 쓰다보면 아래와 같이 TypeReference를 사용하곤한다.ObjectMapper objectMapper = jacksonObjectMapper();objectMapper.readValue(json, new TypeReference>() {});자바의 제네릭은 컴파일 이후 타입소거가 이루어지는데 위와 같은 코드는 어떻게 동작할 수 있는거지 싶어 해당 내용에 대해 찾아본 내용을 정리한다. 1. 타입 소거 간단 요약자바는 제네릭을 도입할 때 하위 호환성을 위해 타입 소거라는 메커니즘을 도입했다. 컴파일 이후 제네릭에 bound가 있었다면 해당 타입으로, 그렇지 않다면 Object 타입으로 치환되며, 이로 인해 바이트 코드 상에서는 제네릭 정보가 사라진다. 이..
[Spring] @Transactional 어노테이션 알아보기
2025. 9. 27. 01:37
Spring
0. 들어가며개발할 때 자주 사용하는 @Transactional에 대해 막연히 알고있었던 것 같아 글로 정리해봅니다. 1. 기본 메커니즘@Transactional은 무엇을 해주나?를 간단히 살펴보면 아래과 같다.1. 스프링이 프록시를 만들어 메서드 호출을 가로채고2. PlatformTransactionalManager를 이용해 트랜잭션을 시작, 커밋, 롤백한다.3. 커넥션은 ThreadLocal을 통해 현재 스레드에 묶인다. 좀 더 자세히 알아보자1. 프록시 생성스프링 컨테이너는 @Transactional이 붙은 빈을 프록시로 감싼다.환경에 따라 JDK 동적 프록시(인터페이스 기반) 또는 CGLIB(클래스 상속 기반)을 사용한다.2. 호출 가로채기외부에서 메서드를 호출하면 프록시가 호출된다.Transac..
MALLOC_ARENA_MAX 옵션을 알기 위한 여정 정리.
2025. 4. 12. 03:52
Dev.
1. 들어가며최근 JDK 8에서 JDK 17로 업그레이드하는 과정에서 애플리케이션의 메모리 사용량이 급격히 증가하는 현상이 발생했고, 결국 Kubernetes의 Pod가 OOMKilled 상태로 종료되는 문제가 발생했습니다.처음에는 자바(Java) 애플리케이션에서 흔히 겪는 Heap 메모리 부족이나 GC 문제일 것으로 예상했습니다. 하지만 로그를 분석해 보니, 예상과는 다르게 JVM Heap이 아닌 외부에서 메모리 문제가 발생하고 있었습니다. 저에게는 다소 낯설고 새로운 유형의 문제였죠.이 문제를 분석하며 알게 된 중요한 환경 변수 중 하나가 바로 MALLOC_ARENA_MAX였습니다. 이 글에서는 제가 해당 옵션을 이해하기 위해 정리했던 배경지식과 개념들을 적어보려합니다. 2. Java 애플리케이션은 ..
[Spring] JPA OptimisticLock은 어떻게 동작하는가?
2025. 3. 9. 13:20
Spring/JPA
0. 들어가며JPA를 활용하여 애플리케이션을 개발하다 보면 동시성 문제를 해결하기 위해 낙관적 락(Optimistic Lock)을 적용하는 경우가 있습니다. @Version 애노테이션을 사용하면 간단하게 해결되는 것처럼 보이지만, 실제로 MySQL에서 어떻게 동작하는지 궁금해졌습니다. 이에 대한 궁금증을 해결하기 위해 찾아본 내용을 정리해보았습니다. 1. MySQL의 동시성 제어1.1 MySQL의 락(Lock)MySQL은 여러 트랜잭션을 효율적으로 관리하기 위해 다양한 메커니즘을 제공합니다. 대표적인 방식은 다음과 같습니다.Row Lock (레코드 락) : 특정 레코드에 대한 읽기/쓰기 작업을 제한하는 방식Table Lock (테이블 락) : 테이블 전체에 대해 읽기/쓰기 작업을 제한하는 방식MVCC ..
[Redis] Redis RedLock에 대하여.
2025. 3. 3. 23:38
Dev.
0. 들어가며분산 시스템을 운영하다 보면 여러 서버가 동시에 동일한 자원(데이터베이스, 캐시, 파일 등)에 접근해야 하는 상황이 자주 발생합니다. 이때 동시성 문제를 해결하지 않으면 데이터 불일치나 충돌이 발생할 수 있습니다. 이를 방지하기 위해 우리는 락(Lock)을 사용합니다. 분산 환경에서는 Redis를 이용한 분산락을 사용할 수 있는데요. 이때 주의할 점들이 있습니다. 예를 들어, 하나의 Redis 인스턴스를 이용해 락을 관리한다고 가정해 봅시다. 만약 이 Redis 서버가 다운되면 어떻게 될까요? 현재 락이 유지되고 있는지 확인할 수 없게 되고, 여러 개의 클라이언트가 동시에 동일한 자원에 접근하거나 모두가 접근하지 못할 위험이 생깁니다. 이 문제를 해결하기 위해 Redis 기반의 Redlock..
[Dev.] SPF, DKIM, DMARC: 이메일 보안을 위한 개념 정리
2025. 3. 2. 23:57
Dev.
0. 들어가며이메일은 기업과 개인 모두에게 핵심적인 커뮤니케이션 도구입니다. 중요한 비즈니스 거래, 개인 정보, 금융 거래 등이 이메일을 통해 주고받아지며, 이 과정에서 이메일의 무결성과 신뢰성이 보장되어야 합니다. 그러나 이메일은 오랜 시간 동안 스팸, 피싱, 도메인 위변조, 스푸핑 등 다양한 보안 위협에 노출되어 왔습니다. 예를 들어, 악의적인 공격자가 실제 도메인 소유자를 가장하여 이메일을 발송하면, 수신자는 이를 진짜 이메일로 오인하여 민감한 정보를 노출할 수 있습니다. 이러한 보안 위협을 막기 위해 이메일 인증 기술인 SPF, DKIM, DMARC가 도입되었습니다. 이 글에서는 이메일 도메인 보안의 핵심 기술인 SPF, DKIM, DMARC의 기본 개념, 동작 원리, 그리고 각각의 기술이 악의적..
[Java] JVM -XX: +AlwaysPreTouch 옵션 알아보기
2025. 3. 1. 17:44
Java & Kotlin
0. 들어가며자바 애플리케이션을 운영하면서 JVM의 다양한 옵션을 접하게 됩니다. 그 중 성능 튜닝에 유용한 옵션으로 -XX:+AlwaysPreTouch가 있습니다.이번 글에서는 JVM 메모리 구조와 운영 체제의 메모리 관리 기초를 살펴본 뒤, -XX:+AlwaysPreTouch 옵션이 무엇을 하는지, 활성화/비활성화 시의 차이는 무엇인지, 어떤 상황에서 유용한지와 성능 영향, 그리고 간단한 실험 결과까지 알아보겠습니다. 1. JVM 메모리 구조와 메모리 관리 기초1.1 JVM 메모리 구조JVM은 실행 시 여러 메모리 영역을 사용합니다. 그 중 힙(heap)은 보통 가장 큰 영역으로, 애플리케이션이 동적으로 할당한 객체들이 저장되는 공간입니다.-Xmx 옵션으로 설정한 최대 힙 크기까지 객체를 저장할 수..