[Spring] Spring Batch 병렬 처리로 배치 시간 7배 단축하기
“배치가 7시간이나 걸려요. 새벽에 시작해도 업무 시작 전에 안 끝나요.”
“배치가 7시간이나 걸려요. 새벽에 시작해도 업무 시작 전에 안 끝나요.”
매일 새벽 2시, 은행 시스템에서는 수백만 개의 거래 내역을 처리합니다.
Spring Boot 애플리케이션에 APM을 얹을 때 가장 먼저 만나는 것이 Actuator다. 하지만 Actuator 자체가 모니터링·알림·대시보드까지 다 해주는 것은 아니다. 이 글은 Actuator가 무엇을 제공하고 무엇을 제공하지 않는지를 분리해 정리한다.
Spring Boot로 REST API를 개발하다 보면 반복되는 고민이 생깁니다.
JPA를 사용하는 개발자라면 거의 반드시 한 번은 겪게 되는 문제가 있습니다. 바로 N+1 쿼리 문제입니다. 개발 초기에는 괜찮다가, 데이터가 많아지면서 갑자기 수백, 수천 개의 쿼리가 날아가는 걸 보고 당황하게 되죠.
Spring Boot 개발자라면 누구나 @Transactional을 사용해봤을 거에요. 하지만 단순히 “메서드에 붙이면 트랜잭션이 된다”고 생각하는 것만으로는 충분하지 않습니다.
@Component는 왜 사용하는 걸까?
Spring 프레임워크에서 @Component 어노테이션은 매우 중요한 역할을 합니다. 이 글에서는 @Component가 왜 생겨났는지, 어떤 역할을 하는지, 그리고 어떻게 사용하는지에 대해 알아보겠습니다.
여러개의 이미지를 한번에 올릴 수 있는 방법을 정리하였습니다.
이미지를 정렬하는 방법을 정리한 글입니다.
다양한 일반적인 마크업 예시를 보여줍니다.
GFM(GitHub Flavored Markdown), Jekyll Highlight Tag, GitHub Gist Embed 3가지의 코드 입력 방법을 설명합니다.
jekyll 블로그 포스팅을 작성할때의 Text 정렬하는 방법을 정리한 글 입니다.
Post글을 작성하면서 사용할 수 있는 기능들을 정리 하였습니다.
여러개의 이미지를 한번에 올릴 수 있는 방법을 정리하였습니다.
이미지를 정렬하는 방법을 정리한 글입니다.
다양한 일반적인 마크업 예시를 보여줍니다.
GFM(GitHub Flavored Markdown), Jekyll Highlight Tag, GitHub Gist Embed 3가지의 코드 입력 방법을 설명합니다.
jekyll 블로그 포스팅을 작성할때의 Text 정렬하는 방법을 정리한 글 입니다.
Post글을 작성하면서 사용할 수 있는 기능들을 정리 하였습니다.
Windows 명령 프롬프트(Command Prompt, CMD)는 Windows 운영체제의 기본 커맨드 라인 인터페이스입니다. 파일 및 디렉토리 관리, 시스템 정보 조회, 네트워크 설정 등 다양한 시스템 작업을 수행할 수 있습니다. 이 문서는 자주 사용되는 CMD 명령어들을 카테...
jQuery는 DOM 선택/조작, 이벤트 처리, Ajax를 간결하게 제공하는 JavaScript 라이브러리입니다. 실무에서 폼 입력값을 빠르게 수집하고 JSON 객체로 변환하는 데 유용한 메서드(.val(), .prop(), .attr(), .serialize(), .seriali...
Jenkinsfile은 Jenkins Pipeline을 코드로 정의하는 파일입니다. 프로젝트 저장소의 루트 디렉토리에 위치하며, 빌드, 테스트, 배포 등의 자동화 프로세스를 Groovy 기반의 선언형(Declarative) 또는 스크립트형(Scripted) 문법으로 작성합니다.
Git은 분산 버전 관리 시스템으로, 소스 코드의 변경 이력을 추적하고 여러 개발자가 협업할 수 있도록 지원합니다. 이 문서는 Git의 필수 명령어를 빠르게 찾아보고 실무에 바로 적용할 수 있도록 정리했습니다.
Docker는 애플리케이션을 컨테이너로 패키징하여 어디서나 일관되게 실행할 수 있도록 하는 플랫폼입니다. 이 문서는 Docker의 필수 명령어를 빠르게 찾아보고 실무에 바로 적용할 수 있도록 정리했습니다.
“상속은 나쁘다”, “합성이 항상 우월하다”는 말을 자주 들어보셨나요? 하지만 실무에서는 이런 이분법적 사고가 오히려 비효율적일 수 있습니다. 이번 글에서는 상속(Inheritance)과 합성(Composition)을 실무에서 어떻게 선택하고 활용하는지, 실제 경험을 바탕으로 정리...
Java의 assert는 개발자들 사이에서 “있지만 거의 쓰지 않는” 기능으로 취급받습니다. 왜일까요?
이번 글은 “애플리케이션 내부에는 null이 없다” 라는 전제에서 출발한다. 문자열/객체형은 null을 허용하지 않고, null이 가능한 경우에만 변수명에 orNull을 명시한다. 이 전제를 지키면 팀 내부 규칙이 아주 단순해진다.
Spring Framework를 매일 사용하면서도, 그 아래에서 JVM이 메모리를 어떻게 관리하는지 생각해본 적 있으신가요?
비지니스 로직이 복잡해 지면서 Service 레이어의 코드가 복잡해지기 시작했습니다. 특히 DTO를 VO로 변환할 때 문제가 두드러졌습니다. 해당 문제는 로직의 가독성을 크게 떨어뜨렸습니다.
퀵 정렬(Quick Sort)은 분할 정복(Divide and Conquer) 전략을 사용하는 정렬 알고리즘으로, 평균적으로 가장 빠른 성능을 보입니다. 피벗(pivot)을 기준으로 데이터를 분할하고 재귀적으로 정렬하는 방식으로, 실무에서 가장 많이 사용되는 정렬 알고리즘 중 하나...
선택 정렬(Selection Sort)은 가장 직관적인 정렬 알고리즘 중 하나입니다. 이름처럼 배열에서 최소값을 선택하여 정렬되지 않은 부분의 맨 앞으로 이동시키는 방식입니다. 구현이 간단하고 동작 원리가 명확하여 알고리즘 학습의 기초로 많이 사용됩니다.
삽입 정렬(Insertion Sort)은 정렬된 부분에 새로운 원소를 적절한 위치에 삽입하는 방식의 정렬 알고리즘입니다. 카드 게임에서 손에 든 카드를 정렬하는 방식과 유사하여 직관적으로 이해하기 쉽고, 부분적으로 정렬된 데이터에 대해 매우 효율적입니다.
버블 정렬(Bubble Sort)은 가장 기본적인 정렬 알고리즘 중 하나입니다. 이름처럼 큰 값이 물속의 거품처럼 배열의 끝으로 올라가는(이동하는) 모습에서 유래했습니다. 코딩 테스트나 면접에서 자주 등장하는 기본 알고리즘이므로, 원리와 구현을 확실히 이해해두는 것이 좋습니다.
알고리즘 목차 정리 페이지입니다. 아래 목차에서 각 알고리즘으로 연결되는 링크를 통해 상세 설명과 구현 코드를 확인할 수 있습니다.
리눅스 노드, Docker 컨테이너, Spring Boot Actuator 환경에서 바로 붙여 넣어 쓸 수 있는 최소 PromQL 쿼리만 정리했다. 문법 근거는 Prometheus 공식 문서를 참고한다(PromQL basics, functions, histograms practic...
APM을 구성하면 Actuator가 데이터를 내보내고 Prometheus가 그것을 모아 보관한다. 하지만 Prometheus가 대시보드나 무제한 보관까지 다 해주는 것은 아니다. 이 글은 Prometheus가 무엇을 해주고 무엇을 해주지 않는지를 실무 관점에서 정리한다.
Prometheus만 설치해도 호스트의 CPU·메모리·디스크·네트워크 메트릭이 자동으로 수집되는 것은 아니다. 리눅스/유닉스 환경에서 이런 시스템 메트릭을 수집하려면 Node Exporter라는 작은 에이전트를 설치하고, Prometheus가 이를 스크레이프하도록 설정해야 한다. ...
Prometheus가 메트릭을 모아두면 Grafana는 그 위에 시각화·탐색·Alerting UI를 얹는다. 하지만 Grafana는 데이터를 저장하지 않고, PromQL 쿼리를 그대로 실행해 결과를 보여줄 뿐이다. 이 글은 실무 대화를 통해 정리한 Grafana의 역할과 구체적인 ...
컨테이너 CPU·메모리·디스크 I/O·네트워크 메트릭은 Prometheus만으로는 보이지 않는다. 호스트에 cAdvisor를 띄워야 컨테이너 메트릭이 /metrics 형식으로 노출된다. 이 글은 공식 가이드(cAdvisor guide)를 기반으로 최소 설치와 Prometheus 연...
많은 개발자들이 N+1 문제는 JPA에만 있는 것으로 알고 있습니다. “SQL을 직접 작성하는 MyBatis에는 그런 문제가 없겠지?”라고 생각하죠.
MyBatis를 사용하여 데이터를 페이징으로 조회할 때, 많은 개발자들이 다음과 같은 방식을 사용하고 있습니다.
마이바티스를 사용하다 보면 한 가지 반복되는 고민이 생깁니다. 바로 동적 쿼리에서 조건을 어디에 배치할 것인가라는 문제입니다.
고정 배열(static array)은 생성 시 크기가 결정되어 선택의 폭이 좁습니다. 얼마나 많은 요소를 저장할지 미리 알 수 없을 때 동적 배열(dynamic array)이 필요합니다. Java에서는 ArrayList와 Vector가 동적 배열의 역할을 하지만, 내부 구조와 성능...
자료구조 목차 정리 페이지입니다. 아래 목차에서 각 자료구조로 연결되는 링크를 통해 상세 설명과 구현 코드를 확인할 수 있습니다.
배열은 데이터 구조 중 가장 기본적이면서도 성능·메모리 모델의 핵심을 드러내는 구조입니다. 이 글은 Java를 기준으로 배열의 내부 원리(연속 저장, 주소 산술), 동적 배열(ArrayList)의 리사이즈 동작, 그리고 실무에서의 선택 전략(SoA 리팩터링, ArrayDeque, ...
프론트엔드 프로젝트가 커지면서 가장 먼저 복잡해지는 부분이 API 호출 관리입니다. 처음엔 간단하게 컴포넌트에서 직접 fetch나 axios를 호출하다가, 어느 순간 같은 API를 여러 페이지에서 중복 호출하고, API 엔드포인트가 변경되면 프로젝트 전체를 뒤져야 하는 상황에 직면...
현대의 웹 개발자라면 당연히 사용하는 API 호출. 하지만 이 기술이 어떻게 진화해왔는지, 그리고 왜 현재의 형태로 정착하게 됐는지 생각해본 적 있나요?
2010년대 초반 jQuery는 웹 개발의 표준이었습니다. 하지만 시간이 지나면서 React, Vue, Angular 같은 현대적 프레임워크들이 등장했고, 그들은 “상태가 변경되면 화면이 자동으로 업데이트된다”는 혁명적인 개념을 제시했습니다.
들어가며 팀 프로젝트를 진행하면서 frontend 코드와 backend 코드를 GitHub의 다른 레포지토리에 저장하고 있다. 이렇게 관리하니 문제가 발생했다. 버그를 발견했을 때, 이를 해결하기 위해서는 하나의 작업을 하기 위해 각각의 이슈를 찾아야 하는 문제가 발생했다. 이러한...
들어가며 최근 회사 업무를 진행하면서, 업무 중 발생한 파일을 관리하는 방법에 대해서 고민해보게 되었다. 온라인 업무를 진행하면 파일은 필연적으로 발생하게 되어 있다. 이것을 빠르고 정확하게 전달하며 관리하는 것은 오피스 업무ㄹ자에게는 꼭 필요한 능력이다. 나만의 파일 저장 패턴을...
AI 에이전트가 코드를 작성하는 시대가 왔다. GitHub Copilot Agent Mode, Claude Code, Cursor 등 다양한 도구가 등장하면서 “에이전트에게 맡기면 알아서 해준다”는 기대가 커지고 있다.
들어가며 최근에 Github Copilot을 사용하면서, 사용자 정의 지침(Custom Instructions)을 설정하는 것이, 개발 생산성을 크게 향상시킬 수 있다는 것을 깨달았다. 이 글에서는 Copilot의 사용자 정의 지침을 설정하는 방법과 그 효과를 정리해보려 한다.
평소에 당연하게 실행하던 SQL 쿼리, 혹시 이런 생각 해보셨나요?
“www.google.com”을 브라우저에 입력하고 엔터를 누렸을 때, 과연 무슨 일이 일어날까요?
웹 개발을 하다 보면 매일 HTTP 통신을 사용하지만, 정작 그 내부 동작 원리를 제대로 이해하는 경우는 드뭅니다. “GET으로 데이터를 가져오고, POST로 데이터를 보낸다” 정도만 알고 넘어가는 경우가 많죠.
본 문서는 앞으로의 문서를 작성함에 있어 일관성을 유지할 수 있도록 돕기 위해 작성한 문서 이다. 아래에 정의 되지 않는 문법은 글에 작서하지 않는다.
취업을 준비하며 과거의 나의 삶에서 놓친 부분을 되돌아 보았다. 내가 놓친 것은 글쓰기라 생각했고, 놓쳤던 글쓰기를 바로 잡기 위해 글쓰기 블로그를 시작한다.
들어가며 최근 회사 업무를 진행하면서, 시간관리나 업무 관리의 부족함을 자신으로 부터 느끼게 되었다. 개발 관련 지식도 중요하지만 그것 보다 더 중요한 것은 온라인에서의 업무를 얼마다 빠르고 정확하게 처리할 수 있는가 라고 생각했다. 이번 기회에 업무 관리 툴을 선택하고 사용 방법...
멀티코어 시대, 성능 최적화를 위해서는 프로세스와 스레드를 제대로 이해하는 것이 필수입니다. 이 글에서는 기초 개념부터 실무 적용까지, 실제 사례와 함께 자세히 알아보겠습니다.
디자인 시스템 조합성, 컴포넌트 중심으로 초반 방향성 잡기
들어가며: jQuery와 React 사이의 딜레마
E2E(End-to-End) 테스트를 작성하다 보면 막막한 순간이 있습니다. 특히 “이 테스트가 성공했다고 판단할 기준이 뭐지?”라는 질문 앞에서요.