목록전체 글 (254)
FireDrago
기술면접1. Young GC와 Full GC의 차이가 뭐죠?2. 캐시 스탬피드(Cache Stampede)에 대해 설명해주세요. 해결방법은요?3. JVM 런타임 데이터 영역에 대해 설명해주세요 (1) - 표준스펙4. JVM 런타임 데이터 영역에 대해 설명해주세요 (2) - Hotspot JVM앞서 1편에서 JVM 표준 스펙(JVMS)의 구조를 정리했다. JVMS의 구조는 익숙한 구조였지만 실제 기술을 학습할때는 부적절하다.실제 자바 기술의 밑바닥을 이해하려면 추상적인 표준이 아니라우리가 실제로 서버에 띄우는 물리적인 구현체, HotSpot JVM의 구조를 이해해야 한다.이번 포스팅에서는 표준 스펙을 넘어선 HotSpot JVM의 실제 메모리 구조를 살펴보고,앞으로 새로운 자바 기술을 배울때 HotSpo..
기술면접1. Young GC와 Full GC의 차이가 뭐죠?2. 캐시 스탬피드(Cache Stampede)에 대해 설명해주세요. 해결방법은요?3. JVM 런타임 데이터 영역에 대해 설명해주세요 (1) - 표준스펙4. JVM 런타임 데이터 영역에 대해 설명해주세요 (2) - Hotspot JVM JFR(JDK Flight Recorder)의 개념을 정리하던 중, 네이티브 힙(Native Heap)이라는 개념을 처음 봤다.이후 HttpClient의 NIO 방식을 공부할 때도 네이티브 힙이 등장했다.고성능 자바 기술들은 네이티브 힙을 비롯한 JVM의 메모리 영역과 연관이 있었다.관련 기술들을 깊게 이해하려면, 결국 데이터가 어디에, 어떻게, 그리고 왜 그렇게 저장되는지 이해해야 한다.이번 포스팅에서는 기술 면..
치즈픽 - Cheese-Pick 치즈픽 - Cheese-Pick cheesepick.me📌 업데이트 (2026.7.3) : 이 글을 최초 작성한 이후, 기술 면접과 스터디 과정에서 질문을 받았습니다."Java의 HttpClient는 NIO 기반이라 유휴 커넥션 자체는 스레드를 거의 소모하지 않는데, 어떻게 200개의 웹소켓 연결만으로 200개의 스레드가 고갈될 수 있었나요?"이 질문을 계기로 당시의 대시보드를 다시 뜯어보고, JFR(Java Flight Recorder)을 통해 JVM 내부를 관찰하여 진짜 원인을 재검증했습니다. (5. 병목 원인 재진단 항목부터 추가적인 업데이트 내용입니다.)치지직의 상위 N개의 방송을 동적으로 인식하고, 자동으로 하이라이트 타임스탬프를 찍는 '치즈픽' 서비스를 운..
마크다운 코드블럭이 지원하는 언어는 매우 다양한데,티스토리 기본모드에서 코드블럭은 지원하는 언어가 몇개 없다.그렇다고 HTML 모드, 마크다운 모드로 변경하면 기존의 서식이 뭉개져서 불편하다.아래 자바스크립트 코드를 적용하여글 작성 모드 변경없이 마크다운이 지원하는 모든 언어를 코드블럭에서 표현할 수 있다. 위 코드를 티스토리 블로그 설정 -> 스킨 편집 -> html 편집 탭에서스크롤을 쭉 내려서 `` 태그 바로 위에 추가해준다. #Kotlinclass KotlinClass ( val content: String, val error: ErrorCode) { compainon object { final val TTL: int = 10 }}// 코틀린 코드도 잘 표현된다..
try-catch 는 최후의 방법 아닌가요? 더 우아한 방식은 없을까요? 코틀린을 사용하는 회사의 기술면접에서 질문을 받았다면접관이 묻고 싶었던 것은 예외를 어떻게 던지고 잡을지가 아니라,애초에 예외를 다른 방식으로 표현할 수는 없는지였다.기존 자바와 스프링의 예외 처리 방식에 익숙했던 나는 이 질문에 제대로 답하지 못했다.면접 이후 찾아보니 코틀린에서는 `throw` 대신 `Result` 객체를 활용해실패를 하나의 값으로 다루는 방식도 존재한다는 것을 알게 되었다. 마침 다음 주에는 코틀린과 스프링으로 제한 시간 안에 과제를 완성해야 하는 일정도 있다.이왕 공부하는 김에 간단한 프로젝트를 만들면서 코틀린 문법을 익히고,자바와 무엇이 다르고 왜 그렇게 설계되었는지 정리해 보려고 한다. 코틀린의 3가지 핵..
프로젝트를 진행하며 방송 제목 변경, 카테고리 변경과 같은 스트림 메타데이터 변경을 추적하는 기능을 구현했다.초기에는 Redis Lua 스크립트 내부에서 상태 비교와 변경 감지까지 모두 처리하도록 구성했다.하지만 기능이 점점 추가되면서 비즈니스 로직이 계속 쌓이기 시작했다.그 과정에서 자연스럽게 이런 고민이 들었다.비즈니스 로직은 Redis가 담당하는 게 맞을까?Redis와 애플리케이션 중 어디까지 책임을 가져가야 할까? 이번 글에서는 Redis Lua 스크립트에 비대해진 비즈니스 로직을 어떻게 바라봤는지,그리고 Redis와 애플리케이션 사이에서 트레이드 오프를 고민하며 리팩토링했는지 정리해보려 한다.문제 : 비대해진 Lua 스크립트-- [AS-IS Lua 스크립트 중 일부] JSON 디코딩 및 상태 비..
기술면접1. Young GC와 Full GC의 차이가 뭐죠?2. 캐시 스탬피드(Cache Stampede)에 대해 설명해주세요. 해결방법은요?3. JVM 런타임 데이터 영역에 대해 설명해주세요 (1) - 표준스펙4. JVM 런타임 데이터 영역에 대해 설명해주세요 (2) - Hotspot JVM 암기 보단 사고과정"캐시 스탬피드에 대해서 설명해주세요" 머릿속이 하얘졌다. 생전 처음 듣는 개념이었기 때문이다. 다행히 면접관은 예시를 통해 설명을 이어갔다. "자 그럼 캐시 만료 시간을 1분으로 지정했다고 가정해보죠. 캐시 만료 이후, 폭발적 요청이 와서 db 부하가 폭증하는 상황이 오면 어떻게 해결할 수 있을까요?" 처음 접하는 문제였지만, 생각해보니 일단 '캐시 만료와 동시에 몰리는 요청'이 핵심이라고 생각..
기술면접1. Young GC와 Full GC의 차이가 뭐죠?2. 캐시 스탬피드(Cache Stampede)에 대해 설명해주세요. 해결방법은요?3. JVM 런타임 데이터 영역에 대해 설명해주세요 (1) - 표준스펙4. JVM 런타임 데이터 영역에 대해 설명해주세요 (2) - Hotspot JVM 최근 기술면접을 다녀왔다.이때까지 기술면접에서 받았던 질문들을 공부하고 정리하는 시리즈를 포스팅해보려고 한다.첫번째 질문은 "Young GC와 Full GC의 차이"이다. GC(Garbage Collection)가 뭔데?'자바의 특징'을 검색하면 바로 자동 메모리 관리가 뜬다. 자바가 처음 세상에 나올 당시 기존의 언어(c,c++)들은 개발자가 수동으로 메모리를 관리해야 했다.수동으로 메모리를 관리하는 프로그래밍 ..
치즈픽 - Cheese-Pick 치즈픽 - Cheese-Pick cheesepick.me치지직의 상위 N개의 방송을 동적으로 인식하고, 자동으로 하이라이트 타임스탬프를 찍는 '치즈픽' 서비스를 운영 중이다. 이전 부하 테스트를 통해 가상 스레드를 적용하여 웹소켓 수집단의 I/O 병목을 개선했다. 하지만 트래픽을 지연 없이 수신하는 것과 이를 '분석하고 저장'하는 것은 별개의 문제다. 단일 애플리케이션 내에서 수천 건의 채팅 데이터를 지연 없이 버퍼링하고, DB I/O 부하를 최적화하여 안정적인 분석 파이프라인을 구축한 과정을 정리했다. 1. 강결합으로 인한 장애 전파 위험초기 구조에서는 웹소켓으로 채팅이 유입되면, 메인스레드가 채팅 수 집계와 DB 저장까지 동기적으로 처리했다. 이렇게 수집과 분석 로직..
https://cheesepick.me/치지직의 상위 N개의 방송을 동적으로 인식하고, 자동으로 하이라이트 타임스탬프를 찍는 '치즈픽' 서비스를 배포했다.실시간 방송 채팅 데이터를 수집하고 분석하는 엔진 특성상 Kafka와 Redis를 구동하고 연산을 처리하기 위해 꽤 큰 메모리와 CPU 성능이 필요했다. AWS 에서 구동하기 위해서는 꽤 큰 비용이 예상됐다. 그래서 역할별로 모듈을 구분하고, 홈서버와 오라클 클라우드에 나누어 배치했다. 그 과정을 알아보자 1. 인프라 역할 분리 (Cloud vs On Premise)핵심은 모듈간의 역할을 분리하는 것이다. Engine (Home Server): 웹소켓 채팅 수집, Kafka 메시지 큐잉, 실시간 화력 분석 등 메모리와 연산이 많이 필요한 무거운 작업은 ..