개요
코틀린으로 Spring boot를 다루다보면, 기존 자바로 되어있는 프레임워크 로직이 가끔씩 에러를 일으킨다.
FlatFileItemReader를 사용하려다가 에러가 났는데, Target class를 Data class로 잡아놨었다. Bean 생성에 대한 에러 메시지였는데.. FlatFileItemReader의 다음과 같은 특성때문이었다.
1. FlatFileItemReader는 Target Class의 인스턴스를 Default 생성자를 통해 생성한다.
2. 후에 파일을 파싱하여 인스턴스의 필드의 setter를 이용해 값을 주입한다.
따라서 코틀린으로 해당 Target Class를 만드려면 Default 생성자와 Setter를 만들어줘야 하는것이다.
해결
코틀린은 변수를 val로 선언하기를 권장한다.
그래서 항상 모든 변수를 val로 선언하는데.. var로 바꿀 필요가 있다.
val로 선언하면 getter만 만들어지지만, var로 선언하면 setter도 만들어진다. 이는 코틀린 코드를 디컴파일하여 자바코드를 보면 알 수 있다.
data class TestDto2(
val a: Int,
val b: String
)
a와 b에 대해 getter가 만들어진 것을 볼 수 있다. 그래서 이 상태에서는 에러가 난다. setter도 추가하기 위해선 변수를 var로 변경하여 변경 가능한 변수로 만들어야 한다.
data class TestDto2(
var a: Int,
var b: String
)
이제 setter가 생겼다. 하지만 아직 default 생성자가 없다. defalut 생성자를 만드려면 프로퍼티에 default 값을 넣어줘야 한다. 값은 아무거나 상관 없다.
data class TestDto2(
var a: Int = 0,
var b: String = ""
)
그럼 이렇게 default 생성자가 생긴 것을 볼 수 있다.
여담
코틀린이 JVM과 자바에 완벽 호환되게 나온 언어라 이러한 에러는 어쩔 수 없어 보인다.
그런데 나는 코틀린이 자바를 모르고도 이해할 수 있는 언어가 됐으면 좋겠다는 개인적인 바램이 있다.
에러를 해결하거나 내부 동작을 이해하려면 자바를 알아야지만 하는 것이 가끔 있어서.. 독립적인 언어로도 진입장벽없이 배우고 사용할 수 있는 언어가 됐으면 좋겠다.
근데 자바와의 호환성을 고려하면 어쩔 수 없는 부분인 것 같기도 하고..