Spring Batch Partitioner를 이용한 최적화
·
spring
단일 스레드 방식의 한계점외부 서버 API로부터 데이터를 받아와 DB에 적재를 해야한다고 하자API 서버에 데이터를 요청할 때 모든 데이터가 아닌 page 단위로 요청해야하는 상황이라면 단건씩 요청을 해야한다.만약 페이지 수가 1000개라면, 단일 스레드에서 1000개 페이지에 데이터를 요청하고, 데이터베이스에 적재해야한다.위 작업을 단일 스레드에서 실행하면 모든 작업을 순차적으로 처리하기 때문에 페이지가 많을 수록 대기시간이 오래걸린다. 이를 해결해 줄 수 있는 방법은 Partitioner를 사용하여 멀티 스레드로 처리하는 것이다.구조파티셔너는 Step이 각 스레드에 배정되어 실행될 수 있도록 분배하는 역할이다.구체적인 분배 방법은 Partitioner 인터페이스를 구현하여 정의할 수 있다.방법파티셔너..
AOT(Ahead-Of-Time) 컴파일을 하면 얼마나 빠를까?
·
spring
최근 스프링 발표 세션을 듣거나 블로그들을 돌아다니다 보면 GraalVM에 대해서 언급한다. 공통 내용 중 한 가지는 GraalVM의 기능 중 AOT 컴파일러를 이용하면 Native 이미지 또는 실행 파일을 생성할 수 있게 도와준다고 한다. 즉, JIT을 사용하여 바이트코드를 매번 기계어 코드로 변환하는 것이 아닌 해당 머신의 기계어 코드를 바로 실행시킬 수 있게 하는 것이다. 이번 포스팅에서 자세한 내용을 다루기보다는 얼마나 빠른지 체감을 할 수 있는 정도이다. (자세한 내용은 다른 블로그에서 잘 설명하고 있다.) Native 빌드 방법 Gradle GraalVM 플러그인을 사용하면 Native Image를 만드는 방법 말고도 Native 실행 파일을 직접 만들 수 있게 제공한다. 스프링 공식 문서를 ..
Spring REST Docs 필수값 표현하기 + Tip
·
spring/테스트
아무런 설정없이 문서를 작성하면 요청 파라미터나 요청 헤더 값에 대한 설명은 작성할 수 있지만 필수값(Required) 표현이 안 되었다. 그 이유는 기본적으로 제공되는 스니펫 규격이 정해져있기 때문이다. default-request-headers.snippet 파일 |=== |Name|Description {{#headers}} |{{#tableCellContent}}`+{{name}}+`{{/tableCellContent}} |{{#tableCellContent}}{{description}}{{/tableCellContent}} {{/headers}} |=== 스니펫들 중 하나를 선택해 읽어보면 name, descripton 속성만 있는 것을 확인할 수 있다. 필수값을 표현할 수 있는 방법을 알아보던..
JPA에서 Bulk insert 사용하기
·
spring
Spring Data JPA에서는 컬렉션을 저장하는 메서드를 지원하고있다. 해당 메서드를 사용해 컬렉션을 저장하면 데이터가 단건씩 INSERT되는 문제가 있다. 데이터가 적다면 문제가 없겠지만 대량의 데이터가 단건씩 저장되면 네트워크, DB 비용이 많이 발생할 수 밖에 없다. 이 문제를 해결하기 위해서 2가지 방법이 존재한다. 쿼리를 직접 작성 BatchSize 사용 1번 방법도 좋지만.. 귀찮기도하고 JPA Repository를 그대로 사용하고 싶다면 2번 방법이 좋을 것 같다. 배치 사이즈를 사용하는 방법은 다음과 같다. hibernate batch size 프로퍼티 값 설정 배치사이즈 만큼 묶어 전달 JDBC reWriteBatchedInserts 파라미터 옵션 활성화 배치사이즈 만큼의 INSERT..
noose
'Spring' 태그의 글 목록