Listner 생성 및 설정 JobRepositoryListener.java import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.batch.core.*; import org.springframework.batch.core.repository.JobRepository; import org.springframework.stereotype.Component; @Component @RequiredArgsConstructor @Slf4j public class JobRepositoryListener implements JobExecutionListener { private final Jo..
Read moreBATCH 테이블 Prefix 변경해보기 schema-postgresql.sql org.springframework.batch/spring-batch-core/4.3.5/b5ff5d227600df2ba087344160db2b8a38476cb3/spring-batch-core-4.3.5.jar!/org/springframework/batch/core/schema-postgresql.sql 위 파일의 쿼리를 가져와서, BATCH_ 부분을 SYSTEM_으로 변경해준다. -- Autogenerated: do not edit this file CREATE TABLE SYSTEM_JOB_INSTANCE ( JOB_INSTANCE_ID BIGINT NOT NULL PRIMARY KEY , VERSION BIGINT ..
Read more[Kotlin in Action] 19. 코틀린의 toString(), equals(), hashCode(), copy() 메서드 구현과 자동생성 data 변경자, 클래스 위임 by
모든 클래스가 정의해야하는 메서드 자바와 마찬가지로 코틀린 클래스도 toString, equals, hashCode 등을 오버라이드 할 수 있다. 코틀린은 이런 메서드 구현을 자동으로 생성해줄 수 있다. 자동으로 생성해주기전, 메서드를 직접 구현해보자. toString() 구현 자바처럼 코틀린의 모든 클래스도 인스턴스의 문자열 표현을 얻을 방법을 제공한다. class CustomClient(val name: String, val postalCode: Int) { /* toString */ override fun toString() = "Client(name=$name, postalCode=$postalCode)" } equals() 구현 코틀린에서 == 연산자가 내부적으로 equals를 호출해서 객체를 ..
Read more들어가기전 토픽과 파티션의 기본개념 포스팅 바로가기 https://devfunny.tistory.com/380 카프카의 토픽과 파티션, 오프셋 토픽 카프카에서는 프로듀서가 전달하는 메시지를 '토픽'에 저장하고, 컨슈머가 해당 '토픽'에서 메시지를 가져온다고 하였다. 메시지의 저장소 역할을 하는 토픽은 데이터베이스의 '테이블'의 devfunny.tistory.com 토픽 카프카의 시작과 끝이다. 카프카를 사용하는 것은 토픽을 만들면서 시작하고, 토픽을 삭제하면 데이터는 삭제되고 파이프라인은 중단된다. 데이터의 생명주기 한가운데에 토픽이 있다. 적정 파티션 개수 토픽 생성시 파티션 개수 고려사항 - 데이터 처리량 - 메시지 키 사용 여부 - 브로커, 컨슈머 영향도 파티션의 개수가 많아질수록 1:1 매핑되는 ..
Read more인터페이스의 프로퍼티 구현 코틀린에서는 인터페이스에 추상 프로퍼티 선언을 넣을 수 있다. interface InterfaceUser { val nickname: String // 추상 프로퍼티 } InterfaceUser 인터페이스를 구현하는 클래스가 nickname 의 값을 얻을 수 있는 방법을 제공해야한다. 인터페이스에 있는 프로퍼티 선언에는 뒷받침하는 필드나 게터 등의 정보가 들어있지 않다. 사실 인터페이스는 아무 상태도 포함할 수 없으므로 상태를 저장할 필요가 있다면 인터페이스를 구현한 하위 클래스에서 상태 저장을 위한 프로퍼티 등을 만들어야한다. 예시 PrivateUser 별명을 저장만 한다. 주 생성자 안에 프로퍼티를 직접 선언하는 간결한 구문을 사용한다. User의 추상 프로퍼티를 구현하고 ..
Read more문제 https://programmers.co.kr/learn/courses/30/lessons/43162 코딩테스트 연습 - 네트워크 네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있 programmers.co.kr 풀이코드 import java.util.*; /** * @Date 2022/05/24 * @URL https://programmers.co.kr/learn/courses/30/lessons/43162 */ public class P43162_네트워크 { static int sumCount = 0; static boolean[][] visited; /*..
Read moreExecutionContext 개념 https://devfunny.tistory.com/485 [스프링 배치] 배치 잡의 세션 ExecutionContext 상황 스프링 배치가 진행중이다. 진행 도중에 오류가 발생했고, 실패한 시점부터 처리를 다시 시작해야한다. 이 경우에 스프링 배치는 실패한 시점을 어떻게 알아낼 수 있을까? 실패시마다, 사 devfunny.tistory.com 실습해보기 ExecutionContextConfiguration.java ExecutionContextTasklet1.java ExecutionContextTasklet2.java ExecutionContextTasklet3.java ExecutionContextTasklet4java ExecutionContextConfigur..
Read more카프카의 AdminClient 제공 실제 운영환경에서는 프로듀서와 컨슈머를 통해 데이터를 주고받는것 만큼 카프카에 설정된 내부 옵션을 설정하고 확인하는것이 중요하다. 내부 옵션을 확인하는 가장 확실한 방법은 브로커 중 한대에 접속하여 카프카 브로커 옵션을 확인하는 것이다. 이는 매우 번거롭다. 카프카 클라이언트에서는 내부 옵션들을 설정하거나 조회하기 위해 AdminClient 클래스를 제공한다. 이 클래스를 활용하면 클러스터의 옵션과 관련된 부분을 자동화할 수 있다. 활용예시 카프카 컨슈머를 멀티 스레드로 생성할때, 구독하는 파티션 개수만큼 스레드를 생성하고 싶을때, 스레드 생성 전에 해당 토픽의 파티션 개수를 어드민 API를 통해 가져올 수 있다. AdminClient 클래스로 구현한 웹 대시보드를 통..
Read more생성자 자바에서는 생성자를 하나 이상 선언할 수 있다. 코틀린은 주(primary) 생성자와 부(secondary) 생성자를 구분한다. 또한 코틀린에서는 초기화블록(initializer block)을 통해 초기화 로직을 추가할 수 있다. 주 생성자 (primary) 중괄호가 없고 괄호 사이에 val 선언만 존재한다. 클래스 이름 뒤에 오는 괄호로 둘러싸인 코드를 '주 생성자'라고 부른다. class User1(val nickname: String) 위 코드의 실제 로직은 아래와 같다. class User2 constructor(val _nickname: String) { //_nickname : 프로퍼티와 생성자 파라미터를 구분해준다. // 주 생성자는 생성자 파라미터를 저장하고 그 생성자 파라미터에 의..
Read more문제 https://programmers.co.kr/learn/courses/30/lessons/92334 코딩테스트 연습 - 신고 결과 받기 문제 설명 신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다. 각 유저는 한 번에 한 명의 programmers.co.kr 풀이코드 import java.util.*; import java.util.stream.Collectors; /** * @Date 2022/05/23 * @URL https://programmers.co.kr/learn/courses/30/lessons/92334 */ public class P92334_신고_결과받기 { public static v..
Read more상위클래스 Expr 숫자를 표현하는 Num 덧셈 연산을 표현하는 Sum 위 2개의 하위 클래스가 있다. when 식에서 이 모든 하위클래스를 처리하면 편리하다. interface Expr class Num(val value: Int) : Expr class Sum(val left: Expr, val right: Expr) : Expr fun eval(e: Expr) : Int = when (e) { is Num -> e.value is Sum -> eval(e.right) + eval(e.left) else -> // else 분기가 반드시 있어야한다. throw IllegalArgumentException("Unknown expression") } when을 사용해서 Expr 타입의 값을 검사할때 꼭 ..
Read more중첩클래스 자바처럼 코틀린에서도 클래스 안에 다른 클래스를 선언할 수 있다. 클래스 안에 다른 클래스를 선언하면 도우미 클래스를 캡슐화하거나 코드 정의를 그 코드를 사용하는 곳에 둘때 유용하다. 자바와의 차이점 코틀린의 중첩 클래스는 명시적으로 요청하지않는 한 바깥쪽 클래스 인스턴스에 대한 접근 권한이 없다는 점이다. JAVA ButtonJava.java public class ButtonJava implements View { @NotNull @Override public State getCurrentState() { return new ButtonState(); } @Override public void restoreState(@NotNull State state) { } /** * 중첩 클래스 */..
Read more컨슈머 토픽, 파티션 명시적 선언 PartitionAssignConsumer.java package com.example.consumer._partition; import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.consumer.*; import org.apache.kafka.common.TopicPartition; import org.apache.kafka.common.serialization.StringDeserializer; import java.time.Duration; import java.util.*; @Slf4j public class PartitionAssignConsumer { private final static Strin..
Read more들어가기전 Batch Job 수행시 Step 실패하는 과정 첫번째 포스팅을 참고하자. https://devfunny.tistory.com/758 [SringBatch 실습] 3. Batch Job 수행시 Step 실패하는 경우 Job 생성 JobExecutionConfiguration.java import lombok.RequiredArgsConstructor; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.. devfunny.tistory.com Job 생성 StepExecutionConfiguration.java import lombo..
Read more리밸런싱 개념 아래 포스팅에서 리밸런싱 내용을 확인하자. https://devfunny.tistory.com/757 [아파치 카프카 어플리케이션 프로그래밍] 8. 컨슈머의 중요 개념과 옵션값 컨슈머 그룹 토픽의 파티션으로부터 데이터를 가져가기 위해 컨슈머를 운영하는 방법은 2가지다. 1) 1개 이상의 컨슈머로 이루어진 컨슈머 그룹을 운영 2) 토픽의 특정 파티션만 구독하는 컨슈머 devfunny.tistory.com 예제 컨슈머 그룹에서 컨슈머가 추가 또는 제거되면 파티션을 컨슈머에 재할당하는 과정인 리밸런스가 일어난다. poll() 메서드를 통해 반환받은 데이터를 모두 처리하기 전에 리밸런스가 발생하면 데이터를 중복 처리할 수 있다. poll() 메서드를 통해 받은 데이터 중 일부를 처리했으나 커밋하지..
Read more