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 1

모니터링 습관화하기

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

TroubleShooting 2024.01.11 2

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 2

2022년 11번가 신입사원 최종합격 후기

11번가 신입사원 채용 SW개발직무에 최종합격하므로서 짧았다면 짧았고 길었다면 길었을 나의 2달 반 가량의 취준이 끝이났다. 어떤 마음으로 11번가에 지원을 하게되었고 어떤 프로세스를 거치며 최종합격에 도달할 수 있었는지를 적어보려한다. 11번가에 관심있는 누군가가 이 글을 읽고 도움을 받길 기도하며 부검(?)을 시작해보자. 1. 지원하게된 이유 취준을 시작하며 스스로가 정한 내가 가고싶은 회사에 대한 기준이 있었다. 성장할 수 있는 환경 어느정도의 MAU를 가진 B2C 기업 내부 기술 스택 첫 취준이기도 했고 첫 회사를 잘 들어가 정말 폭발적인 성장을 하고 싶다는 열망이 강했다. 관심있는 기업의 채용이 뜨면 그 회사에 대해 찾아보고 어떤 일을 하며 어떤 문화를 가지고 있는지를 유심히 찾아보곤한다. 11..

회고 2022.01.06 11

@ModelAttribute와 @RequestBody 그리고 Setter

@RequestBody와 Setter 본 주제에 대해 이야기하기 전에 먼저 @ModelAttribute에 대해 이야기해보려합니다. @ModelAttribute 우리는 Spring에서 Reqeust Parameter를 얻기 위해 @ModelAttribute를 사용하곤합니다. 값을 바인딩하여 우리가 원하는 객체로 변환해주는 역할을 하는데 아래와 같이 형식에 맞춰 값이 넘어오면 원하는 객체로 손쉽게 변환할 수 있다는 큰 장점이 있습니다. 물론 타입이나 형식이 안맞으면 TypeConverter에서 예외가 발생함 값을 바인딩하길 원하는 객체인 RequestDto는 name과 age필드 두가지를 가지고 있는데 실제 요청을 postman을 사용해 html-form 형식으로 전달해보겠습니다.(query paramete..

Spring 2021.11.24 4

무중단 배포 자동화

안녕하세요 !! 😜 Nginx를 통한 Reverse Proxy에 이어 길고 길었던! 무중단 배포 자동화에 대해 이야기해보려합니다. 무중단 배포를 위해 작성한 쉘 스크립트에는 3가지가 있습니다. deploy.sh overwrite.sh rollback.sh 본고에서는 먼저 무중단 배포가 무엇인지를 설명드리고 각각의 쉘 스크립트에 대해 설명드리는 순서로 진행하겠습니다. 무중단 배포 무중단 배포란 말 그대로 서버의 중단 없이 배포를 진행하는 것을 의미합니다. 저희는 Nginx를 사용한 Blue-Green Cycle을 통해 무중단 배포를 진행하였는데 평상시 저희 서버는 Nginx에 두 개의 포트를 연결하여 동작합니다. 이제부터 새로운 버전을 배포하는 곳을 Green, 구 버전을 Blue이라 지칭하겠습니다. 무중..

Server 2021.09.17 0

Nginx를 통한 리버스 프록시

안녕하세요! 😄 이번 팀 프로젝트에서 Nginx를 사용한 무중단 배포를 맡아 작업을 진행하고 있습니다. 무중단 배포를 위해 현재 Nginx를 Reverse Proxy로 설정해두었는데 이 글에서는 해당 내용에 관해 이야기해보려 합니다. 먼저, Nginx가 무엇인지?, 그 다음으로 Reverse Proxy와 Forward Proxy의 차이점, 마지막으로 저희 서버에 대해 언급을 하며 글을 마무리하겠습니다. Nginx Nginx는 웹 서버(Web Server)입니다. Apache보다 동작이 단순하고 전달자의 역할만 하기 때문에 동시접속 처리에 특화되어 있는데요. Nginx에서는 동시 접속자가 약 700명 이상이라면 Nginx 환경을 권장한다고 합니다. AWS상에서 시장 점유율이 44%에 가깝고 성능이 좋습니다..

Server 2021.09.17 0

JVM Garbage Collector

JVM의 Garbage Collector 10분 테코톡 - 던님의 "JVM의 Garbage Collector"를 시청하고 작성한 글입니다. 영상링크 JVM이란 Java Virtual Machine으로 운영체제의 메모리 영역에 접근하여 메모리 관리하는 프로그램이다. 메모리 관리, Garbage Collector 역할을 수행한다. Garbage Collector 동적으로 할당한 메모리 영역 중 사용하지 않는 영역을 탐지하여 해제하는 기능을 담당한다. 여기서 말하는 동적으로 할당한 메모리 영역은, Heap을 뜻한다. Heap에는 모든 Object 타입의 데이터가 할당되고 Heap영역의 Object를 가리키는 참조 변수가 Stack에 할당된다. Stack은 정적으로 할당한 메모리 영역으로, Stack에는 원시 ..

테코톡 스터디 2021.07.24 0

검색 기능 만들기(동적쿼리) - Querydsl 사용

현재 Spring Security를 사용하여 로그인, 로그아웃을 구현한 상태이고 인증(로그인)하지 않은 사용자는 게시판에 접속할 수 없도록 구현해놓았다. Controller 파라미터로 page(페이징 변수), category(카테고리별 조회), myPost(내 게시물 보기), searchDto(검색창)를 받는다. 1. page page는 defaultValue를 0으로 설정하였기 때문에 값을 설정하지 않으면 0페이지부터 보여준다. 만약 다음 페이지 버튼을 누르게 되면 현재 페이지에서+1을 한 값이 page 변수에 담기고, 이전 페이지 버튼을 누르면 현재 페이지에서 -1을 한 값이 담긴다. 2. category required 속성을 false로 지정해놓았기 때문에 category 값을 주지 않으면 nul..

게시판 만들기 2021.06.30 0
반응형