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¶m2=abc를 브라우저에서 각각 입력하고 API가 잘 동작하는지 확인해보자.
브라우저에 Reqeust 응답이 잘 표시되는 것을 확인할 수 있다. Spring Boot로 하나의 Web Application을 만들고 클라이언트의 요청에 응답을 내려주는 API를 만든 것이다. 다음에는 Docker를 활용하여 Local 환경에 MySQL 데이터베이스를 구성해보고 이를 Spring Data를 사용하여 우리가 생성한 Web Application과 연동해보자.
더 생각해보기
MVC 구조
란 무엇일까?Spring MVC
는 어떻게 동작할까?Spring MVC
의@ReqeustMapping
은 어떻게 사용할까?@Controller
와@RestController
의 차이는 무엇일까?