교재 학습 - 스프링 부트를 활용한 마이크로 서비스 개발 (1)

Kyu0·2023년 2월 7일
0

도입 🎬

마이크로 서비스 개발에 대해 공부하기 위해 스프링 부트를 활용한 마이크로 서비스 개발 교재를 학습하기 시작했습니다. 해당 교재에서는 Spring Boot, TDD(Test Driven Development), RabbitMQ 등의 기술 스택을 사용하고 있습니다.

교재에서는 Spring Boot 1.5x, Java 8 을 기반으로 예제 프로젝트를 생성하지만, 저는 새로운 언어도 같이 배우면 좋을 것 같아 Spring Boot 3.0.2, Kotlin 으로 예제 프로젝트를 따라 작성하겠습니다.

제가 작성하는 게시글에서는 Java 기반 프로젝트를 Kotlin 으로 작성하는 과정에서의 차이점과 예제 프로젝트에 대한 기본적인 설명, 이벤트 중심 시스템 등에 대해 작성하겠습니다.


Kotlin 으로 학습하려는 이유 🤔

제가 Kotlin 을 학습하려는 이유는 다음과 같습니다.

  1. Java 에 비해 Null Safety 가 향상되었다.
  2. 문법이 간결하다.
  3. 코루틴을 지원한다.

1. Java 에 비해 Null Safety 가 향상되었다.

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이라면 런타임 에러 발생
    }
}

2. 문법이 간결하다.

Java 보다 생략되는 키워드들이 많아 코드량이 적다고 합니다. 저는 아직 Kotlin 으로 다양한 코드를 작성해보지 않아서 더 경험해 본 뒤에 판단해봐야겠습니다. 지금까지로서는 크게 와닿지 않는 느낌입니다.

3. 코루틴을 지원한다.

코루틴(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


교재 학습 (Chapter 2. 기본적인 스프링 부트 애플리케이션) 📚

1. VSCode 에서의 오류 발생 🚫

본격적으로 실습을 시작하는 챕터입니다.
저는 VSCode 에디터를 이용해 스프링 부트 프로젝트를 생성했으나 오류가 발생해 실행되지 않았습니다.

다음과 같은 두 가지의 오류가 발생했습니다.

  1. JVM Target 옵션을 인식하지 못하는 오류
  1. Spring Boot Dashboard 확장 프로그램에서의 'No main class is found.' 오류

이와 관련해서 해결책을 이틀 간 찾아 적용해봤지만 오류는 그대로였습니다...
Spring Boot Dashboard Extension 의 이슈(#63, #163) 를 보면 아직 Kotlin 에 대한 지원이 안돼서 그런 것 같습니다.
안타깝지만 이를 계기로 Java 및 Kotlin 을 잘 지원해주는 intelliJ IDE 로 갈아타기로 결정했습니다.


2. Kotest 적용 ✏️

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 의 경우 여러가지 테스팅 스타일을 지원합니다. 공식 문서가 간결하고 설명이 잘 되어 있으니 관심이 있으시면 읽어보시는 것도 좋을 것 같습니다.


학습 결과 및 마무리 👏🏻

  1. Kotlin 이 JVM 상에서 실행되며, Java 와 상호호환성이 뛰어나다는 사실을 알았습니다.
  2. Kotlin 의 문법 중 변수 선언, 메소드 선언, 클래스 선언, 기본 생성자 정의, 백틱(`)구문 등을 알게 되었습니다.
  3. Kotest 를 이용한 테스트 코드 작성 방법을 알게되었습니다.

Chapter 2의 내용은 기본적인 내용이 대부분이라 거의 Kotlin 에 대한 것들을 습득했네요. ㅎ_ㅎ;

예제 프로젝트 깃허브 주소 : https://github.com/Kyu0/microservies-book/blob/263668c9c3b3620571a4bc5e472a744c7d68ab75/src/test/kotlin/microservices/book/multiplication/MultiplicationApplicationTests.kt

잘못된 내용이나 오타 지적 언제나 환영입니다.

profile
개발자

0개의 댓글