filter 결과 : 입력 컬렉션의 원소 중에서 주어진 술어(참/거짓을 반환하는 함수 : predicate) 를 만족하는 원소만으로 이뤄진 새로운 컬렉션 예제 Person 클래스 선언 data class Person(val name: String, val age: Int) 1) 짝수만 남긴다. fun main() { val list = listOf(1, 2, 3, 4) println(list.filter { it % 2 == 0 }) // 짝수만 남는다. } 2) 30살 이상인 사람만 출력한다. fun main() { val people = listOf(Person("Alice", 27), Person("Bob", 31)) println(people.filter { it.age > 30 }) // 30살..
재실행에 포함시키기 - allowStartIfCompleted(true) @Bean public Step limitAllowStepStep1() { return stepBuilderFactory.get("limitAllowStepStep1") .tasklet(new Tasklet() { @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { System.out.println("limitAllowStepStep1"); return RepeatStatus.FINISHED; } }) .allowStartIfComplete(true) // COMPLETED 되도 ..
멀티 스레드 컨슈머 카프카는 처리량을 늘리기 위해 파티션과 컨슈머 개수를 늘려서 운영할 수 있다. 파티션을 여러개로 운영하는 경우 데이터를 병렬처리하기 위해서 파티션 개수와 컨슈머 개수를 동일하게 맞추는 것이 가장 좋은 방법이다. 토픽의 파티션은 1개 이상으로 이루어져 있으며 1개의 파티션은 1개의 컨슈머가 할당되어 데이터를 처리할 수 있다. 파티션 개수가 n개라면 동일 컨슈머 그룹으로 묶인 컨슈머 스레드를 최대 n개 운영할 수 있다. 그러므로 n개의 스레드를 가진 1개의 프로세스를 운영하거나 1개의 스레드를 가진 프로세스를 n개 운영하는 방법도 있다. 카프카에서 공식적으로 지원하는 라이브러리인 자바는 멀티 스레드를 지원한다. 멀티 스레드로 동작하는 멀티 컨슈머 스레드를 개발, 적용할 수 있다. 고려해야..
해당 포스팅의 결론 여러개의 Tasklet을 선언할 경우 마지막에 선언된 Tasklet이 수행된다. @Bean public Step onlyTaskletStep2() { return stepBuilderFactory.get("onlyTaskletStep2") .tasklet(new Tasklet() { @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { System.out.println("실행되면 안되요"); return RepeatStatus.FINISHED; } }) .tasklet(new OnlyTasklet()) // 여러개 불가능, 마지막 ta..
incrementer() 사용 이유를 알아보자. Job 생성 package com.project.springbatch._20_incrementer; import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration..
람다 안에서 로컬 변수 접근 자바 메서드 안에서 무명 내부 클래스를 정의할때 그 메서드의 로컬 변수를 무명 내부 클래스에서 사용할 수 있다. 람다 안에서도 같은 일을 할 수 있다. 람다 안에서도 동일하게 적용할 수 있다. 람다를 함수 안에서 정의하면 함수의 파라미터뿐 아니라 람다 정의의 앞에 선언된 로컬 변수까지 람다에서 모두 사용할 수 있다. forEach문 예제 fun printMessagesWithPrefix(messages: Collection, prefix: String) { messages.forEach { println("$prefix $it") // 람다 내부에서 함수의 "prefix" 변수 사용 } } 호출 fun main() { val errors = listOf("403 Forbidd..
멱등성 여러번 연산을 수행하더라도 동일한 결과를 나타내는 것을 뜻한다. 멱등성 프로듀서는 동일한 데이터를 여러번 전송하더라도 카프카 클러스터에 단 한번만 저장됨을 의미한다. 기본 프로듀서의 동작 방식은 적어도 한번 전달(at least once delivery)을 지원한다. 적어도 한번 전달이란, 프로듀서가 클러스터에 데이터를 전송하여 저장할 때 적어도 한번 이상 데이터를 적재할 수 있고 데이터가 유실되지 않음을 뜻한다. 두번 이상 적재되어 중복이 발생할 가능성은 있다. 멱등성 프로듀서 멱등성 프로듀서는 기본 프로듀서와 달리 데이터를 브로커로 전달할때 프로듀서 PID(Producer unique ID)와 시퀀스 넘버(sequence number)를 함께 전달한다. 그러면 브로커는 프로듀서의 PID와 시퀀..
preventRestart() 1) 선언하지 않는 경우 - true @Bean public Job preventRestartJob() { return this.jobBuilderFactory.get("preventRestartJob") /* step start */ .start(preventRestartStep1()) .next(preventRestartStep2()) .build(); } 2) 선언하는 경우 - false @Bean public Job preventRestartJob() { return this.jobBuilderFactory.get("preventRestartJob") /* step start */ .start(preventRestartStep1()) .next(preventResta..
acks 옵션 카프카 프로듀서의 acks옵션은 0, 1, all(또는 -1) 값을 가질 수 있다. 이에 대해서 우리는 이전 포스팅에서 간단히 살펴봤었다. https://devfunny.tistory.com/747 [아파치 카프카 어플리케이션 프로그래밍] 5. 프로듀서의 중요 개념과 옵션값 프로듀서 프로듀서는 카프카 브로커로 데이터를 전송할때 내부적으로 파티셔녀, 배치 생성 단계를 거친다. 전송하고자 하는 데이터는 ProducerRecord 인스턴스를 생성하여 설정한다. 필수 파라미터 devfunny.tistory.com value 설명 0 default 프로듀서가 전송한 즉시 브로커에 데이터 저장 여부와 상관 없이 성공으로 판단한다. 1 리더 파티션에 데이터가 저장되면 전송 성공으로 판단한다. -1 or..
람다식 코드 블록을 함수 인자로 넘기기 함수형 프로그래밍에서는 클래스를 선언하고 그 클래스의 인스턴스를 함수에 넘기는 대신, 함수를 직접 다른 함수에 전달할 수 있다. 람다 식을 사용하면 코드가 더욱 더 간결해진다. 람다 식을 사용하면 함수를 선언할 필요가 없고 코드 블록을 직접 함수의 인자로 전달할 수 있다. 함수에 인자로 넘기면서 바로 람다를 정의하는 경우가 대부분이다. 코틀린의 람다식은 항상 중괄호로 둘러싸여있다. 인자 목록 주변에 괄호가 없다는 사실을 꼭 기억하라. 화살표(->)가 인자 목록과 람다 본문을 구분해준다. 1) 람다식을 변수에 저장해보자. fun main() { // 람다식을 변수에도 저장할 수 있다. val sum = { x: Int, y: Int -> x + y } println(..
1. Chrome 확장 프로그램 설치 https://chrome.google.com/webstore/detail/%EB%B0%B1%EC%A4%80%ED%97%88%EB%B8%8Cbaekjoonhub/ccammcjdkpgjmcpijpahlehmapgmphmk?hl=en&authuser=0 백준허브(BaekjoonHub) Automatically integrate your BOJ submissions to GitHub chrome.google.com 2. [Add to Chrome] 버튼 클릭 3. [확장 프로그램 추가] 버튼 클릭 4. 크롬 우측에 확장프로그램 아이콘 선택 5. 고정 6. 5번 고정 이후, 크롬 우측 상단에 확장프로그램 옆에 백준허브 아이콘 선택 7. 뜨는 팝업에 [Authenticate]..
Object 키워드 코틀린에서는 object 키워드를 다양한 상황에서 사용하지만, 모든 경우 클래스를 정의하면서 동시에 인스턴스(객체)를 생성한다는 공통점이 있다. object 키워드를 사용하는 여러 상황을 살펴보자. 상황 설명 객체 선언 (object declaration) 싱글턴을 정의하는 방법 중 하나다. 동반 객체 (companion object) 인스턴스 메서드는 아니지만 어떤 클래스와 관련있는 메서드와 팩토리 메서드를 담을때 쓰인다. 동반 객체 메서드에 접근할때는 동반 객체가 포함된 클래스의 이름을 사용할 수 있다. 객체 식은 자바의 무명 내부 클래스 대신 쓰인다. 객체 선언 (object declaration) 1) 객체 선언 : 싱글턴을 쉽게 만들기 코틀린은 객체 선언 기능을 통해 싱글턴(..