728x90

분류 전체보기 288

QuerydslNoOffsetPagingItemReader fetchJoin

SpringBatch chunk 단위 처리 구현시 querydsl 을 사용하려고 했다. 그런데 SpringBatch 에서 querydsl 을 지원하지 않아 관련 Reader 구현체가 제공되지 않아 오픈소스로 제공되는 QuerydslNoOffsetPagingItemReader 를 사용했다. 그런데 reader 쿼리의 fetchJoin 이 동작하지 않는다. 내가 구현한 reader는 대략 아래와 같다. // 1. No Offset Option val options: QuerydslNoOffsetNumberOptions = QuerydslNoOffsetNumberOptions(test.seq, Expression.ASC) // 2. Querydsl Reader return QuerydslNoOffsetPagi..

Backend/Spring+Boot 2022.01.06

[Spring Batch] Job flow

Step 의 상태에 따라 대략 아래와 같이 처리를 분기할 수 있다. @Bean fun mainJob(): Job { return jobBuilderFactory["simpleJob"] .start(mainStep()) //mainStep 시작 .on("FAILED") //FAILED 일 경우 .to(errorStep()) //errorStep 으로 이동 .on("*") // errorStep의 결과 관계 없이 .end() // Flow 종료 .from(mainStep()) //mainStep의 결과가 .on("*") // FAILED 이외의 모든 경우 .end() // Flow 종료 .end() //Job 종료 .build() } 위 Step 이 실패했을 경우 적절한 에러처리를 위해 에러 Step 으로 ..

Backend/Spring+Boot 2022.01.04

[JPA] querydsl 정리

select 결과 일부만 가져오기 Projections 을 사용한다. Projections 을 활용하는 여러가지 방법이 있는데 가장 선호되는 방식은 @QueryProjection 이다. Projections 으로 읽어온 데이턴느 영속상태가 아니다. 즉, Dirty Checking 을 염려할 필요가 없다. Projections 은 기본이 즉시로딩이다. 지연로딩은 안되는듯? querydsl 비교식 //Standard Alternative expr isNotNull expr is not(null) expr isNull expr is null expr eq "Ben" expr === "Ben" expr ne "Ben" expr !== "Ben" expr append "X" expr + "X" expr isEmp..

Backend/JPA 2022.01.03

[Kotlin] 함수형 인터페이스

만약 병렬처리를 위해 매번 새로운 인스턴스를 생성해야 하고 생성해야 할 인스턴스에 메소드가 하나라면 함수형 인터페이스를 고려해볼 수 있다. 코틀린에서는 이를 SAM 인터페이스 라고도 부른다. 물론 고전적인 방식으로 함수 하나만 가지고 있는 클래스를 선언해서 인스턴스를 생성해서 사용해도 되지만 함수형 인터페이스를 사용할 경우 익명클래스를 정의할 필요없이 람다식으로 대체할 수 있어서 좀 더 깔끔하고 직관적으로 코드를 완성할 수 있다. 코틀린에서 함수형 인터페이스는 아래와 같이 사용한다. 만든다. interface 지시어 앞에 fun 만 붙여주면 된다. 함수형 인터페이스 선언 interface 지시어 앞에 fun 만 붙여주면 된다. fun interface TestFunc { fun test(param1: S..

Backend/Kotlin 2021.12.31

[Kafka] 카프카 명령어 정리

카프카 설치 폴더 의 bin 폴더로 이동하면 카프카 상태를 확인할 수 있는 몇가지 쉘 들이 있다. 결국 이를 이용하는 것이 카프카 명령어다. 토픽리스트 확인 ./kafka-topics.sh --list --bootstrap-server ${broker-host} 토픽생성 ./kafka-topics.sh --create --topic ${topic-name} --zookeeper ${zookeeper-host} --partitions 1 --replication-factor 1 토픽 상세보기 ./kafka-topics.sh --describe --bootstrap-server ${broker-host} --topic ${topic-name} 토픽에 데이터 넣기 ./kafka-console-producer...

Backend/Kafka 2021.12.30

docker-compose 로 로컬 카프카 띄우기

검색하면 예제가 많지만 난 안되서 한참을 헤맸다. 최종적으로 성공한 docker-compose.yaml 은 아래와 같다. version: '2' services: zookeeper: image: wurstmeister/zookeeper:3.4.6 container_name: local-zookeeper ports: - "2181:2181" kafka: image: wurstmeister/kafka:2.13-2.8.1 container_name: local-kafka ports: - "9092:9092" depends_on: - zookeeper environment: KAFKA_ZOOKEEPER_CONNECT: local-zookeeper:2181 KAFKA_ADVERTISED_HOST_NAME: loc..

[Kotlin] 확장함수 언제 어떻게 사용해야 할까?

코틀린에는 확장함수 라는 기능이 있다. 자바에서는 메소드를 사용할 때 파라미터는 반드시 메소드의 인자로 포함되어야 한다. 즉, 호출 단계에서 메소드가 우선 작성되고 재료가 되는 파라미터가 그곳에 포함되는 방식이다. 예를 들면 아래와 같다. public String format(LocalDate localDate, String pattern){ return localDate.format(DateTimeFormatter.ofPattern(format)); } String dateStr = format(LocalDate.now(), "yyyy-MM-dd") 코틀린에서도 위와 같은 방식으로 구현해도 되지만 아래와 같이 확장함수 방식으로 구현할 수도 있다. fun LocalDate.format(pattern: S..

Backend/Kotlin 2021.12.24

코틀린 with, apply, also, let, run

일단 모두 지정된 객체의 유효범위를 람다식 내부로 제한하는 기능을 한다. 즉 어떠한 객체를 특정 변수에 할당해서 활용한다고 생각하면 되는데 그 영역을 블록으로 제한한다고 생각하면 된다. 각각의 의미만 나열하면 오히려 어떤걸 활용해야 할 지 감이 안 올 수 있기 때문에 연관지어서 정리하도록 하겠다. 제일먼저 with 는 가장 단순하다. 지정된 객체를 람다식 안에서 this 로 참조할 수 있고 객체를 수정할 수도 있으며 원하는 값을 리턴하거나 리턴하지 않을 수도 있다. var map = mutableMapOf("A" to "aaa") var map2 = with(map) { this["A"] = "bbb" this } var map3 = with(map) { this["A"] = "ccc" } println..

Backend/Kotlin 2021.12.23
728x90