전체 글

서버는 꺼지지 않아요
· 언어/JAVA
종종 필요하지만 그때마다 매번 까먹어서 검색하게되는 동시성 검증을 위한 테스트 코드 작성법을 정리해보자. 동시성 검증 테스트 코드의 개념은 간단하다. 1. 검증하고자 하는 메서드를 별개의 스레드에서 동시에 실행시킨다. 2. 실행시킨 스레드의 모든 작업이 끝날 때까지 기다린다. 3. 결과를 확인하다. java.util.concurrent 패키지에 존재하는 클래스들을 적절히 사용하여 위 작업들을 수행할 수 있다. 책의 개수를 카운트하는 간단한 예제 코드를 만들어보자. @Service public class BookCountService { private int count; public void setCount(int count) { this.count = count; } public int getCount(..
· 개발자취
서론 입사 후 가장 많은 커밋을 남긴 프로젝트라고 한다면 역시 PHP 기반 레거시 코드를 Java + Spring Boot 기반 프로젝트로 마이그레이션 한 메일 API가 되겠다. 비슷한 시기에 개발된 모바일 애플리케이션에서만 선제적으로 배포되어 다소 시험적으로 운영되던 해당 프로젝트는 이제 정말 웹 환경에서의 본격적인 릴리즈를 앞두고 있다. (두근두근) 릴리즈가 얼마 남지 않은 현 시점에서, 프로젝트 중 가장 많은 트래픽을 받을 것으로 예측되는 엔드포인트의 쿼리가 어떤 식으로 개선되어왔는지 정리하고자 한다. 참고로 사내 메일 데이터는 MySQL 데이터베이스에서 관리되고 있으며, 본문에 작성되는 코드들은 모두 예시를 위해 임의로 작성되었음을 알린다. 문제상황 메일 API에서 가장 많은 트래픽을 받는 엔드포..
서론 서버 성능 향상을 위해 쿼리를 튜닝할 일이 잦아지면서, 최근에는 아무리 간단해보이는 쿼리라도 explain을 통해 실행 계획을 반드시 살펴보는 습관이 생겼다. 실행 계획에서 확인할 수 있는 정보는 매우 다양한데, 그 중 Extra 컬럼에 나오는 Using temporary와 Using filesort은 가능한 제거할 수 있도록 해야한다는 말을 동료 및 선임 개발자분들에게 많이 들었다. 해당 키워드가 대략적으로 무엇을 의미하는지는 느낌적으로 이해하고 있었지만, 왜 발생하는지 그리고 정확하게 무엇을 의미하는지 정리해보고자 한다. MySQL의 정렬 방식 Using Temporary와 Using filesort는 모두 MySQL의 데이터 정렬 방식과 연관이 있다. MySQL이 조회한 데이터를 정렬하는 방식..
서론 사내 레거시 시스템 문제로 인해 DBCP(HikariCP)를 사용하는 프로젝트에서 잦은 오류 및 경고 메시지가 발생했던 적이 있다. 경고 메시지는 대부분 아래와 같았다. Failed to validate connection... Possibly consider using a shorter maxlifetime value. 해당 문제의 원인 파악을 위해 많은 서치를 했었고 결국엔 해결했었는데, 최근에 동료 개발자분께 동일한 문제가 발생하여 원인 및 해결책을 설명해줬다. 생각난김에 해당 내용을 다시 정리해보고자 한다. 해당 내용은 Spring Boot에서 HikariCP를 사용해 MySQL 서버와의 커넥션을 맺는 상황을 전제로 작성된다. HikariCP의 connection max lifetime H..
· 웹/Spring
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 버전 도입에 적극적으로 임한 것을 이유로 어쩌다보니 거의 대부분 내가 하고 있게 되었다. 😂 (물론 너무 좋은 경험이기도 하다) 정식 마이그레이션 가이드를 기반으로 연관있는 클래스들의 변경사항을 참고하여 작업을 진행했고, 와중에 놓친 것들이 있으면 발생하는 예외 로그를 통해 확인하면서 하나씩 고쳐갈 수 있었다. 하지만, 오류 발생 원인을 찾기 힘들었던 상황도 많았고..
SeongOnion
조무래기 코딩