분류 전체보기
Spring Batch JdbcPagingItemReader, JdbcBatchItemWriter 쿼리 읽고 bulk 하는 프로세스
Spring Batch JdbcPagingItemReader, JdbcBatchItemWriter 쿼리 읽고 bulk 하는 프로세스
2025.06.08JdbcPagingItemReader 내부 동작Spring Batch에서 페이징 처리를 하려면 바로 JdbcPagingItemReader 가 있습니다. 그런데 이 친구 막상 써보려 하면 쿼리는 누가 짜주고, 페이지는 어떻게 나뉘는지 궁금하지 않을 수 없습니다.이번 JdbcPagingItemReader 의 동작 원리와 내부 구조를 한 방에 이해할 수 있도록 정리해보겠습니다. 1. 초기 설정 afterPropertiesSet() 메서드에서 이 모든 준비가 시작됩니다. afterPropertiesSet() 내부에서 queryProvider.init(dataSource)가 호출하면첫 페이지용 쿼리: generateFirstPageQuery()이후 페이지용 쿼리: generateRemainingPagesQuery..
spring batch 기본 내용 정리
spring batch 기본 내용 정리
2025.06.01spring batch 기본 내용 정리스프링 배치(Spring Batch)를 시작할 때 가장 먼저 하는 작업은 하나의 배치 Job을 정의하고 이를 빈(bean)으로 등록하는 것입니다. 보통 @Configuration 어노테이션이 선언된 설정 클래스에서 Job과 Step을 정의하게 됩니다.Spring Batch 5.1 이전 vs 이후의 차이@Configurationpublic class MyJobConfig { @Autowired private JobBuilderFactory jobBuilderFactory; @Autowired private StepBuilderFactory stepBuilderFactory; @Bean public Job sampleJob() {..
스프링 배치 @EnableBatchProcessing 처리방법
스프링 배치 @EnableBatchProcessing 처리방법
2025.05.25Spring Batch를 처음 적용할 때 가장 먼저 마주치는 어노테이션이 `@EnableBatchProcessing`입니다. 하지만 이 어노테이션이 내부적으로 어떤 역할을 하는지, 언제 필요한지, 그리고 어떤 경우에 직접 설정해야 하는지 헷갈릴 수 있습니다.이 포스팅에서는 `@EnableBatchProcessing`의 역할과 내부 동작 원리를 정리하고, 실무에서 마주치는 상황에 따라 어떻게 처리하면 좋을지 알아보겠습니다. @EnableBatchProcessing은 Java에서 커스텀 어노테이션으로 정의되어 있습니다.@Target은 ElementType.TYPE으로 설정되어 있어, 이 어노테이션은 클래스 선언부에만 붙일 수 있습니다.또한, @Retention은 RetentionPolicy.RUNTIME으..
가상 면접 사례로 배우는 대규모 시스템 설계 기초 4장
가상 면접 사례로 배우는 대규모 시스템 설계 기초 4장
2025.05.11처리율 제한 장치특정 시간 동안 네트워크를 통해 전송되는 데이터의 양이나 서비스에 대한 요청 수를 제한하는 장치나 소프트웨어를 의미한다. 🚫 DoS/DDoS 공격 방지💸 과금 API 남용 방지 → 비용 절감🔐 보안 유지 (비정상 트래픽 차단)⚙️ 서버 안정성 확보🧠 클라이언트에게 명확한 피드백 제공 (429, Retry-After)시스템 설계 4단계 접근법을 적용1단계 문제 이해 및 설계 범위 확정 요구사항 요청 수 제한낮은 응답시간 유지메모리 효율성장애 허용성여러 인스턴스 간 공유 가능2단계: 아키텍처 위치 결정Client위변조 가능, 비추천요청 줄일 수는 있음Server중앙 집중 관리가장 흔한 방식Middleware (API Gateway)MSA 구조에서 주로 사용인증, 로깅, 제한 등 통합토..
zipkin 내용 정리
zipkin 내용 정리
2025.05.05들어가기트위터에서 개발되서 사용하고 있는 분산 추적 도구입니다. 마이크로서비스 환경에서는 하나의 Request 요청에 대해 여러개 서비스들이 호출되곤 합니다. 이때, 데이터를 받아오는 다소 무거운 API가 있으면 Spring 서버의 경우 스레드가 묶여 버리는 일종에 병목 현상의 문제가 발생할 수 있습니다. 이런 경우를 대비하여 모니터링이 필요하게 됩니다. Zipkin을 통해서 이러한 병목 현상을 대비할 수 있는 모니터링 역할을 수행하게 됩니다. Twitter 에 공개되어 있는 Distributed Systems Tracing with Zipkin 본문 링크입니다. 조금 오래된 문서이긴 하지만 zipkin 등장이유와 동작방식에 대해 확인해볼 수 있습니다. Zipkin 이란 무엇인가?Zipkin은 분산환경..
다양한 정렬 알고리즘 구현 및 성능 비교
다양한 정렬 알고리즘 구현 및 성능 비교
2025.04.28이번 포스팅에서는 대표적인 정렬 알고리즘을 C 언어로 직접 구현하고,100만 개 데이터를 기준으로 수행 시간을 측정해 비교해보았습니다. 실험 환경데이터 개수: 1,000,000개 (난수로 생성)측정 방법: clock() 함수를 이용해 실행 시간 계산 구현한 정렬 알고리즘각 정렬 알고리즘은 별도로 함수를 구현해 테스트했습니다.1. 선택 정렬 (Selection Sort)모든 요소를 비교하여 가장 작은 값을 선택해 앞으로 보냄시간 복잡도: O(N²)void selection_sort(int list[], int n) { int i, j, least, tmp; for (i = 0; i 2. 삽입 정렬 (Insertion Sort)이미 정렬된 구간에 새로운 데이터를 삽입하는 방식시간 복잡도: O(..
Zigzag Conversion
Zigzag Conversion
2025.04.20문제 https://leetcode.com/problems/zigzag-conversion/description/The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)P A H NA P L S I I GY I RAnd then read line by line: "PAHNAPLSIIGYIR"Write the code that will take a string and make this conversion given a number of ro..
Dynamic Programming (DP) : 작은 문제의 답을 조합해 큰 문제를 푼다.
Dynamic Programming (DP) : 작은 문제의 답을 조합해 큰 문제를 푼다.
2025.04.13다이나믹 프로그래밍(DP)은 복잡한 문제를 여러 개의 작은 문제로 나누고, 그 작은 문제들의 결과를 재사용하여 전체 문제를 빠르게 해결하는 기법입니다. 🧠 Divide and Conquer vs Dynamic ProgrammingDP는 Divide and Conquer(분할 정복)와 유사해 보이지만, 몇 가지 중요한 차이점이 존재합니다.구분Divide and ConquerDynamic Programming문제 분할주로 절반으로 나눔보통 -1씩 줄여 나감문제 성격함수형 문제 (Function Problem)최적화 문제 (Optimization Problem)결과 사용결과는 한 번만 사용결과를 여러 번 사용성능 향상 방법분할 자체가 성능을 높임결과의 재사용이 핵심 🔁 Overlapping Subprobl..
BOJ 17612 쇼핑몰
BOJ 17612 쇼핑몰
2025.04.07개요이 문제는 우선순위 큐를 사용하는 문제지만, 정렬 방법에 대해 이해하고 있어야 하고 무엇보다 문제에서 주어진 요구사항을 동적으로 처리하는것보다 사전에 전처리하여 값을 모두 저장 한뒤 문제 요구사항에 맞게 풀어야 했었습니다. 처음에는 while 문으로 계속 돌면서 입력 받는대로 동적으로 값을 처리 해주었습니다. 결과적으로 꼬였습니다.그래서, k개 즉 카운터라고 볼 수 있는 k개에 쇼핑 카트를 모두 대기하는 값을 pq에 담게 되었습니다.그림그림을 보게 되면 어쨋든, 상품들이 1초에 하나씩 계산이 될텐데 더 적은 상품에 대해서 카운터에 배정되게 됩니다. 상품의 개수가 같다면 카운트가 더 적은 애한테 우선 할당하게 되는데 그게 인입하는 과정에서 수행하게 됩니다. 반대로, 나갈때도 마찬가지로 기본적인 더 적은..
Jackson 직렬화 시 > 기호가 깨질 때 원인과 해결법
Jackson 직렬화 시 > 기호가 깨질 때 원인과 해결법
2025.03.30문제 상황API 응답에서 특수문자가 Unicode escape 형태로 내려오는 현상이 있었다. 예를 들어, > 기호가 \u003E로 바뀌는 경우가 해당된다. 디버깅 시에는 >로 보이지만, 실제 응답에서는 인코딩된 문자처럼 보이는 이유와 해결방법을 정리해보았습니다. 예시public class Product { @JsonProperty("description") private String description = "1 > 0";}디버깅 출력 : 1 > 0 (그대로)JSON 응답 : 1 \u003E 0 원인 분석디버깅 : 단순 문자열 표시라 > 그대로 보임JSON 직렬화 : Jackson 등 직렬화 도구에서 보안 목적으로 이스케이프 처리> 에서 \u003E 로 보임 : , & 등은 XSS 방지 ..
공통 쿼리 재사용을 고려한 랜덤 추출 쿼리 작성 방법 (Oracle + MyBatis)
공통 쿼리 재사용을 고려한 랜덤 추출 쿼리 작성 방법 (Oracle + MyBatis)
2025.03.23최근 프로젝트에서 조건에 맞는 카테고리 중 랜덤으로 하나씩 상품을 뽑고, 조건에 맞는 나머지 상품을 추가로 추출하여 총 n개를 만드는 쿼리를 작성할 일이 있었다. 단순히, union all 로 처리할 수 있지만, 중복 상품, 조건 필터링, MyBatis와의 연동 등을 고려하다 보니 쿼리가 점점 길어졌다. 이 글에서는 Oracle에서 중복을 피하면서 효율적인 쿼리를 작성하고, MyBatis XML에서 공통 쿼리를 재활용하는 방법을 소개한다. 처음 작성한 쿼리 처음에 간단하게 각각 하나씩 뽑고 UNION ALL 로 붙이면 될 줄 알았다. 하지만 이 방식은 조건에 맞는 데이터를 추출하면서 쿼리 중복과 중복된 결과 처리 문제가 발생했다.반복되는 UNION ALL 쿼리를 효율적으로 관리하고, MyBatis에서 ..
kakao_n진수 게임
kakao_n진수 게임
2025.01.26N진수 게임튜브가 활동하는 코딩 동아리에서는 전통적으로 해오는 게임이 있다. 이 게임은 여러 사람이 둥글게 앉아서 숫자를 하나씩 차례대로 말하는 게임인데, 규칙은 다음과 같다.숫자를 0부터 시작해서 차례대로 말한다. 첫 번째 사람은 0, 두 번째 사람은 1, … 열 번째 사람은 9를 말한다.10 이상의 숫자부터는 한 자리씩 끊어서 말한다. 즉 열한 번째 사람은 10의 첫 자리인 1, 열두 번째 사람은 둘째 자리인 0을 말한다.이렇게 게임을 진행할 경우,0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, …순으로 숫자를 말하면 된다.한편 코딩 동아리 일원들은 컴퓨터를 다루는 사람답게 이진수로 이 게임을 진행하기도 하는데, 이 경우에는0, 1, 1, 0..