-
자바 프로젝트에서 코틀린 시작하기프로젝트/자프링 -> 코프링 마이그레이션 2022. 9. 18. 00:01
기존 자바 프로젝트에서 코틀린을 시작하고자 합니다.
이 포스팅은 코틀린 공식문서 "Tools -> Build tools -> Gradle"과 "Platforms -> JVM -> Spring -> Test code using JUnit in JVM - tutorial" 그리고 "실전! 코틀린과 스프링 부트 도서관리 애플리케이션 개발하기 강의를" 기반하여 작성되었습니다.
1. build.gradle에 코틀린에 관한 의존성들을 추가해줍니다.
plugins { id 'org.jetbrains.kotlin.jvm' version '1.6.21' } dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" } compileKotlin { kotlinOptions { jvmTarget = "11" } } compileTestKotlin { kotlinOptions { jvmTarget = "11" } }
이때 jvmTarget은 사용하고 있는 java version으로 명시하면 됩니다.
2. main과 test에 코틀린 디렉터리를 추가합니다.
만약 이 규칙을 따르지 않는다면 sourceSets 프로퍼티를 정의해주어야 합니다.
sourceSets { main.kotlin.srcDirs += 'src/main/myKotlin' main.java.srcDirs += 'src/main/myJava' }
3. 코틀린 디렉터리도 자바와 패키지를 똑같이 맞추어줍니다.
4. 간단한 사칙연산 계산기를 만들고 테스트 코드를 만들어보겠습니다.
package com.group.libraryapp.calculator class Calculator (private var _number : Int){ val number: Int get() = this._number fun add(operand : Int){ this._number += operand } fun minus(operand: Int){ this._number -= operand } fun multiply(operand: Int){ this._number *= operand } fun divide(operand: Int){ if(operand == 0){ throw IllegalArgumentException("0으로 나눌 수 없습니다") } this._number /= operand } }
테스트 코드
package com.group.libraryapp.calculator import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows internal class CalculatorTest { @Test fun add() { //given val calculator = Calculator(5) //when calculator.add(3) //then assertThat(calculator.number).isEqualTo(8) } @Test fun minus() { //given val calculator = Calculator(5) //when calculator.minus(3) //then assertThat(calculator.number).isEqualTo(2) } @Test fun multiply() { //given val calculator = Calculator(5) //when calculator.multiply(3) //then assertThat(calculator.number).isEqualTo(15) } @Test fun divide() { //given val calculator = Calculator(6) //when calculator.divide(3) //then assertThat(calculator.number).isEqualTo(2) } @Test fun divideExceptionTest() { //given val calculator = Calculator(6) //when & then var message = assertThrows<IllegalArgumentException> { calculator.divide(0) }.message assertThat(message).isEqualTo("0으로 나눌 수 없습니다") } }
5. Spring과 함께 테스트 코드 작성
package com.group.libraryapp.service.user import com.group.libraryapp.domain.user.UserRepository import com.group.libraryapp.dto.user.request.UserCreateRequest import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest @SpringBootTest class UserServiceTest @Autowired constructor( private val userRepository: UserRepository, private val userService: UserService ){ @Test fun saveUserTest(){ //given val request = UserCreateRequest("junwoo", null) //when userService.saveUser(request) //then val results = userRepository.findAll() assertThat(results).hasSize(1) assertThat(results[0].name).isEqualTo("junwoo") assertThat(results[0].age).isNull() } }
@SpringBootTest 어노테이션을 활용하여 스프링 빈들을 등록합니다.
생성자 주입을 통해서 UserRepository, UserService를 주입받습니다.
이후에 given, when, then 패턴을 사용하여 값을 검증해봅니다.
다음과 같은 에러가 발생하게 됩니다.
이때 코틀린이 자바 클래스를 참조할 때 해당 값이 null이 올 수 있는지 없는지 확인할 수 없습니다.
따라서 자바 클래스에 @NotNull, @Nullable 어노테이션을 활용하여 null이 될 수 있는 값인지 명시합니다.
@NotNull public String getName() { return name; } @Nullable public Integer getAge() { return age; }
마무리
자바 프로젝트에 코틀린을 작성하는 법을 알아보았습니다.
자바 프로젝트에서 코틀린 테스트 코드를 작성하는 법을 알아보았습니다.
또한 자바와 코틀린의 차이를 극복하기위한 @NotNull, @Nullalbe 어노테이션을 활용했습니다.
이렇게 먼저 기존 자바 코드에 대해서 코틀린의 테스트코드를 만들어두면 이후에 마이그레이션, 리팩토링을 진행할 때 테스트를 통해 검증하며 편하게 할 수 있습니다.
출처
https://kotlinlang.org/docs/gradle.html#targeting-multiple-platforms
https://multifrontgarden.tistory.com/239
https://www.inflearn.com/course/java-to-kotlin-2
https://kotlinlang.org/docs/jvm-test-using-junit.html#add-the-code-to-test-it
'프로젝트 > 자프링 -> 코프링 마이그레이션' 카테고리의 다른 글
Kotlin + Junit 5 could not Autowire 이슈 (0) 2022.11.28 게시글 프로젝트 리팩토링 (0) 2022.11.11 dto 코틀린으로 변환하기 (0) 2022.09.26 Repository와 Service 계층 Kotlin으로 변경하기 (0) 2022.09.25 도메인 계층을 Kotlin으로 변경하기 (1) 2022.09.21