전체 글 72

MSA 환경에서의 SAGA 패턴 정리(feat. 분산 트랜잭션)

회사에서 MSA 구조로 운영되는 서버들을 겪다 보면, 분산 트랜잭션이라는 주제를 자연스럽게 마주하게 된다. 나도 처음엔 그냥 각 서비스가 알아서 처리하면 되는 거 아닌가? 싶었는데, 서비스 간 데이터 정합성 문제가 생기면서 이게 그렇게 단순한 문제가 아니라는 걸 깨달았다.SAGA 패턴이란 걸 인지하게 된 건, Elixir의 Exq라는 백그라운드 잡 처리 라이브러리를 살펴보면서였다. Exq에서 실패한 작업을 재시도하고, 보상 처리하는 구조를 보다 보니 "이거 분산 트랜잭션에서 쓰는 SAGA 패턴이랑 비슷한데?" 싶었고, 그때부터 본격적으로 파보게 됐다. 그래서 이번에 한번 정리해보려고 한다.* 참고로 Elixir는 함수형 언어이고, Exq는 Elixir에서 지원하는 메시지 큐 라이브러리 중 하나다 (red..

SPRING FRAMEWORK 2026.03.27

UNION과 UNION ALL을 사용하지 말아야 할 이유

SQL 쿼리를 짜다 보면 UNION이나 UNION ALL을 꽤 자연스럽게 쓰게 되는 순간이 온다. WHERE 조건만 조금씩 다른 SELECT 문 여러 개를 합쳐야 할 때, 직관적으로 떠오르는 게 UNION이기 때문이다. 나도 초반에 별 생각 없이 UNION을 썼었는데, 실행 계획을 뜯어보면서 생각보다 심각한 문제가 있다는 걸 알게 됐다. 이번 글에서는 EXPLAIN ANALYZE를 통해 실행 비용을 비교하면서, UNION / UNION ALL을 쓰기 전에 왜 쿼리를 다시 한번 검토해봐야 하는지 정리해보려고 한다. 완전 깊게 파고드는 건 아니고, 실무에서 주의해야 할 포인트 중심으로 정리할 예정이다. UNION이랑 UNION ALL, 뭐가 다른데?먼저 기본 개념부터 짚고 가면, UNION은 두 SELECT..

SQL 2026.03.14

FCM과 VPAID 정리(Feat. 웹푸시)

최근에 업무하면서 FCM이랑 VPAID를 같이 다루게 될 일이 있었는데, 생각해보니 이 두개를 제대로 정리해본적이 없었던 것 같다. FCM은 모바일 개발하면서 자주 접하긴 했지만 막상 설명하라고 하면 좀 애매했고, VPAID는 광고쪽 작업하면서 처음 들어봤는데 처음엔 뭔소린지 감이 안왔다.그래서 이번에 한번 정리해보려고 한다. 완전 깊게 파고드는건 아니고 각각 뭐하는건지, 어떻게 동작하는건지 정도만 간략하게 정리할 예정이다.FCM이 뭔데?FCM은 Firebase Cloud Messaging의 약자다. 구글에서 제공하는 무료 푸시알림 서비스인데, 쉽게 말하면 서버에서 사용자 모바일기기로 메시지를 보내주는 기술이다. 쿠팡이나 배민에서 "오늘의 특가! 50% 할인" 같은 알림이 폰에 뜨는걸 본적 있을텐데, 이..

JAVASCRIPT 2026.02.27

JVM의 메모리영역 정리

자바(코틀린)로 개발하면서 JVM이라는 단어는 수도 없이 들었는데, 막상 누가 "JVM 메모리 구조 설명해봐"라고 하면 제대로 설명 못 할 것 같다는 생각이 들었다. 면접에서도 단골 질문이고, 실무에서 OutOfMemoryError나 StackOverflowError를 만났을 때 원인을 파악하려면 결국 이 구조를 알아야 한다.그래서 이번에 한번 정리해보려고 한다. 완전 깊이 파고드는 건 아니고, 각 영역이 뭐하는 곳인지 정도만 간략하게 정리할 예정이다.Runtime Data Area가 뭔데?자바 프로그램을 실행하면 JVM은 OS로부터 일정량의 메모리를 할당받는다. 이렇게 할당받은 메모리를 런타임 데이터 영역(Runtime Data Area)이라고 부르는데, JVM은 이 공간을 용도별로 나눠서 사용한다.크..

JAVA 2026.02.13

이직 후 처음 경험해본 k8s

올해 초에 이직을 했는데 새 회사는 서비스 배포를 전부 쿠버네티스로 하고 있었다. 면접 때 "쿠버네티스 경험 있으세요?"라는 질문에 "도커는 좀 써봤습니다"라고 대답했던 게 지금 생각하면 좀 웃긴다. 도커와 쿠버네티스는 다른데...첫 주에 온보딩 문서를 받았는데, 거기에 클러스터, 노드, 파드, 디플로이먼트, 서비스 같은 용어가 쏟아져 나왔고, 나를 제외한 나머지 사람들은 무슨내용인지 알아듣는 것 같아 자괴감도 들었다.그래서 이번 글에서는 쿠버네티스를 처음 접하면서 어려웠던 개념들을 정리해보려고 한다. 클러스터가 뭔데?제일 먼저 막혔던 개념이 클러스터였다. 문서에는 "여러 대의 서버를 하나의 클러스터로 묶어서 관리한다"고 써있었는데, 이게 무슨 말인지 처음엔 몰랐다. 이전 회사에서는 서버 한 대에 앱 하..

OTHERS 2026.02.10

요즘 LLM, 직접 써본 느낀점 정리

작년 이맘때만 해도 GPT-4o가 사실상 독주하던 시절이었다. Claude 3.5 Sonnet이 코딩 쪽에서 꽤 쓸만하다는 얘기가 돌긴 했지만, 대부분의 사람들이 쓰는 건 결국 ChatGPT였고, Gemini는 "구글이 만든 그거" 정도의 인식이 전부였다. 그런데 2025년 하반기부터 분위기가 확 바뀌었다. 모델들이 전부 세대교체를 하면서, 이제는 어떤 모델이 확실히 낫다고 말하기 어려운 상황이 됐다. 상황에 따라, 목적에 따라 다른 모델을 골라 써야 하는 시대가 온 거다. 지금 시점에서 실제로 쓸 수 있는 주요 모델 세 개를 놓고 체감 차이를 정리해본다. GPT-5.2 — 추론이 확실히 달라졌다 OpenAI가 2025년 말에 내놓은 GPT-5.2는 솔직히 놀라운 부분이 있다. 이전 모델들이 "그럴듯하게..

OTHERS 2026.02.10

CustomRepository의 PropertyReferenceException

작업하면서 오랜만에 QueryDsl을 사용하기위해 커스텀 레포지토리를 만들어서 작업하는동안 발생한 오류를 정리해보려고 한다. 발생했던 오류메시지의 맨 아랫부분은 아래와 같고, 위쪽도 찬찬히 읽어보니 의존성, 빈생성을 실패했다는 걸 알 수 있었다. 당시 코드 구성은 대략 다음과 같았다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 // 글 내용을 간략하게 위해 한 페이지에 모두 서술 // Spring Data의 JpaRepositor..

SPRING FRAMEWORK 2023.04.28

Javascript 문자열의 숫자변환

Front-End 개발을 하면서 Javascript를 사용하여 사칙연산을 하다보면 원하던 결과와 다른 결과가 나오는 경우가 가끔있다. ex) 예를들면 1 + 2를 했을때 원하는 결과는 3이 나와야 하는데, 문자열로 연결되어 12가 된다던가 하는.. 물론 자바스크립트에서 문자열을 숫자로 바꾸는 방법은 예전부터 알고 있었지만, 여러가지 방법이 있어서 정리도 할겸 글을 작성해본다. 여기서부턴 코드를 이용해서 설명.. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 // Number을 이용하는 방법 const str1 = '5'; const str2 = '15'; console.log(str1 + str2); // 515 let result ..

JAVASCRIPT 2023.02.14

Javascript Queue구현 및 사용방법 + 재귀호출

최근 사내에서 개발을 하던 중 동시에 요청이 들어왔을 때 기존에 실행되던 기능이 새로운 요청이 들어오면 종료되는 문제가 있어서 자료구조중 큐를 이용해 순차적으로 수행할 수 있도록 하는기능을 구현했는데, 큐를 구현했던 경험을 정리하려고 한다. 먼저 javascript에선 Queue를 리스트를 이용해구현할 수 있고 난 다음과 같이 구현하여 사용하였다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 (function () { class Queue { constructor() { this.items = []; } enqueue(value) { // 큐에 값을추가 this.items.push(valu..

JAVASCRIPT 2022.11.25

vue js modal에서 부모 컴포넌트 접근하기

최근 작업을 하다보니 팝업을 띄워서 작업하는 부분을 구현해야 할 일이 있었는데, 그때 부모 컴포넌트의 데이터를 가져올 때 생겼던 이슈에 대해서 정리해보려고 한다. 대략 내가 구현했던 화면은 위 그림과 같았고, popup에서 특정 action시 mainview의 데이터를 수정해줘야 하는 기능이 필요했고, 코드는 대략 다음과 같은 구성이였다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 //생략 button action ((doc) => { var vue = new Vue..

JAVASCRIPT 2022.06.29
반응형