본문 바로가기

개발/Spring

[Spring] Kotlin + Spring 프로젝트 만들고 테스트 해보기

요즘 백엔드 공고를 보면 Spring 개발자를 뽑는 공고에 유독 Kotlin 가능자를 우대하는 경우가 많다.

작년에만 해도 가능은 하지만 Kotlin은 Android 개발에만 주로 사용된다 정도로 알고 있었는데..

어느덧 점점 주류가 되고 있는 개발언어인 것 같다.

 

작년에 AOS 쪽 직무를 잠깐 진행하면서 Kotlin을 공부하기는 하였지만, 겉햝기 수준이었고,

그 이후로는 따로 시간내서 공부하지 않았다.

 

그러다 개인적으로 프로젝트를 한번 진행해보고 싶었는데,

지금까지는 사용하지 않았던 것들만 주로 사용해서 느리더라도 한번 진행해보고 싶어졌다.

최종적으로 Spring + Kotlin + MongoDB 로 진행해보려고 한다.(FE : Vue.js 예정)

 

기획부터 있어야겠지만, 그 전에 내가 소위 말하는 "야생형" 개발이 가능한지 검증이 필요했다. (이미 야생형이 아니다..)


프로젝트 생성은 사실 단순하다. 우리에겐 https://start.spring.io/ 가 있다.

 

프로젝트 생성 후 build.gradle.kts 에 필요한 의존성을 추가해준다.

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-data-mongodb")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
    implementation("org.jetbrains.kotlin:kotlin-reflect")

    developmentOnly("org.springframework.boot:spring-boot-devtools")

    //kotest
    testImplementation("org.springframework.boot:spring-boot-starter-test")
    testImplementation("io.kotest:kotest-runner-junit5:5.4.2") // kotlin junit 처럼 쓸 수 있는 Spec 들이 정의 됨
    testImplementation("io.kotest:kotest-assertions-core:5.4.2") // shouldBe... etc 와같이 Assertions 의 기능을 제공
    testImplementation("io.kotest.extensions:kotest-extensions-spring:1.1.2") // spring boot test 를 위해서 추가

    // mockk
    testImplementation("io.mockk:mockk:1.12.5")
}

 

Member 클래스를 하나 만들어본다

@Document(collection = "member")
class Member (
    @Id
    var id: Long,
    var name: String,
)

kotest와 mockk를 활용해 테스트를 해본다.

class MemberServiceTest : BehaviorSpec({

    val memberRepository = mockk<MemberRepository>()
    val mockMemberList = listOf(Member(1, "kadun"))

    Given("MemberService 테스트를 위해") {

        every { memberRepository.findAll() } returns mockMemberList

        When("요청이 들어올 때") {
            val member = memberRepository.findAll()

            Then("첫번째 Member의 이름을 검증한다") {
                member[0].name shouldBe "kadun"
            }
        }
    }
})

테스트 통과


검색과 GPT를 통해 하나하나 수정해가면서 구성하였기에 특별히 참고한 자료는 없으며,

사실 이렇게 하는것이 맞는지도 잘 모르겠다.

이전에 시도해보지 않았던 것들을 하나하나 쌓아올리는 것에 의미를 두고 조금씩 진행해보려고 한다.