Skip to main content
Haril Song
Owner, Software Engineer at 42dot

Haril is a software engineer who loves to build things. He is passionate about open-source and loves to contribute to the community. He is the owner of this blog.

View all authors

[Spring Batch] KafkaItemReader

· 3 min read
Haril Song
Owner, Software Engineer at 42dot
info

저는 Docker 를 사용하여 Kafka 설치 후 이번 글을 작성했지만 해당 내용은 이번 글에서 다루지 않습니다.

KafkaItemReader..?

Spring batch 에서는 Kafka Topic 의 데이터를 처리하는 경우를 위해서 KafkaItemReader 를 제공하고 있습니다.

간단한 배치를 하나 만들어보겠습니다.

Example

먼저 관련 의존성을 추가해줍니다.

Qodana 로 간단하게 코드 정적 분석하기

· 3 min read
Haril Song
Owner, Software Engineer at 42dot

Qodana?

Qodana 는 Jetbrains 에서 제공하는 코드 품질 개선 도구입니다. 기본적인 사용은 아주 간단하게 사용할 수 있어서 소개해보려고 합니다.

우선 Docker 가 설치되어 있는 환경이어야 합니다.

docker run --rm -it -p 8080:8080 \
-v <source-directory>/:/data/project/ \
-v <output-directory>/:/data/results/ \
jetbrains/qodana-jvm --show-report

저는 Java 애플리케이션을 분석할 것이므로 jvm 이미지를 사용해주었습니다. 만약 다른 언어를 사용하고 있다면 Qodana 에서 찾아서 쓰시면 됩니다.

  • <source-directory> 에 분석하고자 하는 프로젝트의 경로를 적어줍니다.
  • <output-directory> 에는 분석 결과가 저장될 경로를 입력합니다. 아래에서 이어 설명합니다.

저는 분석 결과를 저장하기 위해서 root 경로에 qodana 라는 폴더를 생성한 뒤 사용하였습니다.

[Spring Batch] Custom constraint writer 구현

· 6 min read
Haril Song
Owner, Software Engineer at 42dot

문제 상황 🧐

최근 PostgreSQLUpsert 를 특정 로직에서 사용하는 배치를 설계했습니다. 구현 도중 비즈니스 사항의 변경으로 복합 유니크 조건에 특정 컬럼을 추가하게 되었는데요.

복합 유니크 컬럼의 unique 조건은 특정 컬럼의 null 중복은 막지 못하는 점이 문제가 되었습니다.

예제로 문제가 된 부분을 살펴보겠습니다.

[Kotlin] Infix functions

· 2 min read
Haril Song
Owner, Software Engineer at 42dot

Kotlin 에는 Infix function 이라는 메서드 정의 방법이 있는데요, Java 를 주언어로 쓰는동안엔 상상도 못했던 문법이라 처음 Kotlin 을 시작하시는 분들을 위해 소개합니다.

단일 매개변수를 가진 멤버 함수는 Infix functions 로 변환될 수 있습니다.

Infix functions 의 대표적인 예로는 기본 라이브러리에 포함된 to 가 있습니다.

val pair = "Ferrari" to "Katrina"
println(pair)
// (Ferrari, Katrina)

필요에 따라 to 와 같은 infix functions 을 새로 정의할 수 있는데 예를 들면 Int 를 다음과 같이 확장할 수 있습니다.

[Kotlin] 향상된 반복문(Loop)

· 3 min read
Haril Song
Owner, Software Engineer at 42dot

Kotlin 에서는 Java 보다 훨씬 심플하고 편리한 반복문을 작성할 수 있다. 어떻게 사용할 수 있는지 살펴보자.

1. .. operator

val fruits = listOf("Apple", "Banana", "Cherry", "Durian")

fun main() {
for (index in 0..fruits.size - 1) {
val fruit = fruits[index]
println("$index: $fruit")
}
}

.. 을 사용하면 1씩 증가하는 전통적인 반복문이 만들어진다.

Kotlin 으로 지구 타원체 활용하기

· 4 min read
Haril Song
Owner, Software Engineer at 42dot

Background

earth image reference[^footnote]

지구는 평평하지도 완벽한 구형(Sphere)도 아닌 비표준 타원체(Ellipsoid)임을 고려하면 서로 다른 경도 및 위도 위치에 있는 두 점 사이의 거리를 빠르고 정확하게 계산하는 완벽한 공식은 없습니다.

그래도 geotools 라이브러리를 사용하면 수학적으로 보정된 근사치를 꽤나 간단하게 얻어낼 수 있습니다.

@JsonNaming 사용 방법

· 3 min read
Haril Song
Owner, Software Engineer at 42dot

API 에서 제공하는 json naming 방식과 어플리케이션 내의 naming 전략이 다를 경우가 있습니다.

{
"Title": "Frozen",
"Year": "2013",
"Type": "movie",
"Poster": "https://m.media-amazon.com/images/M/MV5BMTQ1MjQwMTE5OF5BMl5BanBnXkFtZTgwNjk3MTcyMDE@._V1_SX300.jpg",
"imdbID": "tt2294629"
}
private String title;
private String year;
private String imdbId;
private String type;
private String poster;

변수명을 json key 와 일치시키지 않으면 데이터에 값이 들어가지 않습니다.

이 때 @JsonProperty(value)를 사용하면 프로젝트 안에서의 변수명을 바꾸지 않고 데이터를 매핑할 수 있습니다. 하지만 @JsonProperty(value)는 필드에 작성해야하므로 naming 전략이 다른 필드가 많다면 과하게 많은 어노테이션을 작성하게 되어 코드가 어노테이션으로 지저분해지겠죠.

바로 이럴 때 클래스레벨에 작성하여 클래스의 naming 전략을 한 번에 바꿀 수 있는 어노테이션이 바로 @JsonNaming 입니다.