kotlin
10 posts
[Spring Batch 마스터 클래스] Chapter 5: 실패와 재시작 - 안전한 배치 운영의 핵심

지난 Chapter 4에서 병렬 처리로 1000만 건을 1시간 만에 처리하는 방법을 배웠습니다. 하지만 실무에서는 더 큰 도전이 기다리고 있어요! “배치가 99% 완료되었는데 실패했어요… 처음부터 다시 해야 하나요?” 😱 이번 Chapter에서는 Spring Batch의 Skip, Retry, Restart 전략으로 배치를 안전하고 견고하게 만드는 방법을 알아보겠습니다! 🚀 🎯 들어가며 - 새벽 3시의 악몽 시나리오 신입 개발자 C씨에게 운명의 전화가 걸려왔습니다. 📞 “C씨! 큰일났어요! 어제 밤에 돌린 회원 데이터 마이그레이션 배치가 새벽 2시 50분에 실패했는데, 800만 건 중 790만 건 처리했다가 실패한 거예요. 오늘 오전 9시까지 완료되어야 하는데… 어떻게 하면 좋을까요?” 😭 C씨가 확인해보니 이런 상황이었습니다: 🤔 문제 상황 분석 시간 진행률 처리된 데이터 상황 22:00 0% 0건 배치 시작 ✅ 01:00 40% 320만 건 순조롭게 진행 ✅ 02:30 90% …

July 27, 2025
springbatchkotlin
[Spring Batch 마스터 클래스] Chapter 4: 병렬 처리와 파티셔닝으로 성능 극대화하기

지난 Chapter 3에서 Chunk 방식으로 100만 건 데이터를 안전하게 처리하는 방법을 배웠습니다. 하지만 실무에서는 더 큰 도전이 기다리고 있어요! “1000만 건을 2시간 내에 처리해야 해요!” 같은 요구사항 말이죠. 😱 이번 Chapter에서는 Spring Batch의 병렬 처리와 파티셔닝 기능으로 처리 속도를 10배 이상 향상시키는 방법을 알아보겠습니다! 🚀 🎯 들어가며 - 극한의 실무 시나리오 우리 주인공 B씨에게 또 다른 미션이 떨어졌습니다. “B씨, 이번엔 정말 큰 프로젝트예요! 전국 모든 매장의 1년치 주문 데이터 1000만 건을 분석해서 매출 리포트를 만들어야 해요. 그런데 사장님이 내일 아침까지 달라고 하시네요… 😭” B씨가 기존 Chunk 방식으로 테스트해봅니다. 🤔 예상 결과: 절망적인 성능 데이터 양 예상 처리 시간 현실 100만 건 1시간 ✅ 성공 1000만 건 10시간 ❌ 내일 아침까지 불가능! 1억 건 100시간 ❌ 4일… B씨: “이런… 어떻게 …

July 27, 2025
springbatchkotlin
[Spring Batch 마스터 클래스] Chapter 3: Chunk 방식으로 대용량 데이터 정복하기

지난 Chapter 2에서 Job과 Step을 만들고 JobParameters를 사용해봤습니다. 이번에는 Spring Batch의 진짜 강력함을 느낄 수 있는 Chunk 방식을 배워보겠습니다! 100만 건의 데이터도 OutOfMemory 없이 안전하게 처리할 수 있는 비법을 공개합니다. 🚀 🎯 들어가며 - 실무 시나리오 새로 입사한 신입 개발자 B씨에게 이런 미션이 주어졌습니다. “우리 회사 회원이 100만 명인데, 개인정보보호법 때문에 회원 데이터를 마스킹 처리해서 CSV로 내보내야 해요. 매월 말에 정기적으로 해야 하는 작업이니까 배치로 만들어주세요!” B씨는 지난번 공부한 Tasklet 방식으로 시도해봅니다. 🤔 예상 가능한 문제들 문제 1: “OutOfMemoryError: Java heap space” 100만 건을 한 번에 메모리에 올리면? 💥 8GB RAM도 부족할 수 있어요! 문제 2: “처리 중간에 실패하면?” 80만 건 처리 후 에러 발생 → 처음부터 다시? 트랜…

July 27, 2025
springbatchkotlin
[Spring Batch 마스터 클래스] Chapter 2: Hello, Spring Batch!

지난 Chapter 1에서 Spring Batch가 무엇이고 왜 필요한지 알아봤습니다. 이번 시간에는 직접 Job과 Step을 만들어보고, JobParameters를 통해 동적으로 배치를 실행하는 방법을 배워보겠습니다! 🚀 🎯 들어가며 - 실무 시나리오 여러분이 이커머스 회사의 백엔드 개발자라고 상상해보세요. 팀장님이 다음과 같은 요구사항을 전달합니다. “매일 자정에 전날 매출을 집계하는 배치를 만들어주세요. 카테고리별, 상품별로 통계를 내고, 가끔은 특정 날짜를 지정해서 재집계할 수도 있어야 해요!” 오늘 우리가 만들 **“일일 매출 집계 배치”**의 요구사항은 다음과 같습니다: 📋 요구사항 매일 새벽 1시에 전날 매출 데이터 자동 집계 카테고리별 매출 통계 생성 상품별 TOP 10 추출 집계 결과를 테이블에 저장 특정 날짜를 지정해서 재집계 가능해야 함 자, 그럼 시작해볼까요? 💪 🏗️ 프로젝트 세팅과 도메인 설계 프로젝트 구조 도메인 엔티티 설계 먼저 주문 관련 엔티티들을 만…

July 27, 2025
springbatchkotlin
[Spring Batch 마스터 클래스] Chapter 1: Spring Batch가 뭐고, 왜 필요한가?

안녕하세요! 오늘부터 Spring Batch를 제로부터 실무까지 다루는 마스터 클래스 시리즈를 시작합니다. 🚀 이 시리즈는 1년차 백엔드 개발자도 쉽게 이해할 수 있도록, Kotlin과 Spring Boot 최신 버전을 사용하여 실무 경험을 바탕으로 차근차근 설명해드릴 예정입니다. 📌 이런 경험 있으신가요? 입사한 지 얼마 안 된 신입 개발자 A씨의 하루를 들여다볼까요? “A씨, 매일 새벽 2시에 전날 주문 데이터를 집계해서 리포트 만드는 기능 개발해주세요!” A씨는 열심히 구글링해서 어노테이션을 찾아냅니다. “완성! 이제 매일 새벽 2시에 리포트가 만들어질 거야!” 😎 🤔 그런데 문제가 생기기 시작합니다… 문제 1: “어? 오늘 리포트가 안 왔네요?” 새벽 2시에 서버가 잠깐 다운됐었다면? 실행 중에 에러가 발생했다면? 어디까지 처리됐는지 어떻게 알지? 문제 2: “주문이 100만 건인데… OutOfMemoryError가…” 모든 데이터를 한 번에 메모리에 올릴 수 없다면? 처…

July 27, 2025
springbatchkotlin
Spring Boot + Kotlin에서 Redis 캐싱 완벽 가이드: 기본 전략부터 커스텀 AOP까지

Spring Boot + Kotlin에서 Redis 캐싱 완벽 가이드: 기본 전략부터 커스텀 AOP까지 웹 애플리케이션의 성능을 향상시키는 가장 효과적인 방법 중 하나는 캐싱입니다. 특히 Redis를 활용한 캐싱 전략은 데이터베이스 부하를 줄이고 응답 시간을 크게 개선할 수 있습니다. 이번 글에서는 Kotlin과 Spring Boot를 기반으로 실무에서 자주 사용하는 Redis 캐싱 전략들을 살펴보겠습니다. 1. 캐싱 전략의 종류 1.1 Cache-Aside (Lazy Loading) 가장 일반적인 캐싱 패턴으로, 애플리케이션이 캐시를 직접 관리하는 방식입니다. 장점: 필요한 데이터만 캐시에 저장 구현이 단순하고 직관적 단점: 캐시 미스 시 지연 발생 캐시 무효화 로직이 복잡할 수 있음 1.2 Write-Through 데이터를 쓸 때 캐시와 데이터베이스를 동시에 업데이트하는 방식입니다. 장점: 데이터 일관성 보장 캐시가 항상 최신 상태 단점: 쓰기 성능이 저하될 수 있음 캐시 장애…

July 17, 2025
databaserediskotlin
Kotlin + Spring Boot 백엔드 비동기 프로그래밍 완전 가이드

Kotlin + Spring Boot 백엔드 비동기 프로그래밍 완전 가이드 현대의 백엔드 시스템은 높은 동시성과 빠른 응답 시간을 요구합니다. Kotlin Coroutines와 Spring Boot를 결합하면 기존 Java 기반 시스템보다 더 효율적이고 간결한 비동기 처리가 가능합니다. 이 글에서는 안드로이드가 아닌 순수 백엔드 관점에서 Kotlin과 Spring Boot를 활용한 비동기 프로그래밍을 심층적으로 다루겠습니다. 1. 백엔드에서의 비동기 프로그래밍 왜 비동기 프로그래밍이 필요한가? 전통적인 동기 처리의 문제점: 비동기 처리의 장점: 높은 처리량: 더 적은 스레드로 더 많은 요청 처리 효율적인 리소스 사용: I/O 대기 시간 동안 다른 작업 처리 확장성: 동시 접속자 증가에 유연하게 대응 Kotlin Coroutines vs Java Virtual Threads (Java 21+) Java 21에서 도입된 Virtual Threads는 Kotlin Coroutines와 …

July 01, 2025
kotlin
코틀린3 - 클래스, 객체, 인터페이스

4장. 클래스, 객체, 인터페이스 4.1 클래스 계층 정의 4.1.1 코틀린 인터페이스 코틀린 인터페이스 안에는 추상 메소드뿐 아니라 구현이 있는 메소드도 정의할 수 있다. 다만 인터페이스에는 아무런 필드도 들어갈 수 없다. 이 인터페이스를 구현하려면 override 변경자 반드시 필요 디폴트 구현할 때 특별한 키워드 필요없이 그냥 구현하면 됨 다른 인터페이스가 showOff 메소드를 함께 구현하면?? 어느 쪽도 선택되지 않는다. 클래스가 구현하는 두 상위 인터페이스에 정의된 showOff구현을 대체할 오버라이딩 메소드를 직접 제공하지 않으면 다음과 같은 컴파일러 오류가 발생한다. 코틀린 컴파일러는 두 메소드를 아우르는 구현을 하위 클래스에 직접 구현하게 강제한다. 상속한 인터페이스의 메소드 구현 호출하기 이 클래스의 인스턴스를 만들고 showOff()가 구현대로 상속한 모든 메소드를 호출하는지 검증해볼 수 있다. Button 클래스는 Focusable 인터페이스 안에 선언된 se…

April 16, 2020
kotlin
코틀린2 - 함수 정의와 호출,

3장. 함수 정의와 호출 컬렉션 만들기 to는 특별한 키워드가 아니라 일반함수다. (중위 호출 infix) (중요) 코틀린은 자신만의 컬렉션 기능을 제공하지 않는다. 자바 코드와 상호작용하기 쉽다. 하지만 코틀린에서는 자바보다 더 많은 기능을 쓸 수 있다. (자바에 없는) last와 max함수는 어디에 정의되어 있는걸까? 함수를 호출하기 쉽게 만들기 joinToString 구현하기 잘동작한다. 하지만 어떻게 하면 이 함수를 호출하는 문장을 덜 번잡하게 만들 수 있을까? 호출할 때마다 매번 네 인자를 모두 전달하는 것은 불필요하다. 이름 붙인 인자 함수 호출 부분의 가독성 개선 함수에 전달하는 인자 중 일부의 이름을 명시할 수 있다. 호;출 시 인자 중 어느 하나라도 이름을 명시하고 나면 혼동을 막기위해 그 뒤에 오는 모든 인자는 이름을 꼭 명시해야 한다. 디폴트 파라미터 값 이제 함수를 호출할 때 모든 인자를 쓸 수도 있고, 일부를 생략할 수도 있다. 최상위 함수와 프로퍼티 함수를…

March 04, 2020
kotlin
코틀린1 - 코틀린 기초

1장. 코틀린이란 더 적은 코드로 더 편하게 코틀린의 주목적은 현재 자바가 사용되고 있는 모든 용도에 적합하면서도 더 간결하고 생산적이며 안전한 대체 언어를 제공하는 것 안드로이드 공식언어 서버, 모바일, 웹, 프론트엔드까지 코틀린언어 하나로 작성가능 컴파일 과정 Kotlin Tutorials 코틀린 - *.kt -> 코틀린 컴파일러 -> *.class -> *.jar -> (코틀린 런타임)애플리케이션 자바 - *.java -> 자바 컴파일러 -> *.class -> *.jar -> 애플리케이션 코틀린 컴파일러로 컴파일한 코드는 코틀린 런타임 라이브러리에 의존 런타임 라이브러리에는 코틀린 자체 표준 라이브러리 클래스와 코틀린에서 자바 API의 기능을 확장한 내용이 들어있다. 코틀린으로 컴파일한 애플리케이션을 배포할 때는 런타임 라이브러리도 함께 배포해야 한다. 2장. 코틀린 기초 Hello World 함수를 최상위 수준에 정의할 수 있다! 꼭 클래스 안에 함수를 넣어야 할 필요가…

March 04, 2020
kotlin