전체 글 20

[Spring Batch] JpaPagingItemReader 성능 차이 확인 필수 (Fetch Join OOM부터 transacted의 숨겨진 함정까지)

Spring Batch에서 대용량 데이터를 처리할 때 JpaCursorItemReader에서 JpaPagingItemReader로 넘어오는 것은 흔한 수순이다.하지만 JpaPagingItemReader를 만만하게 보고 기존 웹 애플리케이션에서 하던 것처럼 쿼리를 짰다가는, 시스템이 혼란에 빠지는 것을 목격하게 될 것이다. 오늘은 이 녀석이 숨기고 있는 치명적인 메모리 함정과 프레임워크 내부의 기이한 동작 방식까지 전부 파헤쳐본다.1. Fetch Join과 페이징의 끔찍한 혼종 (OOM의 서막)JPA를 좀 다뤄본 개발자라면 N+1 문제를 피하기 위해 숨 쉬듯 Fetch Join을 사용할 것이다. JpaPagingItemReader의 queryString()에도 자연스럽게 JOIN FETCH를 집어넣게 되는..

Spring 2026.02.28

[Spring Batch] 배치의 두 가지 심장: Tasklet vs Chunk 지향 처리

이번에는 Spring Batch의 Step을 구성하는 두 가지 핵심 처리 모델, Tasklet(태스크릿)과 Chunk(청크)에 대해 심층 분석해 보시죠.1. 태스크릿(Tasklet) 지향 처리: 단순함의 미학태스크릿(Tasklet) 모델은 Spring Batch에서 가장 기본적인 Step 구현 방식입니다. 복잡한 데이터 처리보다는 단순한 시스템 작업이나 유틸성 작업에 주로 사용됩니다.언제 사용하는가?대량의 데이터를 읽고 쓰는 ETL 작업이 아닌 경우, 대부분 Tasklet을 사용합니다.로그 파일 삭제단순 알림(이메일, 슬랙) 발송외부 API 호출 후 단순 로깅오래된 파일 아카이빙구현 핵심: Tasklet 인터페이스Tasklet 인터페이스의 execute() 메서드에 로직을 작성하면 됩니다.@Functio..

카테고리 없음 2026.02.15

[트러블슈팅] DAU ~100, 굳이 Redis를 써야 할까? (Local Cache 도입기)

1. 배경 및 문제 상황 (Background)최근 사내 프로젝트 개발 중, 특정 API의 응답 속도가 현저히 느려지는 현상을 발견했습니다. 프로파일링 결과, 범인은 사용자 정보를 불러오는 로직이었습니다.현상: 사용자 정보 조회 시 응답 시간이 약 2,000ms (2초)까지 지연됨.원인: 레거시 시스템 연동 및 복잡한 조인 연산으로 인해 DB 조회 비용이 매우 높음.제약 사항:현재 다른 핵심 기능 개발로 인해 인프라를 변경하거나 대대적인 리팩토링을 할 시간적 여유가 없음.하지만 사용자의 체감 성능 향상을 위해 즉각적인 개선이 필요함.2. 기술 검토: Local Cache vs Global CacheDB 튜닝이 어렵다면 가장 효과적인 대안은 캐싱(Caching)입니다. 캐시 저장소를 어디에 둘 것인가를 두..

Spring 2026.02.01

React Update로 보안 높이기

https://www.boho.or.kr/kr/bbs/view.do?bbsId=B0000133&pageIndex=1&nttId=71912&menuNo=205020 KISA 보호나라&KrCERT/CCKISA 보호나라&KrCERT/CCwww.boho.or.kr:443https://news.hada.io/topic?id=25030 React 서버 컴포넌트의 DoS 및 소스 코드 노출 취약점 공개 | GeekNewsReact Server Components에서 서비스 거부(DoS) 및 소스 코드 노출 취약점이 새로 발견되어 공개됨이번 취약점은 원격 코드 실행(RCE) 은 불가능하지만, 서버 중단이나 코드 유출 위험이 존재영향을 받는news.hada.io 이와 같은 보안 취약점이 최근에 발생했습니다.......인..

카테고리 없음 2025.12.15

[BOJ. 2983] 개구리 공주

문제트럭을 타고 이동하던 중에 상근이는 휴식을 취하기 위해서 호수에 잠시 들렸다. 호수에는 개구리가 살고 있고, 개구리는 호수 위에 떠있는 식물 N개를 점프하면서 다닌다. 오래된 전설에 따르면 개구리에게 키스를 하면 개구리는 아름다운 공주로 변한다고 한다. 일단 개구리를 잡아야 전설이 사실인지 아닌지 확인할 수 있다. 개구리를 잡아보자.호수는 2차원 평면으로 생각할 수 있고, 식물은 그 평면 위의 점으로 나타낼 수 있다. (x, y)위에 있는 개구리는 아래 네 가지 방향 중 한 방향으로 점프할 수 있다.임의의 양의 정수 P에 대해서, (x+P, y+P)로 점프할 수 있다. 이 방향을 A라고 한다.임의의 양의 정수 P에 대해서, (x+P, y-P)로 점프할 수 있다. 이 방향을 B라고 한다.임의의 양의 정..

알고리즘 2025.04.13

[알고리즘] 시뮬레이션에서 자주 나오는 것들 정리

1) 일정 범위 제거 후 빈 칸이 있으면 떨어뜨리기// 중력 작용 메서드static void applyGravity() { // 모든 열에 대해 중력을 적용 for (int col = 0; col = 0; row--) { // 현재 위치가 검정 블록이거나 빈 칸인 경우 건너뜀 if (map[row][col] == BLACK || map[row][col] == EMPTY) { continue; } // 블록을 아래로 이동 moveBlock(row, col); } }}// 블록 한 개를 아래로 이동시키는 메서드static void moveBlock(int ..

알고리즘 2024.09.25

이분탐색 조금 더 이해하기

high = mid와 high = mid - 1의 차이일반적인 이진 탐색에서는 low = mid + 1 또는 high = mid - 1을 사용합니다. 이는 정확한 값을 찾는 경우에 주로 쓰이며, 조건에 따라 탐색 범위를 한 칸씩 좁히는 방식입니다. 하지만, lower bound와 upper bound는 찾고자 하는 값이 첫 번째로 등장하는 위치 또는 값을 초과하는 첫 번째 위치를 찾는 것이 목적이므로, 다음과 같은 방식으로 처리해야 합니다.lower bound와 upper bound에서는 high = mid 또는 low = mid가 사용되는 이유:lower bound: 배열에서 target 이상이 처음 등장하는 위치를 찾습니다.arr[mid] >= target인 경우, mid 위치가 목표 값 또는 그 이..

알고리즘 2024.09.08

[알고리즘, Java] 꽤나 사용하는 Java 메서드 알아보기

알고리즘을 풀다보면 꽤나 유용하게 사용하는 메서드가 있습니다. 그것을 알아보고 어떻게 구현돼 있는지 어떻게 최적화 되어 있는지 확인해보도록 하죠. 1번은Arrays.binarySearch입니다. 이 메서드는 이분탐색을 편리하게 해주는 메서드이며, BOJ 18869번을 풀 때 다른 사람의 풀이를 통해 알게되었습니다.Java 내부로 들어가게 되면 binarySearch를 보면 아래와 같습니다.public static int binarySearch(int[] a, int key) { return binarySearch0((int[])a, 0, a.length, (int)key);} 그리고 내부에 binarySearch0 으로 구현된 로직입니다. private static int binarySearch0(..

알고리즘 2024.09.01

알고리즘에서 많이 쓰는 방식

### 2차원 배열 ArrayList로 만들기ArrayList> arr = new ArrayList();ArrayList arr = new ArrayList(); ### 사용자 입력 값 받기1. String[] s = br.readLine().split(" ");2. String s = br.readLine(); 2의 경우 s.charAt(int) 로 값을 사용하면 됩.이렇게 될 경우 char 값으로 나오기 때문에 일반 동일성(identity)만 따져도 됨 즉, char a = 'b', char b = 'b' 라고 할 때 a == b 로 사용이 가능하다. ---해당 포스트는 코딩 테스트를 준비하면서 계속 업데이트 할 예정입니다 !댓글로도 알려주시면 추가해서 다른 개발자 분들이 볼 수 있도록 업데이트 하겠..

알고리즘 2024.08.25