Kotlin Spring Boot로 RESTful 웹 서비스를 만들어보자 - (1) 프로젝트 시작하기

Jung Ye Lim·2024년 3월 1일

Kotlin Spring Boot

목록 보기
1/1
post-thumbnail

업로드중..

개요

Kotlin Spring Boot로 간단한 웹서비스를 만들어보며 전체적인 개발 흐름을 이해하고자 이 글을 작성했다. 공식문서를 참고해 Kotlin Spring Boot 프로젝트 생성부터 RESTful API를 제작해보려 한다.

코틀린은 어떤 언어일까?

코틀린은 JVM, 안드로이드, 자바스크립트 및 네이티브를 대상으로 하는 정적 타입 지정 언어다. 여기서 정적 타입 언어란 컴파일 시점에 타입이 결정되는 언어로, 자바 또한 정적 타입 지정 언어를 말한다. 젯브레인즈에서 개발한 오픈소스로, JVM 기반의 언어이면서 자바(Java)와 100% 호환되도록 설계되었다. 멀티 플랫폼(Cross-Platform) 언어인 코틀린은 안드로이드 및 iOS 앱 개발, 서버 개발, 웹 개발을 비롯해 임베디드와 IoT, 데이터 사이언스에 이르는 폭넓은 사용성을 목표로 하고 있다. 현재는 안드로이드 앱과 서버 개발에 가장 활발하게 쓰이고 있다.

코틀린 언어의 장점

1. Null 안정성

코틀린은 모든 변수를 not-null로 정의하기 때문에 자바 버그의 일반적인 원인인 Null 포인터 예외를 방지하는 데 도움이 된다.

2. 간결함

코틀린은 자바에 비해 구문이 간결해서 가독성 좋은 코드를 쉽게 작성할 수 있다.

3. 자바와의 호환성

코틀린은 자바와 완벽히 호환되어 상호 운용할 수 있다. 코틀린으로 자바 코드를 호출하거나 라이브러리를 이용할 수 있다.

왜 이름이 코틀린일까?

자바(JAVA)는 원래 인도네시아 섬 이름이다. 이 섬에서 나는 커피의 이름 또한 자바로, 여기서 이름을 딴 에스프레소 커피로 유명한 커피 체인점 이름이기도 하다. 이처럼 코틀린도, 자바의 유래에 맞춰서 코틀린이라는 섬에서 이름을 따왔다.

코틀린 맛보기

다음은 Kotlin 언어를 사용하여 플레이어를 나타내는 클래스를 정의한 것이다. 코드 중 자바와 비교해 생소한 부분을 살펴보고자 한다.

class Player(val name: String, val health: Int = 20) {
	var nickname: String? = null
}
  • val(value): 읽기 전용 프로퍼티로, 한 번 값을 할당하면 변경할 수 없다.
  • var(variable) : 변경 가능한 프로퍼티다.
  • String? = null : String?은 문자열 또는 null이 될 수 있는 타입을 나타낸다. 초기값으로 null이 할당되어 있으므로, 닉네임을 설정하지 않은 경우에는 null로 유지된다. 코틀린은 기본적으로 null이 될 수 없는 타입으로, 물음표(?)를 붙여야만 null이 될 수 있는 타입이 된다.
  • val health: Int = 20 : 코틀린에서는 기본 인자를 제공하고 있다.
  • 세미콜론 생략이 가능하다.

프로젝트 준비사항

코틀린으로 스프링부트 프로젝트를 시작하기 전 필요한 것은 다음과 같다.

  • JDK (JDK8 이상 권장)
  • IntelliJ IDEA (필자는 Community 버전으로 진행)
  • Gradle (최신 버전 권장)

start.spring.io를 이용해 스프링부트 프로젝트를 만들자

먼저, Spring Initializer에 접속한 후 다음과 같이 선택한다.

  • Project : Gradle-Kotlin
  • Language : Kotlin
  • Spring Boot : SNAPSHOT 또는 M2 M3가 붙지 않은 최신 버전 선택
  • 버전 옆에 SNAPSHOT이라고 적혀 있는 것은 아직 만들고 있는 버전이며, 간혹 M1이라고 적혀있는 것은 정식으로 릴리즈되지 않은 버전이다. 따라서 SNAPSHOT, M1이 아닌 버전 중 선택하면 된다.
  • Project Meta Data
    • Group : 보통 기업명 - com.example
    • Artifact : 빌드 결과물의 이름 - demo (버전 정보를 생략한 빌드 결과물 이름, jar 또는 war 파일명 / Group 내에서 artifact가 중복될 수 없음)
    • name : 프로젝트 이름 - demo (Artifact를 입력하면 자동으로 채워지며, 원하는 다른 이름으로 변경 가능)
    • Description : 설명 - Demo project for Spring Boot
    • Package name : 패키지 이름 - com.example.demo
    • Packaging : Jar
    • Java : 17
  • Dependency
    • Web / Spring Web
    • SQL / Spring Data JDBC
    • SQL / H2 Database

Generate 클릭 후 다운 받은 zip 파일을 IntelliJ에서 열어준다.

build.gradle.kts 파일 설정

start.spring.io를 사용했기 때문에 build.gradle.kts 파일은 이미 설정되어 있을 것이다.
아마 파일은 다음과 비슷할 것이다. 혹시 모르니 이와 한 번 더 체크해보자.

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
	id("org.springframework.boot") version "3.2.1"
	id("io.spring.dependency-management") version "1.1.4"
	kotlin("jvm") version "1.9.21"
	kotlin("plugin.spring") version "1.9.21"
}

group = "com.example"
version = "0.0.1-SNAPSHOT"

java {
	sourceCompatibility = JavaVersion.VERSION_17
}

repositories {
	mavenCentral()
}

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

tasks.withType<KotlinCompile> {
	kotlinOptions {
		freeCompilerArgs += "-Xjsr305=strict"
		jvmTarget = "17"
	}
}

tasks.withType<Test> {
	useJUnitPlatform()
}

어플리케이션 개발하기

프로젝트가 생성되었다면, Spring boot 어플리케이션을 개발할 준비가 된 것입이다. 간단하게 컨트롤러를 생성해보자.

  • src/main/kotlin/com/example/{프로젝트명} 폴더에서 HelloController.kt 파일을 생성하고 다음과 같이 작성한다.
package com.example.demo

import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController

@RestController
class HelloController {
    @GetMapping("/")
    fun index(@RequestParam("name") name: String) = "Hello, $name!"
}}
  • @RestController 어노테이션은 HelloController가 HTTP 요청을 다루는 컨트롤러임을 Spring에게 알려준다.
  • 메소드 index()를 정의하고, @GetMapping 어노테이션을 사용해 이 메소드가 /hello 엔드포인트와 매핑되도록 설정한다.
  • 이 엔드포인트로 GET 요청이 들어오면 () 메소드가 "Hello, $name!"이라는 문자열을 반환한다.
    • "Hello, $name!" 표현식은 Kotlin에서 문자열 템플릿이라고 불린다. 문자열 템플릿은 내장된 표현식을 포함하는 문자열 리터럴이다. 이는 문자열 연결 연산에 대한 편리한 대체 수단이다.
  • /?name={이름}로 접근하고 name이라는 요청 매개변수를 제공하면, 해당 매개변수 값은 index() 함수를 호출하는 인자로 사용된다.
  • index() 함수에는 하나의 문장만 포함되어 있기 때문에 단일 표현식 함수로 나타낼 수 있다.
  • 컴파일러는 등호 기호(=) 오른쪽의 문장의 결과를 살펴보고 반환 타입을 추론한다. "Hello, $name!" 표현식의 타입은 String이므로, 함수의 반환 타입도 String이다.

실행해보기

DemoApplication.kt 파일을 열고 main() 메서드 옆에 있는 녹색 실행(실행) 아이콘을 클릭하면 어플리케이션이 실행된다.

참고 자료

0개의 댓글