생성자 자바에서는 생성자를 하나 이상 선언할 수 있다. 코틀린은 주(primary) 생성자와 부(secondary) 생성자를 구분한다. 또한 코틀린에서는 초기화블록(initializer block)을 통해 초기화 로직을 추가할 수 있다. 주 생성자 (primary) 중괄호가 없고 괄호 사이에 val 선언만 존재한다. 클래스 이름 뒤에 오는 괄호로 둘러싸인 코드를 '주 생성자'라고 부른다. class User1(val nickname: String) 위 코드의 실제 로직은 아래와 같다. class User2 constructor(val _nickname: String) { //_nickname : 프로퍼티와 생성자 파라미터를 구분해준다. // 주 생성자는 생성자 파라미터를 저장하고 그 생성자 파라미터에 의..
상위클래스 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 타입의 값을 검사할때 꼭 ..
중첩클래스 자바처럼 코틀린에서도 클래스 안에 다른 클래스를 선언할 수 있다. 클래스 안에 다른 클래스를 선언하면 도우미 클래스를 캡슐화하거나 코드 정의를 그 코드를 사용하는 곳에 둘때 유용하다. 자바와의 차이점 코틀린의 중첩 클래스는 명시적으로 요청하지않는 한 바깥쪽 클래스 인스턴스에 대한 접근 권한이 없다는 점이다. JAVA ButtonJava.java public class ButtonJava implements View { @NotNull @Override public State getCurrentState() { return new ButtonState(); } @Override public void restoreState(@NotNull State state) { } /** * 중첩 클래스 */..
컨슈머 토픽, 파티션 명시적 선언 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..
들어가기전 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..
리밸런싱 개념 아래 포스팅에서 리밸런싱 내용을 확인하자. https://devfunny.tistory.com/757 [아파치 카프카 어플리케이션 프로그래밍] 8. 컨슈머의 중요 개념과 옵션값 컨슈머 그룹 토픽의 파티션으로부터 데이터를 가져가기 위해 컨슈머를 운영하는 방법은 2가지다. 1) 1개 이상의 컨슈머로 이루어진 컨슈머 그룹을 운영 2) 토픽의 특정 파티션만 구독하는 컨슈머 devfunny.tistory.com 예제 컨슈머 그룹에서 컨슈머가 추가 또는 제거되면 파티션을 컨슈머에 재할당하는 과정인 리밸런스가 일어난다. poll() 메서드를 통해 반환받은 데이터를 모두 처리하기 전에 리밸런스가 발생하면 데이터를 중복 처리할 수 있다. poll() 메서드를 통해 받은 데이터 중 일부를 처리했으나 커밋하지..
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..
Tasklet 클래스 생성 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..
Job 생성 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..
컨슈머 그룹 토픽의 파티션으로부터 데이터를 가져가기 위해 컨슈머를 운영하는 방법은 2가지다. 1) 1개 이상의 컨슈머로 이루어진 컨슈머 그룹을 운영 2) 토픽의 특정 파티션만 구독하는 컨슈머를 운영 1개 이상의 컨슈머로 이루어진 컨슈머 그룹을 운영 컨슈머를 각 컨슈머 그룹으로부터 격리된 환경에서 안전하게 운영할 수 있도록 도와주는 방식이다. 컨슈머 그룹으로 묶인 컨슈머들은 토픽의 1개 이상 파티션들에 할당되어 데이터를 가져갈 수 있다. 컨슈머 1개로 이루어진 컨슈머 그룹이 4개의 파티션에 할당 컨슈머 그룹으로 묶인 컨슈머가 토픽을 구독해서 데이터를 가져갈때, 1개의 파티션은 최대 1개의 컨슈머에 할당 가능하다. 그리고 1개 컨슈머는 여러개의 파티션에 할당될 수 있다. 이러한 특징으로 컨슈머 그룹의 컨슈머..
코틀린에서의 final 자바에서는 final 로 명시적으로 상속을 금지하지 않는 모든 클래스를 다른 클래스가 상속할 수 있다. 이렇게 기본적으로 상속이 가능하면 편리한 경우도 많지만 문제가 생기는 경우도 많다. 취약한 기반 클래스(fragile base class) 하위 클래스가 기반 클래스에 대해 가졌던 가정이 기반 클래스를 변경함으로써 깨져버린 경우에 생긴다. 어떤 클래스가 자신을 상속하는 방법에 대해 정확한 규칙을 제공하지 않는다면 그 클래스의 클라이언트는 기반 클래스를 작성한 사람의 의도와 다른 방식으로 메서드를 오버라이드할 위험이 있다. 모든 하위 클래스를 분석하는 것은 불가능 하므로 기반 클래스를 변경하는 경우 하위 클래스의 동작이 예키지않게 바뀔 수도 있다는 면에서 기반 클래스는 취약하다. ..
Job 생성 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..