분류 전체보기 513

Spring Batch 성능 개선기(병렬처리)

최근 회사에서 프로젝트를 진행하며 사용했던 Spring Batch 성능 개선기를 기록해보려합니다. 먼저, 간략하게 배치가 어떤 흐름으로 동작하는지를 알아보면 1. 대상 상품 조회(Reader)대상 2. 상품중 비즈니스 로직으로 필터링(Processor) 3. api 호출 및 결과 db 저장(Writer) 와 같이 동작하고 있습니다. 1. 병목 지점 찾기 위 프로세스로 동작하는 프로토타입 레벨의 배치는 대상 상품 30 ~ 40만개 기준 4시간 ~ 6시간 정도가 소요되고 있었습니다. 별도의 커스텀한 설정을 따로 하지 않았기 때문에 싱글 쓰레드 기반으로 동작할 것이고 하나씩 순차적으로 처리되고 있습니다. step을 분리하여 병목지점을 분석한 결과는 다음과 같은데요. Mongo DB 단건 저장 3번의 api c..

TroubleShooting 2024.04.05

모니터링 습관화하기

최근들어 근무시간에 틈이 날때마다 서버 모니터링을 습관화하려고 모니터링 솔루션을 이용해 자주 들여다보곤한다. 우리가 기대하는 서버의 히트맵은 아래와 같지만, 특정 API, 특정 로직, 특정 쿼리에 병목지점이 있다면 아래와 같이 히트맵이 위로 튀곤한다. 이걸 분석해서 병목지점을 해소하고 원인을 파악하는 재미가 은근 쏠쏠하다고 느꼈다. 대부분의 경우에는 정말 간단한 휴먼 에러의 경우가 많은 것 같은데, 이런 것들을 잡아내기 어려운 이유가 간헐적으로 발생하며 서버 모니터링을 주기적으로 하지 않는 이상 병목 지점이라는 것조차 느끼기 힘든 것 같다. 서버에 대해 에러 응답 비율이 높아지면 알림을 받을 수 있도록 별도의 설정을 하더라도 간헐적으로 발생하기 때문에 방치되는 경우가 많다. 실제로 모니터링 중 발견한 간..

TroubleShooting 2024.01.11

HttpMessageConverter 우선순위(feat. AWS S3)

최근 회사에서 특정 API에 Spring Interceptor를 통해 HTTP Request를 JSON으로 파싱하고 S3에 업로드하는 로직을 수정하는 작업을 진행했다. 로직의 흐름은 간단하다. Interceptor의 afterCompletion 메서드에서 요청이 성공했냐 실패했냐에 따라 다른 S3 경로에 업로드하기만 한다. 물론, 우리는 모든 요청은 JSON으로 반환될 것임을 기대하였고 ObjectMapper를 통해 RequestBody를 JSON으로 변환하는 로직을 내부에 추가하였다. JSON으로 값이 반환될 수 있도록 @RequestMapping(value = "/something", produces = {MediaType.APPLICATION_JSON_VALUE}) produce를 통해 반환될 값을..

Spring 2023.10.31

Project Reactor의 Scheduler

Scheduler Project Reactor에서 Scheduler란 Thread를 관리하는 역할을 담당한다. Project Reactor는 동시성에 구애받지 않고 개발자가 이를 직접 동제할 수 있다. 개발자가 이를 직접 통제할 수 있도록, 복잡한 멀티쓰레딩을 손쉽게 사용할 수 있도록 Scheduler가 도와준다. Project Reactor는 일반적으로 호출된, 즉 subscribe()가 호출된 쓰레드에서 동작을 수행한다. 🤔무슨의미? 위 사진과 같은 상황에서 새로운 쓰레드에서 subscribe()를 호출하고 있기 떄문에 메인 쓰레드가 아닌 호출된 새로운 쓰레드에서 동작을 수행한다. Scheduler의 종류 reactor.core.scheduler 하위에는 Scheduler 인터페이스를 구현한 여러 구..

2보 전진을 위한 1보 후퇴

평생 아르바이트 한번 제대로 해본 적 없던 내가 사회인으로서, 내가 꿈꾸던 개발자로서의 1년이 지났다. 2022년이 지나기 전에 올해 나를 되돌아보며 26살의 나를 보관해두고 싶다. 올해 정말 많은 일이 있었다. 졸업했으며 취직을 했고 좋은 사람들을 만났으며 행복했다. 어린 시절 내 아버지는 나에게 “후회하지 않는 삶을 살아야 한다. 후회될 선택을 했더라도 그 선택에 책임을 지고 후회되지 않는 선택으로 바꿔야 한다”라고 말해주셨다. 올해는 나에게 후회일까? 사람 올해 나에게 가장 먼저 떠오르는 단어는 “사람”이다. 1년 동안 좋은 사람을 많이 만났다. 항상 입버릇처럼 나는 운이 좋은 사람이라고 말하곤 하는데 그중에서도 나는 인복이 좋다. 좋은 사람들은 나에게 큰 힘이 되었고 행복을 가져다주었다. 정체성 ..

잡담/회고 2022.12.30

입사 첫 프로젝트 회고

😉 할만한데? 팀에 배치된지 얼마 되지 않았을 무렵 요구 사항이 팀으로 들어왔고 간단한 서비스였기 때문에(현재는 실 서비스가 아닌 사내에서 사용) 팀장님께서 업무 프로세스도 익힐 겸 사수님, 동기와 함께 프로젝트를 진행해보라고 하셨다. 진행될 프로젝트에 대한 기획 및 설계를 들으면서 처음에 들었던 생각은 "어? 할만한데?"였다. 간단히 프로젝트에 대해 설명하자면, DB 데이터에 대해 특정 Event가 발생하면 Kafka로부터 메시지가 발행되고 이를 Consume하여 서비스 로직을 수행하는 프로젝트이다. Event가 발생했을 때 특정 Topic으로 Kafka가 메시지를 발행하는 부분은 이미 다른 곳에서 구현되어 있어 이를 Consume하는 부분만 신규 프로젝트에서 만들면 됐기 때문에 크게 어려울 것 같지 ..

잡담/회고 2022.05.14

yml에서 List Object 사용법

yml에서 변수를 리스트 형식으로 사용하는 법 로컬환경, 개발환경, 상용환경으로 환경을 분리할 때, yml에 변수를 넣어두고 코드에서 불러와 사용하는 방법을 흔히 사용하곤 한다. person: name: '민철' 이런 방식으로 말이다. 사용하는 쪽에서는 아래와 같다. @Value("${person.name:}) private String name; 추가적으로 yml은 List나 Map과 같은 다양한 데이터 유형을 지원하고 있다. programming: language: - C - Java - Python - JavaScript 이를 가져오려면 @Value("${programming.language[0]:}") private String language; // C @Value("${programming.l..

Spring 2022.04.29

Spring Kafka를 사용해 Slack에 메시지 보내기

🚀 들어가며 입사 후, 첫 업무로 Spring과 Kafka를 연동하고 특정 이벤트에 따라 Slack에 알림을 보내는 일을 맡게되어 학습을 목적으로 간단한 애플리케이션을 만들어 보았다. 나는 이번 계기로 Kafka를 처음 사용해보았기 때문에 내가 구현한 방법이 맞다고 확신할 수 없다. 단순 학습 목적임을 염두해주길 바란다. ⚙️ 환경 java 17 Spring Boot 2.6.4 Spring Web Spring Kafka lombok jackson ✨ Slack Incoming Webhooks 먼저, 슬랙에 메시지를 보내기 위해 Incoming Webhooks라는 슬랙 앱을 사용하였다. 메시지를 전송할 채널의 세부정보로 들어가 앱 추가를 클릭한다. Incoming Webhooks을 슬랙 채널에 설치하면 아..

Spring/Spring Kafka 2022.03.23

Spring Batch Architecture

JobLauncher: Job을 실행시키는 컴포넌트 Job: 배치 작업 JobRepository: Job 실행과 Job, Step을 저장 Step: 배치 작업 단계 ItemReader, ItemProcessor, ItemWriter: 데이터를 읽고 처리하고 쓰는 컴포넌트 Application Layer: 비즈니스 로직이 존재, 사용자의 코드 Core Layer: 배치 작업을 시작하고 제어하는데 필수적인 클래스 Job, Step, JobLauncher Infrastructure Layer: 외부와 상호작용 ItemReader, ItemWriter, RetryTemplate Job 전체 배치 프로세스를 캡슐화한 도메인 Step의 순서를 정의 JobParameters를 받음 JobExecution이 실제 실행..

Spring/Spring Batch 2022.02.20

Spring AOP

Aspect 공통적인 부가 기능인 횡단 관심사를 위해 만들어진 것이 바로 Aspect이다. Aspect는 관점이라는 뜻인데, 애플리케이션을 바라보는 관점을 각각의 기능에서 횡단 관심사 관점으로 본다는 의미이다. 이렇게 횡단 관심사를 처리하는 Aspect를 사용한 프로그래밍 방식이 AOP(Aspect Oriented Programming)!! 이는 객체 지향을 대체하는 것이 아닌 OOP만으로 처리하기 어려운 횡단 관심사를 보조하기 위한 목적을 가지고 있다. Spring이 제공하는 Advisor, Advice, Pointcut 또한 하나의 Aspect라고 볼 수 있다. AOP AOP의 가장 핵심 아이디어는 횡단 관심사를 분리하여 한 곳에서 관리하도록 하는 것이다. AOP 적용 방식 AOP에서 횡단 관심사를 ..

반응형