끄적이는 중...

전체 글 135

[JVM] 플랫폼 스레드와 가상 스레드

Java 21에서는 가상 스레드를 정식 기능으로 사용할 수 있다 비교 플랫폼 스레드 가상 스레드 관리JVM과 OS주로 JVM 런타임OS 스레드 관계일반적으로 1:1 대응소수의 플랫폼 스레드에 다수 배치 가능생성 비용상대적으로 높음상대적으로 낮음적합한 작업일반적인 실행 작업I/O 대기가 많은 작업가상 스레드가 많다고 해서 CPU가 빨라지는 것은 아니다 대신 많은 요청이 DB나 네트워크 응답을 기다리는 환경에서 스레드 사용 효율을 높이는 데 도움이 된다

Note
[JVM] 스레드(Thread)

스레드는 프로세스 내부에서 코드를 실행하는 흐름이다Java 애플리케이션 하나에서 여러 스레드가 실행될 수 있으며, 각 스레드는 독립적인 JVM Stack을 가진다예를 들어 Spring MVC 기반 웹 서버에 HTTP 요청 세 개가 들어오는 상황을 생각해 보자전통적인 서블릿 기반 Spring MVC에서는 일반적으로 요청 처리에 서버의 작업 스레드가 사용된다. 실제 스레드 배정과 재사용은 웹 서버 및 실행 환경 설정에 따라 달라진다여기서 중요한 사실은 스레드마다 Stack은 구분되어 있어도 Heap에 있는 같은 객체를 공유할 수 있다는 것이다따라서 여러 요청이 같은 객체의 변경 가능한 필드를 수정한다면 동시성 문제가 발생할 수 있다

Note
[JVM] Heap과 Stack의 동작

public void createUser() { int age = 28; User user = new User("Kim");} age는 지역 변수로 스택 프레임의 지역 변수 영역에서 다룬다user는 객체를 참조하는 지역 변수다new User(...)로 생성한 객체는 개념적으로 Heap에 할당된다createUser()가 종료되면 해당 메서드의 스택 프레임은 제거된다Heap 객체가 더 이상 도달 가능하지 않으면 GC의 회수 대상이 될 수 있다참고로 Stack은 메서드가 종료되면 해당 프레임이 제거되지만, Heap 객체는 GC가 회수할 때까지 남아 있을 수 있다

Note
[JVM ] JVM 메모리 구조

JVM 명세는 실행 중 사용하는 메모리 영역을 정의한다. 크게 모든 스레드가 공유하는 영역과 스레드마다 별도로 가지는 영역으로 나눌 수 있다 영역 무엇이 저장되는가? 공유 여부 Heap객체, 배열공유Method Area클래스 구조, 메서드 정보 등공유JVM Stack메서드 호출 프레임, 지역 변수 등스레드별PC Register현재 실행 중인 JVM 명령어 위치스레드별Native Method Stack네이티브 메서드 실행에 필요한 스택스레드별

Note
[Transactional] Spring이 ThreadLocal을 이용해서 현재 스레드의 DB 자원을 어떻게 연결하는지

Spring은 이런 정보를 관리한다Thread A└─ 현재 트랜잭션 관련 자원 └─ DataSource → ConnectionHolder └─ Connection중요한 건 Connection 자체를 그냥 변수 하나에 박아두는 게 아니라, 보통 DataSource를 키처럼 사용해서 그 DataSource에 연결된 트랜잭션 자원을 찾는 구조다 아래와 같은 관계를 현재 Thread에 묶어 둔다 그래서 나중에 Repository가 DB 작업을 하려고 할 때 지금 이 Thread에서 이 DataSource용 Connection이 이미 있나? 를 확인하고, 있으면 새 Connection을 또 빌리지 않고 기존 Connection을 재사용할 수 있다DataSource A → Conn..

Note
[Transaction] TransactionSynchronizationManager 구조

TransactionSynchronizationManager 란, 현재 Thread에 어떤 트랜잭션 관련 자원이 연결되어 있는지를 관리하는 Spring 클래스Thread A│└─ TransactionSynchronizationManager │ └─ DataSource → Connection #3 왜 DataSource → Connection 형태냐? 여러 DB 자원이 있을 수 있다회원 DB DataSource → Connection #3통계 DB DataSource → Connection #7그래서 그냥 현재 Connection = #3 보다는 이 DataSource에서 사용하는 자원 → 이 Connection 처럼 Key-Value 형태로 찾을 수 있게 관리한다용어DataSource ..

Note
[Transactional] 트랜잭션이 시작됐는데, Connection을 어디다 들고 있지?

TransactionManager가 HikariCP에서 Connection 하나를 가져왔다고 해보자orderRepository.save()를 실행할 때 Connection을 써야 하고 paymentRepository.save() 를 실행할 때도 똑같은 Connection 을 사용해야 같은 DB 트랜잭션에 들어갈 수 있다orderRepository.save(order, connection3);paymentRepository.save(payment, connection3);매번 우리가 위 코드처럼 전달하지 않는다 그런데도 Spring은 어떻게 같은 Connection인지 알까? Spring 공식 문서에서도 일반적인 @Transactional 트랜잭션은 현재 실행 Thread에 트랜잭션을 연결하는 threa..

Note
[Monitoring, Todak-Todag] Application Performance Monitoring

쉽게 말하면 APM(Application Performance Monitoring)은 애플리케이션의 성능과 요청 흐름을 관찰하면서, 어디서 지연이나 오류가 발생했는지 찾기 위한 모니터링 도구 또는 체계라고 보면 된다예를 들어 APM에서는 다음과 같은 정보를 확인할 수 있다요청 응답시간에러율서비스별 지연 시간Trace / Span특정 요청이 어떤 서비스를 거쳤는지어느 구간에서 병목이나 오류가 발생했는지메트릭·로그·Trace를 함께 확인해 원인을 좁히는 과정상용 APM의 예로는 Datadog APM, New Relic 등이 있다 Todak-Todag Troubleshooting다만 Todak-Todag 프로젝트의 문제는 관측 도구가 없는 것이 아니었다 이미 Prometheus·Loki·Zipkin을 통해 메..

Note