본문 바로가기

개발 이야기/Spring Boot

[10분 Boot-up] Kotlin으로 스프링부트 Web Application 만들기 - (4) Spring MVC 적용하기

 

Kotiln과 Spring Boot을 모르더라도 10분씩 따라하면서 자연스럽게 Web Application을 만들어보는 것이 목표입니다.

각 챕터에서 나오는 중요한 내용은 별도로 [더 알아보기]에 보충해서 작성할 예정입니다.

 

시작하기 전에

지금까지는 spring-boot-starter를 사용해서 Spring Boot Application을 만들어봤다. 앞에서 우리가 만든 Application은 실행시키면 Logging만 수행하고 바로 종료되는 단순한 Java Application이다. 여기서 우리가 주의해야하는 점은 Spring과 Spring Boot는 그 자체로는 Web Application 프레임워크가 아닌, Java 개발을 쉽게 사용할 수 있게 도와주는 Java Application 프레임워크이라는 것이다. 특히 Spring Boot는 Spring을 조금 더 쉽게 사용하기 위한 프레임워크(Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".)일 뿐이다.

 

Java를 활용하여 웹 서비스를 개발하기 위해서는 기본적으로 Servlet을 구현한 프로그램과 이를 실행하는 Servlet Container가 필요하다. Spring Framework로 Web Application을 만들기 위해서는 Spring MVC 모듈을 사용하면 되는데, Spring Boot는 이런 Spring MVC 모듈을 spring-boot-starter-web을 dependency에 추가함으로써 쉽게 적용이 가능하다. spring-boot-starter-web을 추가하면 Spring MVC와 관련된 dependency들(spring-web, spring-webmvc)와 내장 Sevlet Container(spring-boot-starter-tomcat)가 자동으로 포함된다.

dependency 추가하기

아래처럼 build.gradle.kts 파일에 spring-boot-starter-web 의존성을 추가한다.

dependencies {
    implementation("io.github.microutils:kotlin-logging:1.12.5") // logging
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")

    testImplementation("org.springframework.boot:spring-boot-starter-test")
}

새로운 dependency를 추가했으니 Gradle의 reload를 진행하고 기다린다. 로드가 끝난 이후 실해하면 이전과는 다르게 Application의 프로세스가 바로 종료되지 않는 것을 확인할 수 있다. 이제 Web Application으로 동작하기 때문이다. 콘솔 로그를 잘 살펴보면 Apache Tomcat이 Servlet engine으로 시작됐다는 내용을 확인할 수 있다.

 

MyappApplication.kt 정리

MyappApplication의 불필요한 코드를 정리하자.

package me.sample.myapp

import mu.KotlinLogging
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication

private val logger = KotlinLogging.logger {}

@SpringBootApplication
class MyappApplication

fun main(args: Array<String>) {
    runApplication<MyappApplication>(*args)
}

 

Controller 클래스 추가

Spring MVC은 Model-View-Controller 패턴의 구조를 기반으로 Web Application 생성을 지원하기 때문에 Controller의 역할을 쉽게 부여하기 위한 @Controller@RestController 어노테이션을 지원한다. 우리는 @RestController는 RESTful API 형태의 요청을 쉽게 받을 수 있는 Controller 빈을 생성해준다. 프로젝트에 /controller 디렉토리를 추가하고 TestController.kt를 아래처럼 작성해보자.

@RestController
class TestController {

    @GetMapping("/test")
    fun restorePrivateKey(): String {
        return "Hello, API"
    }

    @GetMapping("/test/request-param")
    fun restorePrivateKey(
        @RequestParam param1: String,
        @RequestParam param2: String
    ): String {
        return "Hello, API - (param1: ${param1}, param2: ${param2})"
    }
}

/test 경로에 HTTP GET method를 받는 2개의 Test API를 생성했다. Spring MVC는 HTTP 요청을 처리하기 위해서 HTTP method와 Request 요청 경로의 매핑을 @GetMapping 등과 같은 어노테이션으로 더욱 쉽게 관리할 수 있도록 도와주며, Request 파라미터나 Request 바디 값도 쉽게 함수 파라미터로 쉽게 매핑하여 API를 만들 수 있게 도와준다.

 

이제 Application을 다시 실행하여 localhost:8080/test, localhost:8080/test/request-param?param1=100&param2=abc를 브라우저에서 각각 입력하고 API가 잘 동작하는지 확인해보자.

브라우저에 Reqeust 응답이 잘 표시되는 것을 확인할 수 있다. Spring Boot로 하나의 Web Application을 만들고 클라이언트의 요청에 응답을 내려주는 API를 만든 것이다. 다음에는 Docker를 활용하여 Local 환경에 MySQL 데이터베이스를 구성해보고 이를 Spring Data를 사용하여 우리가 생성한 Web Application과 연동해보자.

더 생각해보기

  • MVC 구조란 무엇일까?
  • Spring MVC는 어떻게 동작할까?
  • Spring MVC@ReqeustMapping은 어떻게 사용할까?
  • @Controller@RestController의 차이는 무엇일까?