환경
IDE: intellij
SpringBootVersion: 2.7.18
Gradle: 8.5
Java: 17
해당 포스팅은
인프런 "코틀린 문법부터 실무까지 (자바 to 코틀린 실무)" 을 따라하면서 Java/Spring 프로젝트를 Kotlin/Spring 프로젝트로
점진적인으로 변환하는 내용을 담고 있습니다
다루는 내용
- 빌드 툴 변경
- util 클래스 변경
- dto 클래스 변경
- entity 클래스 변경
- service, controller 변경
빌드 툴 변경
gradle update 필요
gradle -> 8.5
build.gradle 파일 변환
build.gradle -> build.gradle.kts 로 변환
groovy를 kotlin으로 변환할때
아래 방법으로 변환도 가능합니다
https://github.com/bernaferrari/GradleKotlinConverter
[GitHub - bernaferrari/GradleKotlinConverter: Convert from Groovy to Kotlin DSL for Gradle, focused on Android.
Convert from Groovy to Kotlin DSL for Gradle, focused on Android. - bernaferrari/GradleKotlinConverter
github.com](https://github.com/bernaferrari/GradleKotlinConverter)
util 클래스 변환
java로 작성된 util class를 kotlin으로 변환합니다
@UtilityClass 변환
lombok 애노테이션이며 타겟 클래스는 final클래스가 되고 생성자를 private로 만들어서 인스턴스를 생성하지 못하게 합니다
변환하려는 java파일을 선택후
shift + option + command + k
class -> object로 변환되고 @JvmStatic 애노테이션이 메서드에 붙었습니다
@JvmStatic
해당 애노테이션은 자바에서 해당 메서드를 호출할 때 스태틱하게 메서드를 호출하게 해주는 기능을 합니다
함수로도 호출이 가능합니다
import 된것을 확인해보면 함수앞에 파일명이 패키지명에 나오는것을 확인할 수 있습니다
import static com.makers.princemaker.util.DateTimeUtilsKt.getLocalDateTimeString;
개인적인 선호도는 함수단위로 관리하는것은 함수가 많아질수록 관리가 어려워서 좋아하지 않습니다
Java/Spring 으로 구성된 프로젝트를 build.gradle을 바꾸고, util클래스도 바꿔도 모든 기능이 정상 동작합니다
dto class 변환
java dto -> kotlin dto 로 변환시 변수는 nullable 타입으로 할당하는편이 안전하다고 볼 수 있습니다
ide에서 변환해주는 방식은 자바에서 사용하는 멤버필드를 초기화하는 코드로 변환해줍니다
kotlin 스타일대로 주생성자에 넣어주는 방식으로 변환합니다
static 메서드의 경우 @JvmStatic 애노테이션이 빠지면 붙여줍니다
java의 dto를 kotlin dto로 변경하면서 class -> data class 로 변경했습니다
java에서 변경된 data class를 호출할때는 new 키워드를 추가해서 변환을 마치고 동작을 확인합니다
entity class 변환
JPA에 Entity에 공통 필드를 갖는 경우 MappedSuperclass를 활용합니다
그러면 경우에는 기존 SuperClass를 그대로 두고 코틀린용 SuperClass를 추가한후 변환하는 엔티티에 적용해주는게 안전하다고 합니다
@Embedded나 @Embeddable 같은 VO를 사용하는 경우에도 하위 클래스를 함께 변환해줍니다
java코드에서 set하는것과 JPA 기능을 이용해서 필드를 채워넣는 기능을 사용할때에는 val이 아닌 var로 해줍니다
service 변환
슬라이싱 테스트 코드를 작성해두었으면 기존 java junit5 테스트에서는 mock하려는 필드만 @Mock 애노테이션으로 추가했다면
kotlin에서는 주입된 모든 필드를 @Mock으로 선언해주어야 합니다
controller 변환
- objectMapper 재정의한 경우
- jackon-module-kotlin을 추가한 후 kotlinModule을 추가해야합니다
- 코틀린 DTO의 직/역직렬화를 위한 기본 생성자 자동으로 생성해줍니다
- request body field는 Nullable로 설정하는게 편리함
- Nullable하게 한 후 @NonNull 처리 가능합니다
- MethodArgumentNotValidException 발생하여 적절히 처리 가능합니다
- Long, Int 등 원시값의 경우 해당 필드가 들어오지 않으면 0으로 할당됩니다
- Not Null로 만든후 Annotation use-site target 사용해서 생성자 파라미터에 파라미터 검증이 가능하고 MissingKotlinParameterException을 처리하는 방법이 있습니다
- Nullable하게 한 후 @NonNull 처리 가능합니다
- javax.validation
validation 애노테이션 위치를 수정해줍니다 필드 왼쪽으로 붙도록 수정해줍니다
'스프링 프레임워크 > kotlin' 카테고리의 다른 글
kotlin-springboot spring-kafka로 produce, consume 시작하기 (0) | 2024.08.12 |
---|---|
Java/Spring -> Kotlin/Spring 변환 - 4 (0) | 2024.08.07 |
Java/Spring -> Kotlin/Spring 변환 - 3 (0) | 2024.07.28 |
Java/Spring -> Kotlin/Spring 변환 - 2 (0) | 2024.07.27 |