SpringBatch 시작하기 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..
코틀린 인터페이스 코틀린 인터페이스는 자바8 인터페이스와 비슷하다. 코틀린 인터페이스 안에는 추상 메서드뿐 아니라 구현이 있는 메서드도 정의할 수 있다. 다만 인터페이스에는 아무런 상태(필드)도 들어갈 수 없다. 코틀린에서 클래스는 class로 정의하지만 인터페이스는 interface를 사용한다. 예제 Clickable.kt interface Clickable { fun click() fun showOff() = println("I'm clicked") // default 구현이 있는 메서드 } 인터페이스 메서드도 디폴트 구현을 제공할 수 있다. 자바에서는 default를 메서드 앞에 붙여야하지만, 코틀린에서는 특별히 쓸 필요가 없다. 그냥 메서드 본문을 메서드 시그니처 뒤에 추가하면 된다. 이 인터페이..
프로듀서 실행 바로가기 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) 토픽 생성 토픽명 :..
특정 파티션 설정 프로듀서 사용환경에 따라 특정 데이터를 가지는 레코드를 특정 파티션으로 보내야할 때가 있다. 예를 들어, Pangyo라는 값을 가진 메시지 키가 0번 파티션으로 들어가야 한다고 가정하자. 기본 설정 파티셔너를 사용할 경우 메시지 키의 해시 값을 파티션에 매칭하여 데이터를 전송하므로 어느 파티션에 들어가는지 알 수 없다. 이때 Partitioner 인터페이스를 사용하여 사용자 정의 파티셔너를 생성하면 Pangyo라는 값을 가진 메시지 키에 대해서 무조건 파티션 0번으로 지정하도록 설정할 수 있다. 이렇게 지정할 경우 토픽의 파티션이 변경되더라도 Pangyo 라는 메시지 키를 가진 데이터는 파티션 0번에 적재된다. CustomPartitioner.java public class Custom..
로컬함수 확장 예제 : 데이터베이스에 사용자 객체를 저장하기전, 각 필드의 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..
코틀린 문자열 (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..
가변 길이 인자 (vararg) 가변 길이 인자는 메서드를 호출할때 원하는 개수만큼 값을 인자로 넘기면 자바 컴파일러가 배열에 그 값들을 넣어주는 기능이다. 코틀린의 가변 길이 인자도 자바와 비슷하다. 타입 뒤에 ...를 붙이는 대신, 코틀린에서는 파라미터 앞에 vararg 변경자를 붙인다. 코틀린은 배열을 명시적으로 풀어서 배열의 각 원소가 인자로 전달되게 해야한다. 스프레드 (spread) 연산자가 그런 작업을 해준다. (배열 앞에 *를 붙인다.) 예제 리스트를 생성하는 함수를 호출할때 원하는 만큼 많이 원소를 전달할 수 있다. fun main() { val list = listOf(2, 3, 5, 7, 11) } listOf 메서드 listOf(vararg elements: T) public fun..
프로듀서 프로듀서는 카프카 브로커로 데이터를 전송할때 내부적으로 파티셔녀, 배치 생성 단계를 거친다. 전송하고자 하는 데이터는 ProducerRecord 인스턴스를 생성하여 설정한다. 필수 파라미터는 토픽과 메시지 값이다. ProducerRecord 생성시 추가 파라미터를 사용하여 오버로딩하여 ProductRecord의 내부 변수를 선언할 수 있다. 파티션 번호를 직접 지정하거나 타임스탬프를 설정, 메시지 키를 설정할 수도 있다. KafkaProducer 인스턴스가 send()를 호출하면 ProducerRecord는 파티셔녀(partitioner)에서 토픽의 어느 파티션으로 전송될 것인지 정해진다. Properties configs = new Properties(); configs.put... Kafka..
Topic 생성 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..
확장함수 기존 자바 API를 재작성하지 않고도 자바 코드를 변환할 수 있어야한다. 어떤 클래스의 멤버 메서드인것처럼 호출할 수 있지만 그 클래스의 밖에 선언된 함수다. 확장함수를 만들려면 추가하려는 함수 이름 앞에 그 함수가 확장할 클래스의 이름을 덧붙이기만 하면 된다. - 객체 타입 : 클래스 이름 - 수신 객체 : 확장 함수가 호출되는 대상이 되는 값 확장 함수가 캡슐화를 깨지는 않는다. 클래스 안에서 정의한 메서드와 달리 확장 함수 안에서는 클래스 내부에서만 사용할 수 있는 비공개(private) 멤버나 보호된(protected) 멤버를 사용할 수 없다. 클래스의 멤버 메서드와 확장 함수를 모두 '메서드'라고 부르자. 클라이언트에게 자신이 호출하려는 메서드가 확장함수인지 멤버 메서드인지의 여부는 중..
카프카 브로커 카프카 클라이언트와 데이터를 주고받기 위해 사용하는 주체이자, 데이터를 분산 저장하여 장애가 발생하더라도 안전하게 사용할 수 있도록 도와주는 애플리케이션이다. 하나의 서버에는 한 개의 카프카 브로커 프로세스가 실행된다. 데이터를 안전하게 보관하고 처리하기 위해 3개 이상의 브로커 서버를 1개의 클러스터로 묶어서 운영한다. 카프카 클러스터로 묶인 브로커들은 프로듀서가 보낸 데이터 를 안전하게 분산 저장하고 복제하는 역할을 수행한다. 카프카 브로커가 프로듀서로부터 데이터를 전달받았을때 프로듀서가 요청한 토픽의 파티션에 데이터를 저장하고, 컨슈머가 데이터를 요청하면 파티션에 저장된 데이터를 전달한다. 프로듀서로부터 전달된 데이터는 파일 시스템에 저장된다. 카프카는 메모리나 데이터베이스에 저장하지..
"책으로 공부하는 Apache Kafka" 카프카 설치 교재에서는 AWS EC2를 사용하여 설치하고 있지만, Docker를 사용하여 실습해보자. https://devfunny.tistory.com/429 docker로 Kafka, Zookeeper 설치 (with docker-compose) Docker 이미지 설치 1) Kafka 설치 docker pull wurstmeister/kafka 2) zookeeper 설치 docker pull wurstmeister/zookeeper docker-compose 파일 생성 1) docker-compose.yml 파일 생성 (local PC에 경로는 자유.. devfunny.tistory.com Mac Docker 설치 https://docs.docker.co..