Java Stack
spring-webmvc 에서 SpringBoot로 단계별로 전환하기
spring-webmvc 에서 SpringBoot로 단계별로 전환하기
2023.04.01전환 사유 대부분의 가이드, docs, 자료가 SpringBoot를 전제하고 있어 mvc 프로젝트 유지보수 시 불필요하게 리소스가 낭비되는 부분이 있음. @MockBean, @SpyBean 등 SpringBoot의 TC 지원 애너테이션을 사용 할 수 없어 TC 작성 효율이 떨어지고 보일러플레이트 작성에 대한 진입장벽 높음. SpringBoot로 전환하는게 장기적으로 유지보수비용이 더 세이브 될 것 같아 전환 결정. As-is spring-webmvc 4.3.4.RELEASE 외장 tomcat maven jsp 코드 다수 폴더 기반 deploy (war 사용하지 않고 디렉터리 전체를 배포) 단계별로 전환하기 jsp 페이지가 많이 존재하는데, 스프링부트 내장 톰캣은 jsp를 빌트인으로 지원하지 않음. jas..
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 이 중 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하기 좋다. 멀티 모듈로 만들기 전에 참고 - https://techblog.woowahan.com/2637/ 여기 나온 사례의 문제점은 common의 의미를, "2개 이상 쓰는 곳이 있다면 common에 넣자"라고 생각해버려서, common이 너무 비대해졌다는 점. common은 모듈 전역적으로 적용되거나 독립 모듈로 구성하기 애매한 것들만 넣고, (비즈로직이 아닌 것) 나머지는 비즈니스 로직 별로 독립 모듈로 쪼개야 common이 비대해지는 것을 막을 수 있다. plasma-benefit/posts/485 이 사례도 참고해볼만 하다. https://share.navercorp.com/neday2022/le..
테스트 클래스를 일정 수 이상 묶어서 실행하면, 어느 정도 실행하다가 갑자기 JDCB Connection을 무한히 대기하는 현상
테스트 클래스를 일정 수 이상 묶어서 실행하면, 어느 정도 실행하다가 갑자기 JDCB 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..