Commit Sync Consumer CommitSyncConsumer.java @Slf4j public class CommitSyncConsumer { private final static String TOPIC_NAME = "test"; private final static String BOOTSTRAP_SERVERS = "localhost:9092"; private final static String GROUP_ID = "test-group"; public static void main(String[] args) { Properties configs = new Properties(); configs.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_S..
Read moreTasklet 클래스 생성 CustomTasklet.java import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.repeat.RepeatStatus; public class CustomTasklet implements Tasklet { /** * 비즈니스 로직 구현 * @param stepContribution * @param chunkContext * @return * @th..
Read moreJob 생성 JobExecutionConfiguration.java 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.annotation.StepBuilderFactory; import org.sp..
Read more컨슈머 그룹 토픽의 파티션으로부터 데이터를 가져가기 위해 컨슈머를 운영하는 방법은 2가지다. 1) 1개 이상의 컨슈머로 이루어진 컨슈머 그룹을 운영 2) 토픽의 특정 파티션만 구독하는 컨슈머를 운영 1개 이상의 컨슈머로 이루어진 컨슈머 그룹을 운영 컨슈머를 각 컨슈머 그룹으로부터 격리된 환경에서 안전하게 운영할 수 있도록 도와주는 방식이다. 컨슈머 그룹으로 묶인 컨슈머들은 토픽의 1개 이상 파티션들에 할당되어 데이터를 가져갈 수 있다. 컨슈머 1개로 이루어진 컨슈머 그룹이 4개의 파티션에 할당 컨슈머 그룹으로 묶인 컨슈머가 토픽을 구독해서 데이터를 가져갈때, 1개의 파티션은 최대 1개의 컨슈머에 할당 가능하다. 그리고 1개 컨슈머는 여러개의 파티션에 할당될 수 있다. 이러한 특징으로 컨슈머 그룹의 컨슈머..
Read more코틀린에서의 final 자바에서는 final 로 명시적으로 상속을 금지하지 않는 모든 클래스를 다른 클래스가 상속할 수 있다. 이렇게 기본적으로 상속이 가능하면 편리한 경우도 많지만 문제가 생기는 경우도 많다. 취약한 기반 클래스(fragile base class) 하위 클래스가 기반 클래스에 대해 가졌던 가정이 기반 클래스를 변경함으로써 깨져버린 경우에 생긴다. 어떤 클래스가 자신을 상속하는 방법에 대해 정확한 규칙을 제공하지 않는다면 그 클래스의 클라이언트는 기반 클래스를 작성한 사람의 의도와 다른 방식으로 메서드를 오버라이드할 위험이 있다. 모든 하위 클래스를 분석하는 것은 불가능 하므로 기반 클래스를 변경하는 경우 하위 클래스의 동작이 예키지않게 바뀔 수도 있다는 면에서 기반 클래스는 취약하다. ..
Read moreJob 생성 JobParameterConfiguration.java 파라미터를 출력하는 Job을 생성하자. import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.batch.core.Job; import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.Step; import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.configuration.annotation.JobBui..
Read moreSpringBatch 시작하기 HelloJobConfiguration import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; 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.annotatio..
Read more코틀린 인터페이스 코틀린 인터페이스는 자바8 인터페이스와 비슷하다. 코틀린 인터페이스 안에는 추상 메서드뿐 아니라 구현이 있는 메서드도 정의할 수 있다. 다만 인터페이스에는 아무런 상태(필드)도 들어갈 수 없다. 코틀린에서 클래스는 class로 정의하지만 인터페이스는 interface를 사용한다. 예제 Clickable.kt interface Clickable { fun click() fun showOff() = println("I'm clicked") // default 구현이 있는 메서드 } 인터페이스 메서드도 디폴트 구현을 제공할 수 있다. 자바에서는 default를 메서드 앞에 붙여야하지만, 코틀린에서는 특별히 쓸 필요가 없다. 그냥 메서드 본문을 메서드 시그니처 뒤에 추가하면 된다. 이 인터페이..
Read more프로듀서 실행 바로가기 https://devfunny.tistory.com/746?category=829528 [아파치 카프카 어플리케이션 프로그래밍] 4. 프로젝트 생성하여 카프카 프로듀서 실행 Topic 생성 1) docker kafka 컨테이너 접속 docker container exec -it kafka bash 2) 토픽 생성 토픽명 : test kafka-topics.sh --create --topic test --bootstrap-server localhost:9092 --partitions 1 예제파.. devfunny.tistory.com Topic 생성 1) docker kafka 컨테이너 접속 docker container exec -it kafka bash 2) 토픽 생성 토픽명 :..
Read more특정 파티션 설정 프로듀서 사용환경에 따라 특정 데이터를 가지는 레코드를 특정 파티션으로 보내야할 때가 있다. 예를 들어, Pangyo라는 값을 가진 메시지 키가 0번 파티션으로 들어가야 한다고 가정하자. 기본 설정 파티셔너를 사용할 경우 메시지 키의 해시 값을 파티션에 매칭하여 데이터를 전송하므로 어느 파티션에 들어가는지 알 수 없다. 이때 Partitioner 인터페이스를 사용하여 사용자 정의 파티셔너를 생성하면 Pangyo라는 값을 가진 메시지 키에 대해서 무조건 파티션 0번으로 지정하도록 설정할 수 있다. 이렇게 지정할 경우 토픽의 파티션이 변경되더라도 Pangyo 라는 메시지 키를 가진 데이터는 파티션 0번에 적재된다. CustomPartitioner.java public class Custom..
Read more로컬함수 확장 예제 : 데이터베이스에 사용자 객체를 저장하기전, 각 필드의 validation 을 검증하는 로직 1단계. 코드 중복을 보여주는 예제 class User(val id: Int, val name: String, val address: String) fun saveUser(user: User) { if (user.name.isEmpty()) { throw IllegalArgumentException ( "Can't save User ${user.id}: empty Name" ) } if (user.address.isEmpty()) { throw IllegalArgumentException ( "Can't save User ${user.id}: empty Address" ) } } fun mai..
Read more코틀린 문자열 (String) 코틀린 문자열은 자바 문자열과 같다. 코틀린 코드가 만들어낸 문자열을 아무 자바 메서드에 넘겨도 되며, 자바 코드에서 받은 문자열을 아무 코틀린 표준 라이브러리 함수에 전달해도 문제가 없다. 문자열 나누기 1) String의 split 메서드 자바에서 split 메서드를 보자. "12.345-6.A".split(".") 위 코드의 결과는 [12, 345-6, A]가 아닌 빈 문자열이다. 자바의 split의 구분 문자열은 실제로 정규식이며, 마침표(.)는 모든 문자를 나타내는 정규식으로 해석된다. 코틀린에서는 split 확장 함수를 제공함으로써 혼동을 야기하는 메서드를 감춘다. fun main() { println("12.345-6.A".split(".")) // [12, 3..
Read more가변 길이 인자 (vararg) 가변 길이 인자는 메서드를 호출할때 원하는 개수만큼 값을 인자로 넘기면 자바 컴파일러가 배열에 그 값들을 넣어주는 기능이다. 코틀린의 가변 길이 인자도 자바와 비슷하다. 타입 뒤에 ...를 붙이는 대신, 코틀린에서는 파라미터 앞에 vararg 변경자를 붙인다. 코틀린은 배열을 명시적으로 풀어서 배열의 각 원소가 인자로 전달되게 해야한다. 스프레드 (spread) 연산자가 그런 작업을 해준다. (배열 앞에 *를 붙인다.) 예제 리스트를 생성하는 함수를 호출할때 원하는 만큼 많이 원소를 전달할 수 있다. fun main() { val list = listOf(2, 3, 5, 7, 11) } listOf 메서드 listOf(vararg elements: T) public fun..
Read more프로듀서 프로듀서는 카프카 브로커로 데이터를 전송할때 내부적으로 파티셔녀, 배치 생성 단계를 거친다. 전송하고자 하는 데이터는 ProducerRecord 인스턴스를 생성하여 설정한다. 필수 파라미터는 토픽과 메시지 값이다. ProducerRecord 생성시 추가 파라미터를 사용하여 오버로딩하여 ProductRecord의 내부 변수를 선언할 수 있다. 파티션 번호를 직접 지정하거나 타임스탬프를 설정, 메시지 키를 설정할 수도 있다. KafkaProducer 인스턴스가 send()를 호출하면 ProducerRecord는 파티셔녀(partitioner)에서 토픽의 어느 파티션으로 전송될 것인지 정해진다. Properties configs = new Properties(); configs.put... Kafka..
Read moreTopic 생성 1) docker kafka 컨테이너 접속 docker container exec -it kafka bash 2) 토픽 생성 토픽명 : test kafka-topics.sh --create --topic test --bootstrap-server localhost:9092 --partitions 1 예제파일 만들기 build.gradle dependencies { implementation 'org.springframework.boot:spring-boot-starter' implementation 'org.springframework.kafka:spring-kafka' runtimeOnly 'com.h2database:h2' } SimpleProducer.java import lombo..
Read more