pooney
article thumbnail
[Spring-Batch] Multi-threaded Step을 이용한 병렬 처리
Spring boot/spring-batch 2024. 12. 16. 21:33

안녕하세요. 오늘은 대용량의 데이터를 빠르게 처리 하기 위해 배치를 구성해야 하는 경우가 많은데요. 이러한 병렬처리가 를 하기 위한 Multi-Threaded Step 방식에 대해서 알아 보려고합니다.       Multi-Threaded Step 하나의 Step에서 멀티스레드를 사용해 ItemReader, ItemProcessor, ItemWriter를 병렬로 실행해 동일한 데이터 소스를 여러 스레드가 동시에 일고 처리 하는 기능을 제공합니다.   즉 Multi-threaded Step은 단일 Step에서 여러 쓰레드를 병렬로 실행하여 작업을 처리하는 방식입니다. 자세한 설명은 아래의 Spring docs에 자세히 설명 되어 있으니 참고해 보는 것도 좋을 것 같습니다.    https://docs.sp..

article thumbnail
[Spring-Batch] Partitioning을 이용한 대량의 데이터 처리
카테고리 없음 2024. 12. 16. 21:27

안녕하세요. 오늘은 Spring Batch를 이용한 Partitioning에 대해서 작성해 보려고 합니다. 프로젝트를 진행하면서 대용량의 데이터를 처리해야 할 일이 발생을 했는데요.  대용량을 빠르게 처리 하기 위해서 흔히 병렬적으로 처리하는 방법을 사용하는 경우가 많습니다. 병렬적으로 처리 하기 위해 대표적인 Scalling 기능인  Multi-Threaded Step 방식도 많이 생각 하실 겁니다. 하지만 이번에는 Partitioning 기능을 이용한 방법에 대해서 알아 보려고  합니다.        Partitioning데이터를 물리적으로 분할하여 각 파티션을 별개의 Step으로 처리하는 방식입니다. 각 파티션은 독립적으로 실행되며, 멀티스레드 환경 또는 클러스터링 환경에서 실행될 수 있도록 제공하..

article thumbnail
[Spring-boot] HikariCP 커넥션 누수
Spring boot 2024. 12. 15. 15:52

안녕하세요. 오늘은 커넥션 누수의 대해서 알아 보려고 합니다.  제가 커넥션 누수에 대해서 작성을 하게 된 이유는 프로젝트를 진행 하면서 과도하게 CPU을 사용하는 현상이 발생을 했는데요. 로그를 확인 해도 정말 알 수 가 없었고 서버가 중단 될 지경까지 가는 아찔한 순간이 있었는데요. 해당 프로젝트는 외부에서 진행 했었던 프로젝트인 만큼 알고 있는 정보도 많지 않아 정말로 이유를 찾기 힘들었지만 원인을 찾는 과정을 하나씩 기록하며 후에 빠르게 대처하기 위해 작성을 하게 되었습니다.     우선  아래와 같이 해당 서버의 CPU사용률이 굉~장히 높은 현상이 발생했습니다. 무려 각 CPU가 100% 힘으로 계속 동작하고 있었습니다.             정말 놀라웠습니다..!!! 이런건 지금까지  본 적이..

JPA - 1차캐시 동작 조건
JPA 2024. 7. 20. 21:45

안녕하세요 프로젝트르 진행하면서 JPA의 강력한 기능인 중 하나인 1차 캐시가 언제 동작하는 지 잘 모르는 고 사용하시는 분들이 존재해서 한번 작성하게 되었습니다. 1차 캐시이 무엇인지에 대한 설명은 많은 분들이 잘 작성하셨기 때문에 간단하게 설명하고 "언제 동작하는가?" 에대해서 설명을 하고자합니다.     1차 캐시란?  JPA하면 1차 캐시를 빼놓을 수가 없는데요 성능적으로 많은 이점을 가지고 갈 수 있는 강력한 기능이라고 생각합니다. 1차캐시는 영속성 컨텍스트에 Entity를 보관을 하는데 보관시 @Id를 기반으로 보관을 합니다.  때문에 JPA는 우선 1차캐시를 확인하여 해당 Entity가 있는지 여부를 확인 하고 있다면 캐시에서 가져다 사용을 하고 없다면 DB에 쿼리를 날려 해당 데이터를 가지..

article thumbnail
[Spring-Boot] SecureRandom 난수 생성시 Freeze 문제
Spring boot 2024. 7. 18. 22:02

프로젝트를 진행하면서 이용권 기능이 필요했습니다. 때문에 이용권에 맞게 난수 생성이 필요했고 안전한 난수를 어떻게 생성 할 수 있을까? 찾던 중에 SecureRandom 을 발견했습니다. 많이 들 사용하는 단순 Random의 경우 현재 시간을 시드로 사용하기 때문에 완벽한 무작위가 아닌 '의사난수' 가 생성 되기 때문에 목적에 부합하지 않았습니다. 그렇게 검색 도중 의사 난수가 아닌 확실하고 안전한 난수 생성을 도와주는 SecureRandom을 발견 하게 되었습니다.  이러한 SecureRandom 을 사용하면서 발생했던 이슈를 공유 해보려고 합니다.       SecureRadom는 어떻게 난수를 생성 할까? 시스템 시간을 시드로 해서 난수(?)를 생성하는 Random과 달리 OS에서 임의 데이터를 가..

article thumbnail
[Spring-boot] Mattermost Bot 사용
Spring boot 2024. 4. 24. 14:05

log-back을 이용하여 에러로그를 추적하는 경우 해당 메시지들은 로그 추적을 위해 만든 소유자 계정으로 메시지가 전송되는 것을 확인 할 수 있습니다. 이때 개인 계정이 아닌 bot을 이용하는 방법을 공유 하고자 작성하게 되었습니다.  우선 기본적으로 bot을 만들 수 있는 권한은 System Admin이어야 가능합니다    하단에 보시면 Bot Acccounts 가 보이는데요 member 권한인 경우에는 안 보 일 수 있습니다      [ Bot Acccounts ] 를 클릭 해보시면 생성 하는 곳이 없습니다…   이경우 SystemConsole로 가서 Bot설정을 해줘야 하는데 아래와 같이 설쟁 하주시면 됩니다. Enable Bot Account Crea..

article thumbnail
<GIT> git pull의 merge history는 ?
GIT 2024. 3. 20. 22:47

안녕하세요 오늘은 git에서 pull을 하면 merge hitsory는 어떻게 되는지 알아보려고 합니다. 일반적으로 프로젝트를 진행하면서 git에서 가장 많이 사용 하는게 pull 아닐까 싶은데요. 주기적으로 pull을 하면서 충돌의 위험성을 감소 할 수 있는 강력한 기능입니다. 여기서 git pull에 대해서 모르시는 분들이 있으 실 수 있으니 간단히 설명자면 fetch + merge 라고 생각하시면 됩니다. PULL = Fetch + Merge 즉, Fetch를 통해 원격 저장소에서 최신 커밋 이력을 가지고오고 Merge를 통해 현재 브랜치에 병합을 해준다. 라고 볼 수 있습니다. 그러면 여기서 생각이 드는 것은 Merge 이력은 무조건 만들어 지겠지? 라는 것입니다. 물론 옵션에 따라 다르겠지만 대..

[프로그래머스] 문자열 내 마음대로 정렬하기
카테고리 없음 2023. 12. 17. 22:41

import java.util.*; class Solution { public String[] solution(String[] strings, int n) { Comparator stringComparator = Comparator.comparing(a -> a.charAt(n)); return Arrays.stream(strings) .sorted(stringComparator.thenComparing(Comparator.naturalOrder())) .toArray(String[]::new); } } https://school.programmers.co.kr/learn/courses/30/lessons/12915