[Kotlin, Java] Java -> Kotlin 코드 리팩토링 시작 - build.gradle.kts 작성하기

zero zoo·2024년 9월 22일
0

Kotlin 리팩토링

목록 보기
1/2
post-thumbnail

이전에 JAVA와 SpringBoot로 작성해본 코드가 있습니다.
공공데이터API로 주식차트그리기
코틀린을 계속 공부를 강의를 들으며 계속 하였고, 공부했던 것을 토대로 코틀린에 대한 이해를 키우기 위해 리팩토링을 진행해 보려 합니다.
이번엔 공부가 주 목적이기 때문에, 리팩토링 툴을 사용하지 않고 gradle 파일부터 클래스 하나하나 코드를 모두 직접 바꿔볼 예정입니다.

리팩토링 첫번째 단계로, Java 코드의 build.gradlebuild.gradle.kts 으로 리팩토링해보겠습니다.

기존의 java 에서의 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를 따로 연동하는 방식으로 진행할 예정이라 내용에서 제외하였습니다. (아직 방법을 정확히 모릅니다. 성공한 내용을 다른 포스트에서 다뤄보겠습니다.)


plugins

// 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") )


dependencies

// 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-module-kotlin

Jackson은 Java에서 JSON을 처리하는 인기 있는 라이브러리로, Kotlin에서도 널리 사용됩니다.

데이터 클래스의 직렬화 및 역직렬화를 지원하고, 데이터 클래스의 기본 생성자를 활용하여 JSON을 객체로 변환할 수 있습니다.

또한, Kotlin은 null 안전성을 제공하지만, Jackson의 기본 설정은 Java 스타일입니다. jackson-module-kotlin은 Kotlin의 nullable 타입을 올바르게 처리하여, JSON 필드가 null일 때의 동작을 정의합니다.

kotlin-reflect

Kotlin Reflect는 리플렉션 기능을 통해 런타임에 클래스, 프로퍼티, 메서드 등의 정보를 다룰 수 있게 해주는 라이브러리입니다.

Reflection

Reflection은 런타임 중에 코드의 각 클래스를 조사하기 위해서 사용되는 기술입니다.
그리고 이 리플렉션이라는 기술을 가장 자주 사용하는 것이 어노테이션입니다.

  • 클래스 정보 : 클래스의 이름, 슈퍼클래스, 구현된 인터페이스 등의 정보를 가져올 수 있습니다.
    KClass를 사용하여 클래스에 대한 정보를 표현합니다.

  • 프로퍼티 접근 : 클래스의 프로퍼티에 대한 정보(이름, 타입 등)를 가져오고, 런타임에 프로퍼티 값을 읽거나 쓸 수 있습니다.
    KProperty를 사용하여 프로퍼티를 표현합니다.

  • 메서드 호출 : 클래스의 메서드에 대한 정보를 얻고, 런타임에 메서드를 호출할 수 있습니다.
    KFunction을 통해 메서드를 표현합니다.

kotlin-stdlib-jdk8

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

profile
한방향으로 지그재그

0개의 댓글