최근에 java + Spring 프로젝트를 Kotlin으로 많이 전환하는 추세이다. 이러한 이유를 알아보자.
코틀린은 자바보다 더 간결하고 직관적이다.
실행 시점에 오류를 발생시키는 대신 컴파일 시점 검사를 통해 오류를 더 많이 방지해준다.
자바에서는 NPE를 방지하기 위해 Optional이나 catch를 이용해 짰던 방어로직을 아래와 같은 연산자로 대체할 수 있다.
java와 100% 호환되며, 기존 라이브러리를 활용할 수 있어서 기존의 자바 코드를 가능하면 최대한 활용할 수 있다.
Kotlin은 개발 도구인 ItelliJ IDE를 개발한 JetBrains가 설계한 언어라, 사용하고 있는 IDE intellij가 Kotlin을 더 잘 지원한다.
코틀린을 사용하면 코루틴을 통한 비동기 처리를 간소화할 수 있다. 물론 자바에서도 RxJava와 같이 비동기를 처리할 수 있는 방법이 있지만, 러닝 커브가 높아 적용하는데 오랜 시간이 걸린다.
반면에 코틀린의 코루틴은 비동기 작업을 더 선언적이고 단순한 방법으로 처리할 수 있도록 설계되었다.
코루틴은 비동기 작업을 일시 중단(suspend)할 수 있는 'suspend' 함수를 사용하여, 비동기 코드를 순차적인 흐름으로 작성할 수 있게 해준다.
코틀린의 사용자는 기본적으로 프로퍼티의 선언과 초기화를 동시에 하기 때문에 자바에 비해서 코드 양이 훨씬 적다.
프로퍼티 선언으로 만들어진 모든 필드를 포함하는 생성자와, 초기화해준 필드를 제외한 생성자를 따로 선언하지 않아도 된다.
java
@Getter
@Builder
@AllArgsConstructor
public class PageOptionRequest {
@NotNull(message = "actionType is required!")
private String actionType;
@Nullable
private String os;
public PageOptionRequest(String actionType) {
this.actionType = actionType;
this.os = "ios";
}
}
kotlin
class PageOptionRequest(
val actionType: String,
val os: String? = "ios"
)
data class는 데이터 보관 목적으로 만든 클래스인데, spring 프로젝트의 DTO로 활용하면 매우 편하다. toString(), hashCode(), equals(), copy() 메서드를 기본으로 제공해서, 이에 대한 boilerplate code를 생략할 수 있다.
java
@EqualsAndHashCode
@ToString
public class PageOptionRequest {
...
}
kotlin
data class PageOptionRequest(
...
)
아래 기능들을 이용해서 분기 처리를 더 깔끔하게 구현할 수 있다.
코틀린의 최대 장점인 null처리! 매우 편하고 안전한 null 처리를 제공한다. 자바8부터 Optional을 제공하긴 하지만 Optional 객체로 만드는 과정을 생략할 수 있어 훨씬 간결하다.
java
Optional.ofNullable(optionRequest.getOs())
.map(data -> " and os_type=" + data).orElse("")
kotlin
optionRequest.os?.let { data -> "and os_type=$data" } ?: ""