전체 글 225

[1] 왜 코루틴을 써야 할까? – Kotlin이 선택한 비동기 방식

Coroutine Document Coroutines | Kotlin kotlinlang.orghttps://github.com/Raconer/kotlin_study/tree/main/src/main/kotlin/coroutine kotlin_study/src/main/kotlin/coroutine at main · Raconer/kotlin_studyContribute to Raconer/kotlin_study development by creating an account on GitHub.github.com Kotlin 코루틴은 비동기 코드를 동기처럼 깔끔하게 작성할 수 있도록 도와주는 경량 스레드 기반의 논블로킹 구조입니다.✅ 코루틴이란?실행을 중단(suspend) 했다가 다시 재개(resume) ..

Language/Kotlin 2025.06.06

redisson-spring-boot-starter VS spring-boot-starter-data-redis

Spring Boot에서 Redis를 연동할 때 흔히 사용하는 두 가지 라이브러리가 있습니다spring-boot-starter-data-redisredisson-spring-boot-starter설명 spring-boot-starter-data-redisredisson-spring-boot-starter설명Spring 공식이 제공하는 Redis 통합 스타터로, 기본적인 Key-Value 저장소 기능을 제공Redisson은 Redis/Valkey를 위한 고급 Java 클라이언트로, Redis의 기능을 확장하여 Java 객체 기반으로 쉽게 사용할 수 있도록 지원주요 특징• RedisTemplate, StringRedisTemplate을 통한 low-level 조작• @RedisHash + RedisRepos..

BackEnd 2025.06.05

Spring Batch 실행 이력 테이블 분석 가이드

📁 BATCH_JOB_INSTANCE실행된 Job의 논리적 인스턴스를 저장합니다. 컬럼명타입설명예시JOB_INSTANCE_IDBIGINTJob 인스턴스 고유 ID (PK)1VERSIONBIGINT낙관적 락을 위한 버전 번호0JOB_NAMEVARCHAR(100)Job 이름dailySalesJobJOB_KEYVARCHAR(32)Job 파라미터의 해시 값5ab0ef124abc… 📁 BATCH_JOB_EXECUTION실제 Job 실행 이력 정보를 저장합니다.컬럼명타입설명예시JOB_EXECUTION_IDBIGINTJob 실행 고유 ID (PK)1VERSIONBIGINT낙관적 락을 위한 버전 번호0JOB_INSTANCE_IDBIGINT연결된 JobInstance ID1CREATE_TIMEDATETIME(6)실..

Spring Batch Chunk Size에 따른 성능 비교 실험 (Bulk Insert 포함)

Spring Batch에서 chunk 크기는 성능에 직접적인 영향을 줍니다.이번 포스트에서는 100,005건의 데이터를 읽고 이름을 대문자로 변환한 뒤 DB에 저장하는 작업을 수행하면서,chunk 크기에 따른 전체 처리 시간 차이를 측정했습니다. 💡 실험 조건대상 데이터 수: 100,005건작업 내용: 이름(firstName, lastName) → 대문자로 변환 후 DB insert방식:일반 insert (insert 반복 호출)bulk insert ( 사용한 List 단위 삽입)환경: Spring Batch + MyBatis + H2 in-memory DB 📊 일반 Insert 성능 (단건씩 처리) 1차2차3차1029.88초30.13초-5015.87초--6015.66초--7015.03초--801..

Spring Batch + MyBatis 예제 정리 (CSV → DB 처리)

Spring Batch와 MyBatis를 활용하여 CSV 파일 데이터를 읽고, 가공 후 데이터베이스에 저장하는 배치 처리 예제입니다.https://github.com/Raconer/SpringBatch📁 프로젝트 구성com.example.batch├── config│ └── BatchConfig.java # 배치 Job/Step 설정├── entity│ └── Person.java # 도메인 엔티티├── listener│ └── JobCompletionNotificationListener.java # Job 실행 리스너├── processor│ └── PersonItemProcessor.java # I..

Kotlin + Spring WebFlux 테스트 구조 설계기

WebTestClient 기반 공통 로깅과 JSON 출력까지 자동화✅ 목표WebFlux는 비동기 기반이기 때문에 기존 MockMvc 방식과는 다르게 WebTestClient를 사용합니다.테스트가 복잡해지기 전에, 저는 다음을 목표로 구조를 설계했습니다:모든 테스트에서 요청/응답 로그 자동 수집응답 시간, 헤더, JSON 바디를 보기 좋게 출력중복 없이 재사용 가능한 공통 베이스 테스트 클래스 구성🛠️ 프로젝트 환경 요약// build.gradle.ktsdependencies { implementation("org.springframework.boot:spring-boot-starter-webflux") // WebFlux implementation("org.springframewor..

Spring WebFlux에서 MySQL을 사용하는 방법: JDBC vs R2DBC 완전 정리

Spring WebFlux를 사용할 때 가장 헷갈리는 부분이 있다. 바로 "DB 연결은 어떻게 하지?" "JPA를 쓸 수는 없을까?" 하는 문제다.이 글에서는 WebFlux에서 MySQL을 어떻게 연결하고, R2DBC를 어떻게 사용하는지, 그리고 JPA를 왜 사용할 수 없는지를 순서대로, 쉽게 정리한다.1. WebFlux에서 DB(MySQL) 연결 방법Spring WebFlux는 기본적으로 Non-Blocking 처리를 목표로 한다. 그렇기 때문에 데이터베이스 연결 역시 Non-Blocking 드라이버를 사용해야 성능을 제대로 발휘할 수 있다.✅ WebFlux에서 MySQL을 연결하려면 R2DBC 드라이버를 사용해야 한다.1.1 필요한 의존성 추가 (Gradle)dependencies { imple..

부록 - Spring Boot MVC vs Spring WebFlux 비교

Spring Boot MVC와 Spring Boot WebFlux는 개발자가 작성하는 코드 스타일은 비슷하지만, 내부 구조, 기술 스택, 처리 방식이 본질적으로 다르다. 이 글에서는 MVC와 WebFlux를 특징 요약, 흐름도, 비교 테이블, 사용 기술 스택 중심으로 깔끔하게 정리한다.0. Spring MVC vs Spring WebFlux - 특징 요약📌 Spring MVC 특징Servlet API 기반 전통적인 웹 애플리케이션 프레임워크Blocking 방식: 요청 처리 동안 쓰레드를 점유개발 난이도 낮음: 코드가 직관적이고, 동기 흐름Blocking 데이터베이스 (JDBC, JPA) 사용에 최적화전통적인 웹사이트, 사내 시스템에 적합📌 Spring WebFlux 특징Reactive Streams ..

Spring WebFlux 심화 시리즈 (4) - WebClient를 활용한 대용량 데이터 처리

WebClient는 WebFlux의 비동기 HTTP 클라이언트로, 외부 API 호출 시 Non-Blocking 통신을 가능하게 한다. 대용량 데이터를 받아야 하는 경우, 효율적인 WebClient 사용법이 중요하다.1. 기본 개념WebClient는 응답을 받으면서 스트리밍 처리가 가능하다.응답 전체를 기다리지 않고 데이터 조각(chunk)을 받을 수 있다.특히 대량 데이터(API 응답이 수 MB 이상)일 때 유리하다.2. 실전 예제2.1 WebClient 설정@Beanfun webClient(builder: WebClient.Builder): WebClient { return builder.baseUrl("https://external.api.com").build()}2.2 대량 데이터 호출 예시@..

Spring WebFlux 심화 시리즈 (3) - Flux로 페이징 처리하는 방법

Spring WebFlux 심화 시리즈 (3) - Flux로 페이징 처리하는 방법대량의 콘텐츠를 WebFlux로 스트리밍할 때, 모든 데이터를 한 번에 클라이언트로 보내는 것은 비효율적이다. 특히 데이터가 수천 건 이상일 경우, 반드시 페이징 처리가 필요하다. 이 글에서는 WebFlux 환경에서 Flux를 이용해 페이징 처리하는 방법을 정리한다.1. 기본 개념전통적인 MVC에서는 PageRequest를 사용해 DB 쿼리 단계에서 페이징한다.WebFlux에서도 원칙은 같다: DB 쿼리에서 필요한 데이터만 가져와야 한다.Flux를 사용하더라도, 전체 데이터를 Flux로 읽고 나서 자르는 것은 비효율적이다.2. 실전 예제 (R2DBC 기준)2.1 ContentService 예시@Serviceclass Cont..