티스토리 뷰
kotlin 에서 java 프레임워크(대표적으로 spring, hibernate)를 이용할때 가장 문제가 되는건 상속이다. java 프레임워크들은 상속을 적극적으로 이용해서 개발자들의 코드를 확장하는데 kotlin 은 기본적으로 final class 이기때문에 상속이 되지않기때문이다.
open 키워드를 붙이면 상속이 되게되는데 이를 수작업으로 할 경우 빼먹기도 쉽고 일일이 타이핑을 해줘야한다는 불편함이 존재한다. 이를 해소하기위해 jetbrains 에서 kotlin-allopen 이라는 플러그인을 지원하고있다. IDE 에서 언어를 kotlin 으로 지정해 spring 프로젝트를 생성하면 기본적으로 들어가는 플러그인이기때문에 저 플러그인을 제대로 인지하지 못하고 있어도 자연스럽게 개발하는데 문제가 없게되기도 한다.
잠깐 data class 에 대해 소개하면 kotlin 은 class 외에 data class 라는 스펙도 지원하고있다. data class 역시 기본적으로 상속이 불가능한 클래스이다. 여기에 제약사항이 하나 더 추가되는데 data class 에는 open 키워드도 붙일 수 없는, 언어에서 강제하는 완전 상속 불가 클래스이다.
그런데 allopen 을 이용해서 상속을 가능케할 경우, data class 마저도 상속이 가능해진다. 그래서 Spring bean 이나 JPA entity 를 data class 로 만들어도 문제없이 상속기반 기능들이 동작하게 된다.
kotlin-allopen 플러그인의 구현과 gradle plugin 이 동작하는 라이프사이클을 알아야 정확한 원인을 알 수 있겠지만, 그냥 추측해보건데 kotlin class 에 open 을 붙인다는 개념이라기보다 kotlin compiler 가 컴파일하고난 바이트 코드에서 final 을 지우는게 아닐까 싶다.
여튼 정리하면 kotlin-allopen plugin 을 이용하면 data class 마저도 상속 가능한 클래스로 활용할 수 있다. 이게 의도한 기능인지는 모르겠으나 https://youtrack.jetbrains.com/issue/KT-34568 내용을 보면 kotlin-allopen 이 존재하는 동안엔 유지되지 않을까 싶다. 물론 해당 글에서도 data class 를 상속해서 사용하는건 권하지 않는다고 한다.
'kotlin' 카테고리의 다른 글
jpa entity 에 data class 를 사용해도 될까? (3) | 2021.07.17 |
---|---|
kotlin 의 json 라이브러리 kotlinx.serialization (0) | 2021.07.17 |
kotlin 1.4 (0) | 2020.10.01 |
kotlin(+JPA) entity 에서 setter 를 막을 수 있을까 (4) | 2020.09.18 |
kotlin jackson 조합시 isXXX 프로퍼티 스펙변경 (0) | 2020.05.30 |
- Total
- Today
- Yesterday
- spring cloud
- java8
- mariadb
- java
- toby
- Design Pattern
- Kotlin
- TEST
- OOP
- backend개발환경
- programming
- MySQL
- generics
- http
- EffectiveJava
- JavaScript Core
- go-core
- DesignPattern
- 정규표현식
- Git
- db
- frontcode
- javascript
- Spring
- Jackson
- code
- clean code
- JPA
- frontend개발환경
- servlet
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |