전체 글
-
humongous object javaJava/자바를 더 깊게 2025. 3. 15. 19:43
humongous object 란?humongous는 거대한 이라는 사전적 의미를 가지고 있습니다.humongous object는 이 글에서는 앞으로 거대한 객체로 칭하겠습니다. 하지만 거대하다는 것을 추상적인 의미를 가집니다.누군가는 1KB 정도의 객체를 거대하다고 생각할 수 있고, 누군가는 1MB 정도가 거대하다고 생각할 수 있습니다. JVM 세상에서 거대한 객체로 인식되는 것은 GC와 연관 있기 때문에 GC에 대해서도 알아보겠습니다. JVM GC - G1GCJDK 11부터는 default GC가 G1GC입니다.G1GC의 경우 Heap이 동일한 크기의 여러 지역으로 분할되어 있는 것이 특징입니다.각 지역은 Eden, Survior, Tenured로 분류되며 새로운 객체가 생성되면 Eden으로 할당됩니..
-
Long Transaction을 감지하고 대응하는 방법JPA 2025. 2. 25. 01:04
개요Long Transaction으로 인해 DB에 부하가 발생하여 같은 DB를 활용하는 모든 서버들에 영향이 가는 상황이 발생하여 왜 그런 일이 일어나는지, 어떻게 하면 예방할 수 있을지 공부하며 기록해보고자 합니다. Long Transaction이란?Long Transaction은 트랜잭션이 열리고 긴 시간 동안 commit, rollback이 수행되지 않고 있는 데이터베이스 트랜잭션을 말합니다. 데이터베이스에서 트랜잭션은 하나의 논리적인 작업 단위를 의미하며, 데이터의 일관성(Consistency)과 무결성(Integrity) 을 보장하는 중요한 역할을 합니다. 긴 시간이라는 것은 상대적이긴 개념입니다. 만약 평균 트랜잭션이 100ms 이내에 처리된다면, 1초만 넘어가도 상대적으로 Long Tran..
-
토스뱅크에서의 1년 회고회고 2025. 2. 19. 20:21
개요2024년 1월 22일에 입사를 하고 어느덧 1년이 지나갔습니다. 미래의 나와 토스뱅크에 대해 궁금한 분들을 위해 1년의 여정을 기록으로 남겨보려고 합니다. 입사 이유 금융 도메인이 저에게도, 많은 사람들에게도 불편한 영역이었습니다. 이 불편함을 해결하는 게 기여하고 싶었습니다. 포용과 혁신을 추구하는 토스뱅크에서 함께 일한다면 더 큰 시너지를 낼 수 있을 거라 생각했습니다. 또한 빠르게 성장하는 회사에 합류하여 도전적인 미션들을 해결하면서 회사와 같이 개인적으로도 성장하는 것을 기대하였습니다. 업무와 역할 입사 후 합류하게 된 팀은 기업여신 팀이었습니다. 기업여신팀은 개인사업자분들에게 대출을 제공하는 도메인이었으며 시장 상황에 따라 폐업이 발생할 수 있는 개인사업자분들에게 대출을 제공하는 것은 리..
-
k8s에서 간헐적으로 Connection이 Reset된 이유CS/네트워크 2025. 2. 9. 20:22
개요k8s환경에서 간헐적으로 rst 패킷이 발생하는 경우가 존재했습니다. 특이한 점으로 모든 서버에서 일어나지 않았고 특정 서버에서만 발생했습니다. 해당 서버는 다른 서버에 비해 HTTP Request Body에 큰 데이터를 담아 보내는 특징이 있었고 비슷한 버그 사례가 kubernetes 공식문서에 존재하는 것을 사내 SRE 분께서 찾아주셨습니다. 해당 아티클을 기반으로 문제가 해결되었고 네트워크와 k8s 환경을 이해해보기 위해 당시 상황과 아티클을 나만의 글로 다시 정리해보고자 합니다. 아티클 정리kube-proxy Subtleties: Debugging an Intermittent Connection Reset 주제의 글이며 2019년 글으로 6년 전의 글입니다. 직역해 보면 Kube-proxy의..
-
Hibernate Slow Query 감지하기JPA 2025. 1. 29. 11:33
개요Hibernate의 slow query를 감지하는 기능을 활성화하는 방법에 대해 알아보겠습니다. 더 나아가서 hibernate query에 부가정보를 남겨서 slow query 발생 시 추적에 용이하게 활용할 수 있는 방법에 대해 알아보겠습니다. Slow Query란?Slow Query는 데이터베이스에서 실행되는 쿼리 중 실행 속도가 느린 쿼리를 의미합니다. 일반적으로 데이터베이스 쿼리가 데이터를 가져오거나 업데이트하는 과정에서 시간이 오래 걸리면 데이터베이스의 성능저하로 인해 여러 문제가 발생할 수 있습니다. 그러면 얼마나 느려야 slow query로 판단할 수 있을까요? Hibernate Slow Queryorg.hibernate.SQL_SLOW = INFO : Hibernate 5.4.5 이상 ..
-
ArchUnit Test로 컨벤션 강제하기테스트코드(Test Code) 2025. 1. 18. 13:55
개요ArchUnit에 대해서 알아보고 ArchUnit을 활용하여 어떻게 컨벤션을 강제할 수 있는지 글을 작성해보려고 합니다. ArchUnit이란?ArchUnit은 패키지와 클래스, 레이어와 슬라이스 간의 종속성을 검사하고 순환 종속성 등을 확인할 수 있습니다. 주어진 Java 바이트코드를 분석하고 모든 클래스를 Java 코드 구조로 가져와서 이를 수행합니다. 실습 - gradle 세팅dependencies { // 글 작성 기준 공식문서 가이드 버전 testImplementation("com.tngtech.archunit:archunit-junit5:1.3.0") } 실습 - ArchUnit으로 의존성 강제하기class ArchitectureTest { private val import..
-
JVM 밑바닥까지 파헤치기 - 프런트엔드 컴파일과 최적화Java 2024. 12. 22. 14:24
개요스터디를 진행하면서 JVM 밑바닥까지 파헤치기 책의 10장 프런트엔드 컴파일과 최적화 발표를 맡게 되었고 이에 대한 내용을 정리해보고자 합니다. 프런트엔드 컴파일이란?.java 파일을 .class 파일로 변환하는 과정을 프런트엔드 컴파일이라고 합니다. 자바 소스 코드 → 바이트코드로 변환하는 과정입니다. 반대로 백엔드 컴파일의 경우 바이트코드를 기계어로 변환하는 과정을 뜻합니다. JIT 컴파일러가 런타임에 최적화를 수행하기도 하며, AOT 컴파일러가 특정 하드웨어용 네이티브 바이너리 코드로 곧바로 컴파일하기도 합니다. 최적화(optimization)는 무엇을 의미할까?먼저 최적화의 사전적 의미를 찾아보면 아래와 같습니다. 1. 한정된 자원과 상황 속에서 최대한의 성능을 발휘할 수 있도록 끌어올리는 ..
-
우리는 왜 spring kafka batch listener를 활용하지 않나요?프로젝트/kafka 2024. 12. 1. 23:38
개요신규입사자분께서 우리는 왜 kafka message를 consume 할 때 batch listener를 활용하지 않는지, 그 선택에서 어떤 히스토리와 결정이 있었는지 물으셨습니다. 단건씩 메시지를 받지 않고 batch listener를 활용하여 한번에 여러 건의 메시지를 받으면 네트워크 레이턴시를 아낄 수 있을 것 같다는 의견을 주셨습니다. 질문 주신 내용이 합리적인 생각이라는 들었지만 batch listener에 대한 지식이 없었기 때문에 why에 답변을 할 수 없었습니다. 그에 대한 답을 찾기 위한 여정을 기록해보고자 합니다. Batch Listener란?@Beanfun myContainerFactory(): ConcurrentKafkaListenerContainerFactory { val..