마이크로 서비스 개발에 대해 공부하기 위해 스프링 부트를 활용한 마이크로 서비스 개발
교재를 학습하기 시작했습니다. 해당 교재에서는 Spring Boot, TDD(Test Driven Development), RabbitMQ 등의 기술 스택을 사용하고 있습니다.
교재에서는 Spring Boot 1.5x
, Java 8
을 기반으로 예제 프로젝트를 생성하지만, 저는 새로운 언어도 같이 배우면 좋을 것 같아 Spring Boot 3.0.2
, Kotlin
으로 예제 프로젝트를 따라 작성하겠습니다.
제가 작성하는 게시글에서는 Java 기반 프로젝트를 Kotlin 으로 작성하는 과정에서의 차이점과 예제 프로젝트에 대한 기본적인 설명, 이벤트 중심 시스템 등에 대해 작성하겠습니다.
제가 Kotlin 을 학습하려는 이유는 다음과 같습니다.
Java 의 경우 Null 값에 대해 관대한 편입니다. 몇 개의 프로젝트를 진행하면서 코드를 작성하는 단계에서 값이 Null 일 경우를 상정하면서 작성해야 한다거나 예상치 못한 곳에서 NPE(Null Pointer Exception) 이 발생한 경우가 있었기 때문입니다.
이와 다르게 Kotlin 은 Nullable 과 Non-Null 타입을 도입하고, ?.
, !!.
, ?:
연산자와 같은 Null Operator 들을 도입하여 Null 에 대한 위험성을 축소시켰습니다.
예제
class Example (
private var member1: String, // null 허용하지 않음
private var member2: String? // null 허용
) {
fun demo() {
member1.get(3) // 경고 발생 X, member1은 null이 될 수 없으므로 정상적으로 get 메소드를 호출할 수 있기 때문
member2.get(3) // 경고 발생, member2는 null 값도 허용하므로 NPE가 발생할 수 있기 때문
member2?.get(3) // 경고 발생 X, member2 가 null이라면 null을 반환
member2!!.get(3) // 경고 발생 X, member2 가 null이라면 런타임 에러 발생
}
}
Java 보다 생략되는 키워드들이 많아 코드량이 적다고 합니다. 저는 아직 Kotlin 으로 다양한 코드를 작성해보지 않아서 더 경험해 본 뒤에 판단해봐야겠습니다. 지금까지로서는 크게 와닿지 않는 느낌입니다.
코루틴(Coroutine) 은 Kotlin 에 종속되는 개념이 아니라 프로그래밍 영역에서 넓게 사용되는 개념으로, Python, C#, Kotlin 등 다양한 프로그래밍 언어 플랫폼에서 지원하고 있습니다.
코루틴은 일반적으로 기존의 Multi-Thread 모델보다 생성/이용에 더 적은 오버헤드를 가지기 때문에 요즘에는 많이들 도입하려고 하는 것 같습니다.
하지만 이 교재에서 다루고 있는 주제는 아니므로 교재를 학습할 때는 Kotlin 언어를 학습하고 적용하는 것에 집중하고 코루틴을 다루는 것은 이후로 미뤄둬야겠습니다.
운영체제 : macOS Monterey 12.4
IDE : VSCode → intelliJ
프레임워크 : Spring Boot (Kotlin)
프로그래밍 언어 : Kotlin (kotlinc 1.8.10, JDK 17)
빌드 툴 : Gradle
본격적으로 실습을 시작하는 챕터입니다.
저는 VSCode 에디터를 이용해 스프링 부트 프로젝트를 생성했으나 오류가 발생해 실행되지 않았습니다.
다음과 같은 두 가지의 오류가 발생했습니다.
이와 관련해서 해결책을 이틀 간 찾아 적용해봤지만 오류는 그대로였습니다...
Spring Boot Dashboard Extension 의 이슈(#63, #163) 를 보면 아직 Kotlin 에 대한 지원이 안돼서 그런 것 같습니다.
안타깝지만 이를 계기로 Java 및 Kotlin 을 잘 지원해주는 intelliJ IDE 로 갈아타기로 결정했습니다.
Chapter 2의 주된 내용은 테스트 코드 작성(Test Driven Development, Behavior Driven Development)이며, 이와 관련해 Mockito, JUnit4 를 이용한 테스트 코드가 예제로 소개되었습니다.
하지만 찾아보니 Kotlin 은 JUnit, Mockito 라이브러리를 이용하는 방식보다 Kotlin DSL(Domain Specific Language) 을 활용할 수 있는 Kotest, MockK 라이브러를 사용해서 테스트 코드를 선호한다고 합니다.
실제로 Kotest 를 이용해서 테스트 코드를 작성하니 의도한 바가 명확해져 시나리오와 예상 결과값이 눈에 잘 들어왔습니다.
// Kotest 테스트 코드 중 일부
given("generatorRandomFactor() 메소드가 순차적으로 50, 30을 반환") {
every { randomGeneratorService.generateRandomFactor() } returnsMany listOf(50, 30)
val multiplication: Multiplication = multiplicationService.createRandomMultiplication()
`when`("factorA는") {
then("50이다.") {
multiplication.getFactorA() shouldBe 50
}
}
`when`("factorB는") {
then("30이다.") {
multiplication.getFactorB() shouldBe 30
}
}
`when`("factorA * factorB는") {
then("1500이다.") {
multiplication.getResult() shouldBe 1500
}
}
}
// JUnit4 테스트 코드 중 일부
// given (randomGeneratorService 가 처음에 50, 나중에 30을 반환하도록 설정)
given(randomGeneratorService.generateRandomFactor()).willReturn(50, 30);
// when
Multiplication multiplication = multiplicationService.createRandomMultiplication();
// assert
assertThat(multiplication.getFactorA()).isEqualTo(50);
assertThat(multiplication.getFactorB()).isEqualTo(30);
assertThat(multiplication.getResult()).isEqualTo(1500);
또한 Kotest 의 경우 여러가지 테스팅 스타일을 지원합니다. 공식 문서가 간결하고 설명이 잘 되어 있으니 관심이 있으시면 읽어보시는 것도 좋을 것 같습니다.
Chapter 2의 내용은 기본적인 내용이 대부분이라 거의 Kotlin 에 대한 것들을 습득했네요. ㅎ_ㅎ;
잘못된 내용이나 오타 지적 언제나 환영입니다.