Java Stack
Spring Batch Multi-threaded Step 사용 시 chunk 구성에 대한 오해
Spring Batch Multi-threaded Step 사용 시 chunk 구성에 대한 오해
2022.12.16개요 Spring Batch에서는 다양한 병렬 처리 방식을 지원하고 있습니다. AsyncItemProcessor / AsyncItemWriter Multi-threaded Step Parallel Steps Externalizing Batch Process Execution [Spring Batch] 병렬 처리 이 중 Multi-threaded Step 방식에 대해 간단히 설명하고, chunk 구성 관점에서 제가 잘못 이해하고 있었던 부분에 대해 얘기하려 합니다. Multi-threaded Step 방식의 병렬 처리 Multi-threaded Step 방식은 step build 시 `` .taskExecutor()``를 붙여주면, 한 Step 내에서 chunk 단위로 병렬 처리되는 방식입니다. 기존 코드..
[Spring Batch] 병렬 처리 방법 모음
[Spring Batch] 병렬 처리 방법 모음
2022.09.15Spring Batch에서 지원하는 배치 병렬 처리 방식 AsyncItemProcessor / AsyncItemWriter → 한 step 내에서 processor만 병렬 수행해야 할 때 Multi-threaded Step → 한 step 내에서 reader, processor, writer를 chunk 단위로 병렬 수행해야 할 때 Parallel Steps → 여러 step들을 병렬로 수행해야 할 때 Externalizing Batch Process Execution → 외부 remote 서버에서 병렬 수행 필요할 때. (master-worker 모델) Remote Chunking of Step → 스텝 내의 Processor, Writer가 무거운 작업이라 외부 remote 서버들에서 병렬로 돌리고 ..
[Spring Batch] Scoped Bean 초기화 시 생성자 로깅 누락 문제
[Spring Batch] Scoped Bean 초기화 시 생성자 로깅 누락 문제
2022.07.27이 글은 보호되어 있기 때문에 이것을 보려면 암호가 필요합니다.
[Spring Batch] FileItemWriter
[Spring Batch] FileItemWriter
2022.05.16JsonFileItemWriter java docs code `` [ {json object}, {json object}, {json object} ]`` 형식으로 만들 때. 근데 spring-batch-core 4.1 부터 지원이라... 구버전에는 없다. 구버전에서는? 구버전에서는 FlatFileItemWriter를 쓰거나 직접 ItemWriter 작성해야 하는데 그나마 FlatFileItemWriter가 좀 더 고수준이라 이걸 쓰는게 낫다. (덮어쓰기, 기존 파일 존재하면 삭제 등 설정 가능) 근데 문제는 `` [ {json object}, {json object}, {json object} ]`` 형식으로 만들기가 까다롭다는 점이다. (맨 앞과 뒤에 구분자 , 가 들어간다. JsonFileItemW..
[Spring] EventListener
[Spring] EventListener
2022.04.17https://www.baeldung.com/spring-events ``kt ApplicationEventPublisher::publishEvent``로 pub 하고 ``kt @EventListener``로 event 받아 처리하면 된다. 단 여기서 주의해야 할점! listener가 이벤트를 수신하는 것이 왠지 비동기로 이루어질 것 같지만, 기본적으로 동기식이다! 한 스레드가 pub한 다음, 해당 이벤트를 처리해야 하는 EventListener들을 돌면서 동기식으로 직접 리스너를 수행한다. By default, the listener is invoked synchronously. However, we can easily make it asynchronous by adding an @Async annot..
[Java] 양방향 참조 Enum 초기화 순서에 따른 문제 (순환 참조)
[Java] 양방향 참조 Enum 초기화 순서에 따른 문제 (순환 참조)
2022.04.02취급 대상 품목(Good)은 STONE, ALCOHOL, COMPUTER, SHIP, SUSHI 5가지 이고, 이 중 일부는 목적지(Destination) SEOUL, 일부는 BUSAN으로 보내야 한다. 그리고 목적지에 따라, 해당 목적지로 보내는 품목 리스트를 구할 수 있어야 한다. 그러면 아래와 같이 구현 할 수 있는데... @Getter @RequiredArgsConstructor enum Destination { SEOUL, BUSAN; private static final Map goodsByDestination = Arrays.stream(values()).collect(Collectors.toMap( e -> e, e -> Arrays.stream(Good.values()) .filter(v..
[MyBatis] 객체 안의 객체 매핑하기 (ResultMap과 DTO)
[MyBatis] 객체 안의 객체 매핑하기 (ResultMap과 DTO)
2022.03.12객체 안의 객체 매핑하기 https://mybatis.org/mybatis-3/ko/sqlmap-xml.html# - 복잡한 결과매핑 섹션 부터 참조. 읽어 보면 알겠지만, 연관(Association)을 위한 중첩된 Select 는 N+1 Selects problem으로 인해 추천하지 않는다. `` LEFT OUTER JOIN``을 활용한 관계를 위한 내포된 결과(Nested Results) 방법을 사용하는 것을 권장하고 있다 DTO를 사용하면 굳이 객체 안의 객체 매핑 할 필요 없이, DTO에서 flatten해서 받아도 된다. 어차피 쿼리는 `` LEFT OUTER JOIN``을 사용한다면 컬럼을 flatten 해서 가져오게 된다. 따라서 [`` ResultMap - DTO - Model``] 변환의 ..
[MyBatis] Cache
[MyBatis] Cache
2022.03.08간단히 정리하면, MyBatis는 2가지 캐시를 제공한다. local session cache, second level cache second level cache https://idea-sketch.tistory.com/31 mapper namespace 단위로 적용. `` `` 구문. 캐시 설정 파라미터 : 캐시 size, eviction 방식(e.g., LRU), flushInterval 등 session commit 한다고 캐시가 사라지지 않는다. (설정 파라미터에서 눈치 챌 수 있다.) local session cache https://mybatis.org/mybatis-3/java-api.html - Local Cache 항목 참조 https://idea-sketch.tistory.com/30..
Intellij Multi Module Project 구성하기 (with Gradle)
Intellij Multi Module Project 구성하기 (with Gradle)
2022.02.16root proejct 하나에, 그 하위로 sub module 여러 개를 두는 방식이 상호 import하기 좋다. 여러개의 sub module로 나누어서 개발하는 프로젝트라면 하나의 repository를 쓰는 편이 좋은데, 어떤 기능이 어디서 사용되는지 파악하기 쉽기 때문이다. repo가 모듈 단위로 다 나뉘어져 있으면 기능 수정 할 때 이 기능이 어디서 참조되는지 찾아내기 쉽지 않다. 멀티 모듈로 만들기 전에 참고 - https://techblog.woowahan.com/2637/ 여기 나온 사례의 문제점은 common의 의미를, "2개 이상 쓰는 곳이 있다면 common에 넣자"라고 생각해버려서, common이 너무 비대해졌다는 점. common은 모듈 전역적으로 적용되거나 독립 모듈로 구성하기 애매..
테스트 클래스를 일정 수 이상 묶어서 실행하면, 어느 정도 실행하다가 갑자기 JDBC Connection을 무한히 대기하는 현상
테스트 클래스를 일정 수 이상 묶어서 실행하면, 어느 정도 실행하다가 갑자기 JDBC Connection을 무한히 대기하는 현상
2022.01.12``` oracle.net.ns.NetException: Listener refused the connection with the following error: ORA-12519, TNS:no appropriate service handler found. ``` ```sql select * from v$resource_limit where resource_name = 'processes'; ``` 프로세스 수가 최대치에 육박하여 더 이상 요청을 처리할 수 없어 발생하는 문제. 커넥션 풀 close를 제대로 하지 않는 것으로 보임. HikariDataSource(==ConnectionPool)의 maximumPoolSize 기본값은 10인데, 이를 3으로 변경하고 수행하니 커넥션에 여유가 생겨 pendin..
[Kotlin] Kotlin Coroutines (with Spring WebFlux)
[Kotlin] Kotlin Coroutines (with Spring WebFlux)
2021.08.29Kotlin Coroutines 기본적인 개념과 docs kotlinlang.org/docs/coroutines-guide.html#table-of-contents 참고 ) Kotlin Coroutine은 어떻게 동작하는가 - CPS 관련 설명, 자주 하는 질문까지 포함한 좋은 발표 자료 참고 ) 어떠한 코루틴이 발동될 때 마다 해당 코루틴은 이전에 자신의 실행이 마지막으로 중단되었던 지점 다음의 장소에서 실행을 재개한다. Kotlin의 Coroutine은 suspend 키워드로 마킹된 함수를 CPS(Continuation Passing Style)로 변환하고, 이를 Coroutine Builder를 통해 적절한 스레드 상에서 시나리오에 따라 동작하도록 구성됩니다. 주의해야 할 점은 suspend fun..
[Java] Jackson 프로퍼티명 snake_case <-> camelCase 변환
[Java] Jackson 프로퍼티명 snake_case <-> camelCase 변환
2021.08.01Jackson ObjectMapper 변환 https://stackoverflow.com/questions/10519265/jackson-overcoming-underscores-in-favor-of-camel-case A. @JsonProperty 애너테이션으로 각 필드에 명시해주는 방법 [Java] Jackson ObjectMapper Serialization 좀 귀찮지만, 줄임말 등을 내부 컨벤션에 맞는 이름으로 바꿔줄 수 있어서 오히려 유용할 수 있음. B. 각각의 data class에서 @JsonNaming 애너테이션으로 어떤 이름 변환 사용할지 명시해 주는 방법 ```java @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) ``` C...