분류 전체보기
-
[Spring] Spring 6.2 + ShedLock 2.1.0 호환성 이슈 추적기Study/우당탕탕 2026. 3. 27.
분산 환경에서 @Scheduled 작업을 운영할 때가장 먼저 부딪히는 문제 중 하나는 동일 작업의 중복 실행이다. 애플리케이션이 여러 인스턴스로 실행되는 환경에서는 같은 스케줄이 각 노드에서 동시에 수행될 수 있고,이때 배치 중복 실행이나 데이터 정합성 문제가 발생할 수 있다. 이 문제를 해결하기 위해 많이 사용하는 라이브러리 중 하나다 ShedLock이다.ShedLock은 스케줄러 자체를 대체하는 도구가 아니라,동일한 작업이 동시에 실행되지 않도록 외부 저장소(DB, Redis 등)에 lock을 기록해 제어하는 라이브러리이다.같은 이름의 lock이 이미 잡혀 있으면 다른 노드는 기다리지 않고 해당 실행을 건너뛴다. 그런데 이번에 Spring Boot 3.x + ShedLock 2.1.0 조합으로 일부 ..
-
Spring Batch 6 - DB 테이블 정리Study/Spring 2026. 3. 12.
Spring Batch를 처음 적용하면 BATCH_* 테이블이 먼저 눈에 들어온다. 처음에는 이런 생각이 들 수 있다.배치는 그냥 Job만 실행하면 되는 것 아닌가?왜 별도의 메타데이터 테이블까지 필요할까? Spring Batch는 단순히 메서드를 한 번 호출하는 도구가 아니다.실행 이력, 재시작 가능 여부, Step별 처리 현황, 실행 중 상태값까지 함께 관리하는 배치 프레임워크다. 이때 이런 정보를 저장하는 중심 저장소가 JobRepository이며,공식 문서도 JobRepository를JobExecution, StepExecution 같은 persisted domain object의 CRUD를 담당하는 핵심 구성요소로 설명한다. 즉, BATCH_* 테이블은 단순 로그 테이블이 아니라,Spring B..
-
Spring Batch 이력이 저장이 되지 않는다..?Study/우당탕탕 2026. 3. 11.
스케줄러를 통해 Job은 실행되었고,Reader / Processor / Writer 로그도 정상적으로 찍혔다. 그런데 정작 DB의 Spring Batch 메타 테이블에는 실행 이력이 남지 않았다. Spring Batch 공식 문서에 따르면,메타데이터 테이블은 JobInstance, JobExecution, StepExecution, JobParameters 같은 배치 도메인 객체와 매핑되며,이를 저장하는 주체는 JobRepository 라고 명시되어 있다. 즉, 이 테이블에 값이 안 들어간다면,단순히 "실행이 안 됐다"라기 보다 어떤 JobRepository를 쓰고 있는지를먼저 의심해야 한다.원인 : Spring Batch 6의 기본 배치 인프라 변경핵심 원인은 Spring Batch 6의 기본 동작 ..
-
[테스트 코드] 레거시 코드에 테스트 코드 도입하기생각정리 2026. 3. 6.
테스트 코드의 중요성에 대해서는 많은 글이 있다.하지만 대부분의 글은 새로운 프로젝트를 기준으로 이야기한다. 현실의 많은 서비스는 그렇지 않다. 이미 오래 운영된 시스템,테스트 코드가 없는 코드베이스,그리고 테스트 환경이 준비되지 않은 상태. 내가 참여한 프로젝트도 비슷한 상황이었다.기존 코드에는 테스트 코드가 거의 없었고테스트용 DB 환경도 따로 존재하지 않았으며Service 로직은 Repository와 강하게 연결되어 있었다이런 상황에서 자연스럽게 이런 질문이 생겼다.지금 이 상태에서 테스트 코드를 시작하는 것이 가능할까? 정답을 알고 시작한 것은 아니었다.다만 지금 환경에서 할 수 있는 것부터 시작해보기로 했다.테스트 코드가 없는 시스템에서 생기는 문제테스트 코드가 없는 환경에서는 코드 변경이 항상..
-
[테스트 코드] Why?생각정리 2026. 3. 5.
최근 회사 프로젝트에 테스트 코드를 도입해보자는 이야기를 꺼냈다. 생각보다 반응은 명확하게 갈렸다.찬성 의견테스트 코드는 필요하다장기적으로 안정성이 좋아질 것이다.반대 의견개발 기간 안에 테스트까지 작성할 수 있을까지금도 할 일이 많은데 작업이 더 늘어나는 것 아닌가유지보수 부담이 커지지 않을까사실 이 반응은 매우 자연스럽다고 생각한다. 테스트 코드가 중요하다는 것은 대부분 알고 있지만,현실적인 비용이 먼저 떠오르기 때문이다. 그래서 스스로에게 다시 질문을 던져봤다.우리는 왜 테스트 코드를 작성해야 할까?테스트 코드 없이 개발한다는 것테스트 코드가 없는 상태에서 개발을 하다 보면 자연스럽게 이런 상황을 경험하게 된다. 코드를 수정하거나 새로운 기능을 추가할 때마다이런 고민을 반복하게 된다.이 기능을 바꾸..
-
k3s + Nginx Ingress Controller 구성기Projects/ToDoLab 2026. 2. 24.
이전에 단일 EC2 환경에 k3s를 설치하여 Kubernetes 기반 배포 구조를 구성했다. EC2 단일 노드에 k3s로 쿠버네티스 구성해보기1. 컨테이너(Container)는 무엇인가? 컨테이너는 애플리케이션과 실행 환경을 함께 묶은 실행 단위다.과거에는 애플리케이션을 실행하기 위해OS 버전라이브러리런타임(JDK, Node, Python 등)설정 파일을d1tt0.tistory.com이전 글에서는 컨테이너 개념부터 시작하여 k3s 설치 및 기본 구성까지 진행했다.이번 글에서는 그 위에Nginx Ingress Controller를 구성하고, HTTP 라우팅 구조를 정리해보고자 한다. 이전 글에서 k3s를 선택한 이유를 간단하게 정리했었지만,이번에 다시 한 번 정리하면서 집고 넘어가려 한다. k3s 선택 ..
-
ResponseEntity 를 왜 쓰는 걸까?Study/Theory 2026. 2. 23.
시작은 단순했다. Controller의 반환 타입은 String이어도 되고, Integer, DTO여도 된다.Spring은 이를 자동으로 JSON으로 직렬화하고, 기본적으로 200 OK와 함께 내려준다. 그런데 우리는 습관처럼 이렇게 작성한다.return new ResponseEntity.ok(data); 처음에는 그냥 그러려니 했다. 그런데 문득 이런 생각이 들었다.굳이 한 번 더 감싸는 이유가 뭘까?그냥 객체를 반환하면 안 되는 걸까?한 번 정리해보자.ResponseEntity는 무엇인가?ResponseEntity는 Spring에서 제공하는 HTTP 응답을 표현하는 객체다. 조금 더 정확히 말하면,HTTP Response 전체(상태 코드 + 헤더 + 바디)를 담는 컨테이너다. 구조적으로 보면 다음 세..
-
EC2 단일 노드에 k3s로 쿠버네티스 구성해보기Projects/ToDoLab 2026. 2. 5.
1. 컨테이너(Container)는 무엇인가? 컨테이너는 애플리케이션과 실행 환경을 함께 묶은 실행 단위다.과거에는 애플리케이션을 실행하기 위해OS 버전라이브러리런타임(JDK, Node, Python 등)설정 파일을 서버마다 직접 맞춰야 했다.컨테이너는 이런 문제를 해결한다.“이 애플리케이션은 이 환경에서 실행된다”를 하나의 단위로 묶어버리는 방식이다. 컨테이너의 특징빠른 실행OS 전체를 포함하지 않아 가볍다환경 차이로 인한 문제 최소화2. Docker는 무엇인가?Docker는 컨테이너를 만들고 실행하는 도구다.컨테이너 이미지 생성컨테이너 실행 / 중지로컬 개발 환경 구성등을 쉽게 만들어준다.Docker 덕분에 개발자는:“내 로컬에서는 잘 되는데요?” 문제를 크게 줄일 수 있다.하지만 Docker만으로는..