Job Job은 Spring Batch의 계층 구조에서 가장 상위에 위치한 개념으로, 하나의 배치 작업 그 자체를 의미한다. Job은 최소 하나 이상의 Step으로 구성되며, Spring Batch가 정의한 Job 인터페이스를 구현해 빈으로 등록 후 배치 작업을 실행시킬 수 있다. JobParamter Job 자체는 동일한 논리적인 작업 그 자체이지만, 해당 Job 자체는 모두 독립적인 실행을 보장해야할 것이다. 예컨대 특정 사용자가 한 해 사용한 카드값을 정산하는 Job이 있다고 가정했을 때, 카드값을 계산하는 로직 자체는 누구에게나 동일할 것이지만 정산을 하는 시점 및 대상 등은 Job을 실행하는 시점에 따라 달라질 수 있다. 이러한 기능을 제공하기 위해서 Spring Batch에선 실제 Job을 실..
분류 전체보기
문제 상황 Spring Batch를 공부하며 이것저것 시험해보던 중, 처음 보는 예외가 발생했다. Caused by: java.lang.IllegalArgumentException: Job name must be specified in case of multiple jobs 여러 개의 Job이 있을 때, Job name이 명시되어있어야한다는 메시지를 뿜었다. 처음엔 이게 Job 객체를 생성할 때 입력하는 name 파라미터에 관한 것이라고 생각하고, 뭔가 명시가 되지 않았거나 중복된 게 있는 것인지 확인했지만 그런 것은 없었다. 원인 원인은 구글링을 통해 쉽게 확인할 수 있었다. 해당 문제는 Spring Boot 3 버전에서부터 Spring Batch 사용 시 업데이트 된 내용 때문이었다. 해당 내용을 정..
동료나 친구들이 23년을 보내며 회고록을 작성하는 것을 봤다. 그들의 자랑스러운 한 해 성취나 노력들을 찬찬히 읽어보면서 내가 한 해동안 이룬 것들은 무언가 초라해보여 쓸까말까를 계속 고민했다. 그러다가 인프런의 많은 회고록들을 읽고 자극을 받아서 그래 뭐 회고록이 별거냐하는 마음으로 가볍게 쓰게 됐다. 일에 대한 회고기술적 과제재작년(22년) 5월에 성공적으로 취준생 신분을 졸업하고, 23년 한 해는 온보딩이라던가 회사 적응이라던가 하는 깍두기 어드벤티지 하나 없이 팀에서 온전히 1인분을 하기 위해 노력한 해였다. 돌아보면 1년 간 내 연차에 비해 굉장히 다양한 과제들을 맞닥뜨렸고, 감사하게도 그러한 문제들을 풀어나가는 과정에 나름 주도적인 역할로 참여하며 동시에 좋은 동료들에게서 많은 것들을 배워나갈..
서론 사내에서 나를 포함한 소수의 사람들에 의해 Spring Boot 3 버전대의 도입이 서서히 준비가 되면서, 관련 의존성이 있는 모듈 및 프로젝트 역시 새 버전과 호환시켜주는 작업이 필요했다. 사실 사내에서 유용하게 사용되고 있는 공통 모듈들은 우리 팀에서 만든 것들이 많았는데, 대부분 내가 직/간접적으로 참여했다거나 혹은 본인이 부트 3 버전 도입에 적극적으로 임한 것을 이유로 어쩌다보니 거의 대부분 내가 하고 있게 되었다. 😂 (물론 너무 좋은 경험이기도 하다) 정식 마이그레이션 가이드를 기반으로 연관있는 클래스들의 변경사항을 참고하여 작업을 진행했고, 와중에 놓친 것들이 있으면 발생하는 예외 로그를 통해 확인하면서 하나씩 고쳐갈 수 있었다. 하지만, 오류 발생 원인을 찾기 힘들었던 상황도 많았고..
우리가 SELECT 쿼리를 실행시킬 때, 해당 쿼리는 FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY 으로 나뉘어져 정해진 순서에 따라서 실행된다. 순서는 아래 그림과 다음과 같다. 1. FROM 먼저, FROM절을 바탕으로 데이터를 읽어올 테이블을 설정한다. 만약 FROM절에 JOIN이 포함되어있다면, 가상 테이블에 JOIN으로 합쳐진 데이터를 결합한다. 2. WHERE FROM절로 가져온 데이터에 대하여 WHERE절에 명시된 필터링을 실행한다. 3. GROUP BY 1, 2 단계를 거쳐 추출된 데이터들을 GROUP BY에 명시된 컬럼을 기준으로 그룹핑한다. 4. HAVING 그룹핑된 데이터에 대하여 HAVING절에 명시된 필터링을 실행한다. 주의점은 WHERE절과..
서론 최근에 사내에서 실시한 기술 세미나 이른바 테코톡에서 테스트 코드를 주제로 발표를 하게되었다. 언제부턴가 테스트 코드가 없으면 불안함을 많이 느끼는 터라 테스트를 잘 짜기 위해선 무엇이 중요할지, 테스트 코드가 가져올 수 있는 긍정적인 영향은 무엇일지에 대해 많은 고민을 해왔었다. 그 과정에서 테스트 코드 리팩토링을 통해 속도, 메모리 등과 관련해 테스트 환경도 개선해보고, 테스트 커버리지 100% 적용, ATDD 등 다양한 경험을 해볼 수 있었다. 하지만 그렇다보니 준비 과정에서 오히려 하고 싶은 말이 너무 많아져서 발표 주제의 방향성이 모호해지는 걸 느꼈다. 그러다가 2023 인프콘에서 이민우님께서 발표하신 "인프런에서는 수천 개의 테스트 코드를 이렇게 다루고 있어요"를 보고 깊은 인상을 받아서..
WireMock? WireMock is a library for stubbing and mocking web services. It constructs an HTTP server that we can connect to as we would to an actual web service. When a WireMock server is in action, we can set up expectations, call the service and then verify its behaviors. https://www.baeldung.com/introduction-to-wiremock WireMock은 Mock API를 구축해주는 라이브러리로써, 외부 API와 통신을 하는 애플리케이션 코드를 테스트하기 위해 주로 ..
문제 상황 사내 프로젝트의 스프링 부트 및 자바 버전을 업데이트하면서 Deprecated된 클래스들 또한 새롭게 업데이트하고 있었다. 그 중, Spring Security의 WebSecurityConfigurerAdpater가 스프링 부트 2.7 버전부터 Deprecated 되었고 이를 대신해 SecurityFilterChain을 사용하도록 권고했다. 교체하는 것 자체는 어렵지 않았다. 기존 WebSecurityConfigurerAdpater를 상속하는 것 대신 SecurityFilterChain 빈을 등록해주면 되는 형태였다. // 기존 @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override p..