Spring 112

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

입사 첫 프로젝트 회고

😉 할만한데? 팀에 배치된지 얼마 되지 않았을 무렵 요구 사항이 팀으로 들어왔고 간단한 서비스였기 때문에(현재는 실 서비스가 아닌 사내에서 사용) 팀장님께서 업무 프로세스도 익힐 겸 사수님, 동기와 함께 프로젝트를 진행해보라고 하셨다. 진행될 프로젝트에 대한 기획 및 설계를 들으면서 처음에 들었던 생각은 "어? 할만한데?"였다. 간단히 프로젝트에 대해 설명하자면, 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에서 횡단 관심사를 ..

@Aspect AOP

Spring에 @Aspect 애노테이션을 사용하면 이것이 Advisor 생성 기능을 지원한다. @Aspect는 AspectJ에서 제공하는 애노테이션으로 스프링은 이를 사용해 AOP를 가능케한다. 코드로 살펴보자 @Aspect : 프록시를 적용하기 위한 애노테이션 @Around : Pointcut을 위한 애노테이션, 인자로 AspectJ표현식을 넣는다. @Around가 붙은 메서드가 바로 Advice이다.(여기서는 execute) ProceedingJoinPoint : MethodInvocation과 유사하다. 내부에 실제 호출 대상(target), 전달 인자, 어떤 객체와 어떤 메서드가 호출되었는지에 대한 정보가 포함되어 있다. proceed() : target 호출 이렇게 만들어진 프록시를 스프링 빈으..

빈 후처리기

빈 후처리기란?(BeanPostProcessor) @Bean이나 컴포넌트 스캔으로 스프링 빈을 등록하면 스프링은 대상 객체를 생성하고 스프링 컨테이너 내부의 빈 저장소에 등록한다. 그 이후에는 등록된 빈을 조회하고 사용할 수 있게된다. 스프링이 빈 저장소에 등록할 목적으로 객체를 생성하는데(Singleton) 등록 직전에 조작하고 싶을 때 사용하는 것이 바로 빈 후처리기!! 즉, 빈을 생성한 후에 무언가를 처리하는 용도로 이해하자! 빈 후처리기 기능 객체를 조작 다른 객체로 바꿔치기 빈 후처리기 과정 생성 : 스프링 빈 대상이 되는 객체를 생성 전달 : 생성된 객체를 빈 후처리기에 전달 후 처리 작업 : 빈 후처리기가 스프링 빈 객체를 조작 등록 : 스프링 컨테이너의 내부 저장소에 빈 객체 등록 Bean..

반응형