본문 바로가기

Spring6

Kubernetes 에서 안전하게 힙 덤프 수행하기 운영 중인 서비스를 모니터링 하다보면 메모리 사용량이 비정상적인 경우가 있다. 메모리 사용량이 지속적으로 우상향하여 누수 현상이 의심되거나 객체가 비정상적으로 많이 할당된다는 생각이 들면 힙 덤프를 분석하여 원인을 진단할 수 있다.힙 덤프는 어떤 프로세스의 특정 순간의 메모리 스냅샵이다. 분석하려는 서버에 접근하여 힙 덤프를 생성하고 MAT 과 같은 도구로 이를 분석하면 유의미한 결과를 얻을 수도 있다. 자바에서는 JDK 와 함께 번들로 제공되는 jmap 명령을 이용하면 쉽게 생성할 수 있다.다만, 머신 입장에서 힙 덤프는 쉽게 생성할 수 있는 파일이 아니다. 어플리케이션에 할당된 메모리 양이 클수록 힙 덤프 수행시간도 오래걸리고, 힙 덤프를 생성하기 전에 필요없는 객체를 없애도록 Full GC 를 수행.. 2024. 6. 13.
Github Rest API 를 통한 테스트 자동화 여러 프로젝트에서 공통으로 사용되는 기능이나 설정을 관리하기 위해 라이브러리를 만들어 배포하는 경우가 있습니다. 한번 배포된 라이브러리는 여러 곳에서 의존할 수 있기 때문에 수정하는 것은 경우에 따라 부담스러운 작업일 수 있습니다. 물론 버저닝을 할 수 있지만 큰 변화가 없는 경우에는 하위 호환을 지켜주는 것이 좋수정한 라이브러리 자체에 대한 테스트는 Junit 같은 도구를 통해 쉽게 할 수 있습니다. 추가로, 이 라이브러리를 사용하는 쪽에서 수정된 버전으로 빌드나 테스트를 했을 때 깨지지 않는지도 확인하고 싶은 경우가 있을 수 있습니다.예를 들어 사내에 jackson-databind 2.16.1 버전을 이용하는 common-library 가 있는데, jackson-databind 의 버전을 2.17.0.. 2024. 3. 31.
Jpa Multi-datasource 구성과 @Transactional Springboot 에 Jpa 를 설정할 때 개발자는 db 관련 정보만 적어주면 single-datasource 환경에 한하여 필요한 모든 구성을 자동(auto configuration)으로 설정해줍니다. 비지니스가 복잡해지면 multi-datasource 연결이 요구되어 Jpa 관련 설정을 직접 해야 하는 경우가 생길 수 있는데요, 이 글에서는 설정에 필요한 요소들과 multi-datasource 환경에서 @Transactional 이 어떤 커넥션을 획득하여 트랜잭션을 처리하는지 간단히 정리해보겠습니다. DataSource DataSource 는 db config 정보를 통해 커넥션을 생성하고 관리하는 객체입니다. val config = HikariConfig().apply { jdbcUrl = "jd.. 2024. 3. 19.
멀티 스레드 환경에서의 동시성 이슈와 Blocking, Non-blocking 알고리즘을 이용한 동기화 개발을 하다보면 하나의 공유 자원을 여러 곳에서 동시에 접근하면서 race condition 이 발생하여 예상하지 못한 결과를 만들어 내는 경우가 있습니다. 웹 백엔드 서버를 개발한다면 보통 DB 와 같은 저장소에 접근할 때 동시성 이슈를 많이 만나게 되는데요, 이 글에서는 자바 코드 내의 특정한 객체(변수)에 접근할 때 발생하는 동시성 이슈를 해결하는 방법에 대해 다루어 보겠습니다. 멀티 스레드 환경에서 코드를 작성할 때에도 동시성 이슈는 언제든지 발생할 수 있습니다. 이를 살펴보기 위해 Int 형 멤버 변수 하나와 멤버 변수에 1을 더하는 메서드를 가진 간단한 SimpleNumber 클래스를 만들었습니다. class SimpleNumber ( var value: Int = 0 ) { fun plusO.. 2023. 12. 19.