ThreadLocal안녕하세요 오늘은 ThreadLocal에 대해서 알아 보려고 합니다. ThreadLocal은 Java에서 지원하는 Thread Safe한 기술로 멀티쓰레드 환경에서 동시성 이슈를 해결 할 수 있는 쓰레드별 저장공간이라 고 할 수 있습니다. 동시성 이슈 상황 만약 pooneyValue라는 변수에 두개의 쓰레드가 접근 하여 값을 변경 하는 상황이라고 가정 하겠습니다. 조건 pooneyValue라는 공유 변수 존재두개의 쓰레드 동시 접근 두개의 쓰레드 값은 변경 하는경우 그림으로 표현하면 아래와 같은 상황 일 것입니다. 코드로 작성하면 아래와 같이 작성을 할 수 있습니다. 여기서 동시성 이슈를 발생 시키기 위하여 sleep을 통해 시간을 조절 했습니다. @Slf..
안녕하세요. 오늘은 대용량의 데이터를 빠르게 처리 하기 위해 배치를 구성해야 하는 경우가 많은데요. 이러한 병렬처리가 를 하기 위한 Multi-Threaded Step 방식에 대해서 알아 보려고합니다. Multi-Threaded Step 하나의 Step에서 멀티스레드를 사용해 ItemReader, ItemProcessor, ItemWriter를 병렬로 실행해 동일한 데이터 소스를 여러 스레드가 동시에 일고 처리 하는 기능을 제공합니다. 즉 Multi-threaded Step은 단일 Step에서 여러 쓰레드를 병렬로 실행하여 작업을 처리하는 방식입니다. 자세한 설명은 아래의 Spring docs에 자세히 설명 되어 있으니 참고해 보는 것도 좋을 것 같습니다. https://docs.sp..
안녕하세요. 오늘은 Spring Batch를 이용한 Partitioning에 대해서 작성해 보려고 합니다. 프로젝트를 진행하면서 대용량의 데이터를 처리해야 할 일이 발생을 했는데요. 대용량을 빠르게 처리 하기 위해서 흔히 병렬적으로 처리하는 방법을 사용하는 경우가 많습니다. 병렬적으로 처리 하기 위해 대표적인 Scalling 기능인 Multi-Threaded Step 방식도 많이 생각 하실 겁니다. 하지만 이번에는 Partitioning 기능을 이용한 방법에 대해서 알아 보려고 합니다. Partitioning데이터를 물리적으로 분할하여 각 파티션을 별개의 Step으로 처리하는 방식입니다. 각 파티션은 독립적으로 실행되며, 멀티스레드 환경 또는 클러스터링 환경에서 실행될 수 있도록 제공하..
안녕하세요. 오늘은 커넥션 누수의 대해서 알아 보려고 합니다. 제가 커넥션 누수에 대해서 작성을 하게 된 이유는 프로젝트를 진행 하면서 과도하게 CPU을 사용하는 현상이 발생을 했는데요. 로그를 확인 해도 정말 알 수 가 없었고 서버가 중단 될 지경까지 가는 아찔한 순간이 있었는데요. 해당 프로젝트는 외부에서 진행 했었던 프로젝트인 만큼 알고 있는 정보도 많지 않아 정말로 이유를 찾기 힘들었지만 원인을 찾는 과정을 하나씩 기록하며 후에 빠르게 대처하기 위해 작성을 하게 되었습니다. 우선 아래와 같이 해당 서버의 CPU사용률이 굉~장히 높은 현상이 발생했습니다. 무려 각 CPU가 100% 힘으로 계속 동작하고 있었습니다. 정말 놀라웠습니다..!!! 이런건 지금까지 본 적이..
프로젝트를 진행하면서 이용권 기능이 필요했습니다. 때문에 이용권에 맞게 난수 생성이 필요했고 안전한 난수를 어떻게 생성 할 수 있을까? 찾던 중에 SecureRandom 을 발견했습니다. 많이 들 사용하는 단순 Random의 경우 현재 시간을 시드로 사용하기 때문에 완벽한 무작위가 아닌 '의사난수' 가 생성 되기 때문에 목적에 부합하지 않았습니다. 그렇게 검색 도중 의사 난수가 아닌 확실하고 안전한 난수 생성을 도와주는 SecureRandom을 발견 하게 되었습니다. 이러한 SecureRandom 을 사용하면서 발생했던 이슈를 공유 해보려고 합니다. SecureRadom는 어떻게 난수를 생성 할까? 시스템 시간을 시드로 해서 난수(?)를 생성하는 Random과 달리 OS에서 임의 데이터를 가..
log-back을 이용하여 에러로그를 추적하는 경우 해당 메시지들은 로그 추적을 위해 만든 소유자 계정으로 메시지가 전송되는 것을 확인 할 수 있습니다. 이때 개인 계정이 아닌 bot을 이용하는 방법을 공유 하고자 작성하게 되었습니다. 우선 기본적으로 bot을 만들 수 있는 권한은 System Admin이어야 가능합니다 하단에 보시면 Bot Acccounts 가 보이는데요 member 권한인 경우에는 안 보 일 수 있습니다 [ Bot Acccounts ] 를 클릭 해보시면 생성 하는 곳이 없습니다… 이경우 SystemConsole로 가서 Bot설정을 해줘야 하는데 아래와 같이 설쟁 하주시면 됩니다. Enable Bot Account Crea..
프로젝트를 진행하면서 Batch를 구성해야하는 경우가 많은데요. 대부분 Job을 구성 할때 DB를 조회하는 JdbcItemReader, Jdbccursoritemreader, Jdbcpagingitemreader등을 이용해서 만드는 경우가 많았습니다. 간혹 저의 경우 외부 Data를 받기 위해 API를 호출하고 받은 Response Data를 저희 DB에 넣어서 동기화하는 Job을 구성해야 하는 경우가 있었는데요. 대부분은 DB에서 read해서 Db에 write를 하는 글은 많이 보이지만 외부 연동이 들어가는 Job은 어떻게 구성을 해야하는지 잘 보이지 않아 공부 할 겸 글로 작성해보려고 합니다. 틀린 부분 이 있을 수 있으니 감안해주시면 감사하겠습니다. 요구조건 외부 Rest API를 통해 데이터를 받..
안녕하세요 오늘은 Enum으로 Request, Response를 받는 방법을 이야기 하려고 합니다. Jpa 프로젝트를 진행 하다 보면 Enum 타입을 자주 사용하게 되는데요. 이경우 Enum으로 Request, Response를 받는 방법을 모르시는 경우가 많은 거 같습니다. 방법은 Jackson의 Deserializer, Serializer를 사용하면 간단하게 해결 가능합니다. 우선 기본적으로 제공하는 기능을 사용해서 Enum을 Request로 받아 보겠습니다. TestController @Slf4j @RequestMapping("test") @RestController public class TestController { @PostMapping("") public ResponseEntity getTe..