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 authorsQodana 로 간단하게 코드 정적 분석하기
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 구현
문제 상황 🧐
최근 PostgreSQL
의 Upsert
를 특정 로직에서 사용하는 배치를 설계했습니다. 구현 도중 비즈니스 사항의 변경으로 복합 유니크 조건에 특정 컬럼을 추가하게 되었는데요.
복합 유니크 컬럼의 unique 조건은 특정 컬럼의 null
중복은 막지 못하는 점이 문제가 되었습니다.
예제로 문제가 된 부분을 살펴보겠습니다.
[Kotlin] Infix functions
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)
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 으로 지구 타원체 활용하기
Background
image reference[^footnote]
지구는 평평하지도 완벽한 구형(Sphere)도 아닌 비표준 타원체(Ellipsoid)임을 고려하면 서로 다른 경도 및 위도 위치에 있는 두 점 사이의 거리를 빠르고 정확하게 계산하는 완벽한 공식은 없습니다.
그래도 geotools 라이브러리를 사용하면 수학적으로 보정된 근사치를 꽤나 간단하게 얻어낼 수 있습니다.
@JsonNaming 사용 방법
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
입니다.