이전에 JAVA와 SpringBoot로 작성해본 코드가 있습니다.
공공데이터API로 주식차트그리기
코틀린을 계속 공부를 강의를 들으며 계속 하였고, 공부했던 것을 토대로 코틀린에 대한 이해를 키우기 위해 리팩토링을 진행해 보려 합니다.
이번엔 공부가 주 목적이기 때문에, 리팩토링 툴을 사용하지 않고 gradle 파일부터 클래스 하나하나 코드를 모두 직접 바꿔볼 예정입니다.
리팩토링 첫번째 단계로, Java 코드의 build.gradle
를 build.gradle.kts
으로 리팩토링해보겠습니다.
build.gradle
코드plugins {
id 'java'
id 'org.springframework.boot' version '3.2.3'
id 'io.spring.dependency-management' version '1.1.4'
}
group = 'chart'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.projectlombok:lombok:1.18.28'
annotationProcessor 'org.projectlombok:lombok:1.18.24'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1'
}
tasks.named('test') {
useJUnitPlatform()
}
...React 관련 내용...
사실 위 gradle 파일에서, React
빌드를 위한 코드가 다량 있었습니다.
이번 코드에서는 kotlin 리팩토링 이후 React를 따로 연동하는 방식으로 진행할 예정이라 내용에서 제외하였습니다. (아직 방법을 정확히 모릅니다. 성공한 내용을 다른 포스트에서 다뤄보겠습니다.)
// build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.3'
id 'io.spring.dependency-management' version '1.1.4'
}
코틀린 build.gradle.kts
파일은 각 모듈을 함수처럼 다뤄 코드 작성을 진행합니다.
이 때문에 위처럼 argument 형식으로 작성했던 build.gradle
을 아래와 같이 바꿔줍니다.
// build.gradle.kts
plugins {
id("org.springframework.boot") version "3.3.0"
id("io.spring.dependency-management") version "1.1.5"
}
id 'java'
는 앞으로 java 를 사용하지 않을 것이기에 삭제했습니다.
또한, kotlin 코드 작성시 필수적으로 필요한 plugin 들을 추가합니다.
// build.gradle.kts
plugins {
id("org.springframework.boot") version "3.3.0"
id("io.spring.dependency-management") version "1.1.5"
// 코틀린에 필요한 플러그인
kotlin("jvm") version "1.9.24"
kotlin("plugin.spring") version "1.9.24"
kotlin("plugin.jpa") version "1.9.24"
}
각 플러그인들에 대한 간단한 설명을 다른 포스트에 정리하였습니다.
kotlin 코드 작성히 필수적인 플러그인 - ( kotlin("jvm") , kotlin("plugin.spring") , kotlin("plugin.jpa") )
// build.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.projectlombok:lombok:1.18.28'
annotationProcessor 'org.projectlombok:lombok:1.18.24'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1'
}
plugins
와 비슷하게, 함수 형식으로 리팩토링을 진행합니다.
// build.gradle.kts
dependencies {
implementation("org.springframework.boot:spring-boot-starter-thymeleaf")
implementation("org.springframework.boot:spring-boot-starter-web")
// 롬복은 이제 필요 없을 거다!
// implementation 'org.projectlombok:lombok:1.18.28'
// annotationProcessor 'org.projectlombok:lombok:1.18.24'
testImplementation("org.springframework.boot:spring-boot-starter-test")
implementation("com.googlecode.json-simple:json-simple:1.1.1")
}
Java 코드에서 유용하게 사용했던 lombok 모듈은 삭제합니다.
Kotlin 에서는 data class
를 사용하여 lombok 에서 제공하던 getter
setter
와 같은 것들을 편하게 사용할 수 있기 때문입니다.
이외의 모듈들은 비슷한 방식으로 바꿔줍니다.
그리고 의존성을 추가할 때도, kotlin을 사용할 것이기에 필수적으로 들어가는 의존성 모듈들이 있습니다.
// 원래는 없었지만, 리팩토링 과정에서 코틀린을 위해 추가하는 모듈
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
// 그 중 코틀린에서 필수적으로 들어가는 모듈 2개
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
Jackson은 Java에서 JSON을 처리하는 인기 있는 라이브러리로, Kotlin에서도 널리 사용됩니다.
데이터 클래스의 직렬화 및 역직렬화를 지원하고, 데이터 클래스의 기본 생성자를 활용하여 JSON을 객체로 변환할 수 있습니다.
또한, Kotlin은 null
안전성을 제공하지만, Jackson의 기본 설정은 Java 스타일입니다. jackson-module-kotlin
은 Kotlin의 nullable 타입을 올바르게 처리하여, JSON 필드가 null일 때의 동작을 정의합니다.
Kotlin Reflect
는 리플렉션 기능을 통해 런타임에 클래스, 프로퍼티, 메서드 등의 정보를 다룰 수 있게 해주는 라이브러리입니다.
Reflection
Reflection은 런타임 중에 코드의 각 클래스를 조사하기 위해서 사용되는 기술입니다.
그리고 이 리플렉션이라는 기술을 가장 자주 사용하는 것이 어노테이션입니다.
클래스 정보 : 클래스의 이름, 슈퍼클래스, 구현된 인터페이스 등의 정보를 가져올 수 있습니다.
KClass
를 사용하여 클래스에 대한 정보를 표현합니다.
프로퍼티 접근 : 클래스의 프로퍼티에 대한 정보(이름, 타입 등)를 가져오고, 런타임에 프로퍼티 값을 읽거나 쓸 수 있습니다.
KProperty
를 사용하여 프로퍼티를 표현합니다.
메서드 호출 : 클래스의 메서드에 대한 정보를 얻고, 런타임에 메서드를 호출할 수 있습니다.
KFunction
을 통해 메서드를 표현합니다.
Kotlin 표준 라이브러리의 JDK, 특히 이 모듈에서는 JDK8 기능을 지원합니다.
Kotlin은 Java와의 상호 운용성을 제공하기 때문에 Java의 기능을 Kotlin에서도 사용할 수 있도록 다양한 확장 기능을 추가합니다.
즉, kotlin-stdlib-jdk8
은 Java 8에서 도입된 기능들을 Kotlin에서 사용할 수 있도록 돕습니다.
// build.gradle
group = 'chart'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
repositories {
mavenCentral()
}
...
tasks.named('test') {
useJUnitPlatform()
}
위 의존성들은 아래와 같이 바꾸었습니다.
사실 내용이 바뀌는 것은 없습니다.
// build.gradle.kts
group = "chart"
version = "0.0.1-SNAPSHOT"
java {
sourceCompatibility = JavaVersion.VERSION_17
}
repositories {
mavenCentral()
}
...
tasks.withType<Test> {
useJUnitPlatform()
}
위와 같은 순서로, build.gradle.kts
작성을 마무리하였습니다.
추후 React 연동 시 추가되는 내용이 있을 것이지만, 기본적으로 Kotlin 을 사용하기 위한 준비 작업이라 생각하면 될 것 같습니다.
세팅도 끝났으니 복잡하지도 않은 코드 얼른 바꿔봐야겠습니다 :)
https://velog.io/@tkppp-dev/스프링부트에서-코틀린-사용하기
https://ttl-blog.tistory.com/824