Skip to main content

[Java] First collection(일급 컬렉션)을 더욱 Collection 답게 - iterable

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

Overview

// Iterable 을 구현하고 있는 java Collection.
public interface Collection<E> extends Iterable<E>

일급 컬렉션은 객체를 다루는데에 있어서 굉장히 유용한 방법 중 하나다. 하지만 일급 컬렉션이라는 이름이 무색하게도 Collectionfield 로 가지고 있을 뿐 실제 Collection 은 아니기 때문에, Collection 이 제공하는 다양한 method 들을 사용할 수는 없다. 이 글에선 Iterable 을 활용해서 일급 컬렉션을 진짜 Collection 처럼 쓸 수 있는 방법을 소개해본다.

간단한 예제를 작성해보자.

우아한 HTTP CLI, HTTPie

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

Overview

curl 명령어를 대체할 수 있는 CLI tool

평소 Linux 를 자주 사용하는 개발자라면 curl 명령어를 쓸 일이 많다. 서버에서 외부 API 요청을 보내려면 필수적인 명령어인데, 출력 결과의 가독성이 좋지 않다는 단점이 있었다. HTTPie 는 이런 단점을 해소해줄 수 있는 재밌는 툴이기에 소개해보려 한다.

getter/setter 에 대한 사실과 오해

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

구글에 getter/setter 에 대해 검색해보면 정말 많은 게시글이 나온다. 대부분 getter/setter 를 사용하는 이유에 대해서 작성되어 있고 그 이유 중 하나로 캡슐화, 정보 은닉 같은 키워드를 중심으로 설명하고 있다.

필드 변수를 private 로 선언하여 외부에서 접근을 막고 getter/setter 만 공개하여 캡슐화한다는 설명이 90%는 되는 것 같다.

하지만 getter/setter 를 쓰면 진짜로 캡슐화가 될까?

결론부터 말하자면 getter/setter 는 캡슐화를 전혀 달성할 수 없다. 캡슐화를 하고 싶다면 getter, setter 는 쓰지 말아야한다는 것이다. 이걸 이해하기 위해서는 먼저 캡슐화에 대해 정확히 이해할 필요가 있다.

'sitemap.xml 을 찾을 수 없습니다' 해결하기

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

블로그 글이 구글에 노출될 수 있도록 sitemap.xml 을 등록했으나, '사이트맵을 찾을 수 없음' 이라는 에러 메세지만 휑하게 나왔었는데 드디어 해결하게 되어 제가 사용한 방법을 공유합니다.

이 방법이 모든 케이스를 해결해주진 못하겠지만, 시도해볼 가치는 있는 것 같습니다.

아래 명령어를 실행해줍니다.

curl https://www.google.com/ping\?sitemap\={제출하고자 하는 sitemap 의 경로}

그리고 다시 search console 에 접속해보면...!

[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 라이브러리를 사용하면 수학적으로 보정된 근사치를 꽤나 간단하게 얻어낼 수 있습니다.