관리 메뉴

너와 나의 스토리

[Kotlin] Spring Boot로 RESTful 웹 서비스 만들기 본문

Programming Language/Kotlin

[Kotlin] Spring Boot로 RESTful 웹 서비스 만들기

노는게제일좋아! 2021. 6. 9. 17:03
반응형

1. Spring initializr로 프로젝트 생성

 

 

2. Data class와 controller 생성

  •  MessageController.kt 파일을 생성해서 아래의 코드를 작성해주자.
    • 두 개의 string 변수를 필드로 갖는 클래스 Message를 생성하였다 -> data class
    • 이 Message 클래스를 type으로 가지는 리스트를 생성하여 값을 초기화해주었다.
    • @GetMapping 어노테이션을 붙임으로써 "http://localhost:8080/message"로 요청이 들어오면 위에서 초기화한 리스트가 리턴된다.
package demo

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

@RestController
class MessageController {

    @GetMapping("/message")
    fun index(): List<Message> = listOf(
        Message("1", "Hello!"),
        Message("2", "Bonjour!"),
        Message("3", "Privet!")
    )
}

data class Message(val id: String?, val text: String)
  • 실행 결과:

 

3. Database 연동

 

1. data class에 @Table 어노테이션을 추가한다.

@Table("MESSAGE")
data class Message(@Id val id: String?, val text: String)
  • 코틀린에서는 기본적으로 null 값을 넣지 못한다.
  • ?는 null일 수 있음을 의미한다. 
    • 즉 여기서 id로 null이 들어올 수 있다.
  • !!은 null이 아니라고 선언해주는 것이다. 
  • 아래의 예제를 보자 
    • 변수 a와 c는 null 여부에 대해 선언해주지 않았기 때문에 기본적으로 null 값을 받는 것이 불가능하다. 
    • 이때 변수 b는 비록 null 값이 아닌 값을 가지고 있지만 null이 가능한 형태로 선언되어 있기 때문에 c는 b를 그대로 받을 수 없다. 
    • !! 표시를 통해 b가 null이 아님을 주장해야지만 c가 받을 수 있다. 
//        var a:Int = null -> error
        var a:Int? = null 
        var b:Int? = 10
//        var c:Int = b  -> error
        var c:Int = b!!

 

 

2. MessageRepository interface 파일 생성

  • 이 repository를 통해 Message 데이터를 다룰 수 있다. 
  • DB에 저장된 Message 데이터 모두를 리턴하는 함수 findMessages()를 선언해보자. 
package demo

import org.springframework.data.jdbc.repository.query.Query
import org.springframework.data.repository.CrudRepository

interface MessageRepository : CrudRepository<Message, String> {

    @Query("select * from message")
    fun findMessages(): List<Message>
}

 

3. MessageService class 생성

  • 위에서 생성한 MessageRepository에서 데이터를 가져와 처리하는 service class를 생성해보자.
  • findMessages(): 디비로부터 데이터를 받아와서 그대로 리턴
  • post(): 파라미터로 전달받은 데이터를 디비에 저장
package demo

import org.springframework.stereotype.Service

@Service
class MessageService(val db: MessageRepository) {

    fun findMessages(): List<Message> = db.findMessages()

    fun post(message: Message) {
        db.save(message)
    }
}

 

4. MessageController 클래스 수정

  • 이제 데이터베이스에 Message 데이터 정보를 저장할 수 있게 되었으니 MessageController도 수정해보자.
package demo

import org.springframework.data.annotation.Id
import org.springframework.data.relational.core.mapping.Table
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RestController

@RestController
class MessageController(val service: MessageService) {

    @GetMapping("/messages")
    fun index(): List<Message> = service.findMessages()

    @PostMapping("/message")
    fun post(@RequestBody message: Message) {
        service.post(message)
    }
}

@Table("MESSAGE")
data class Message(@Id val id: String?, val text: String)
  • 이 상태로 애플리케이션을 작동시켜 'http://localhost:8080/messages' url에 들어가 보면 에러가 발생할 것이다.
    • 디비 설정을 하지 않았기 때문!

 

5. Database 설정을 해보자

  • src/main/resources 하위에 'sql' 폴더를 생성하고 그 안에 schema.sql 파일을 생성하여 아래의 코드를 입력한다.
  • 이 코드를 통해 'message' table이 생성된다.
CREATE TABLE IF NOT EXISTS message (
    id VARCHAR(60) DEFAULT RANDOM_UUID() PRIMARY KEY,
    text VARCHAR NOT NULL
);
  • 이번에는 src/main/resources 폴더에 위치한 application.properties 파일에 아래의 설정을 입력한다.
    • H2 database를 이용하기 위해 다음과 같이 설정하자.
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:file:./data/testdb
spring.datasource.username=sa
spring.datasource.password=password
spring.datasource.schema=classpath:sql/schema.sql
spring.datasource.initialization-mode=always
  • 이제 다시 작동시켜보자.
    • Talend API Tester를 사용해서 테스트해보자
      • Talend API Tester: REST, SOAP, HTTP APIs를 시각적으로 통신할 수 있는 확장 프로그램

 

 

 

 

 

 

 

 

 

 

출처

- https://kotlinlang.org/docs/jvm-spring-boot-restful.html#explore-the-project-build-file

반응형
Comments