Recent Posts
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 헥사고날아키텍처 #육각형아키텍처 #유스케이스
- k8s #kubernetes #쿠버네티스
- 자원부족
- preemption #
- 코루틴 빌더
- terminal
- 달인막창
- kotlin
- JanusWebRTCGateway
- VARCHAR (1)
- 겨울 부산
- table not found
- PytestPluginManager
- mp4fpsmod
- python
- pytest
- 티스토리챌린지
- 코루틴 컨텍스트
- Value too long for column
- vfr video
- JanusGateway
- JanusWebRTC
- 오블완
- JanusWebRTCServer
- taint
- tolerated
- 개성국밥
- 깡돼후
- PersistenceContext
- Spring Batch
Archives
너와 나의 스토리
[Kotlin] Spring Boot로 RESTful 웹 서비스 만들기 본문
반응형
1. Spring initializr로 프로젝트 생성
- 기본 프로젝트 다운: https://start.spring.io/
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를 시각적으로 통신할 수 있는 확장 프로그램
- Talend API Tester를 사용해서 테스트해보자
출처
- https://kotlinlang.org/docs/jvm-spring-boot-restful.html#explore-the-project-build-file
반응형
'Programming Language > Kotlin' 카테고리의 다른 글
[Kotlin] 클래스와 인터페이스2 - 데이터 클래스/클래스 위임/object 키워드 사용 (0) | 2021.06.15 |
---|---|
[Kotlin] 클래스와 인터페이스1 - 초기화(주 생성자와 부 생성자)/가시성 변경자/프로퍼티 (0) | 2021.06.14 |
[Kotlin] 함수 정의와 호출1 - 컬렉션/확장 함수/로컬 함수/문자열을 정규식으로 나누기 (0) | 2021.06.12 |
[Kotlin] 코틀린 기초2 - 스마트 캐스트, 이터레이션(for 문, 컬렉션이나 원소 검사), 예외 처리 (0) | 2021.06.11 |
[Kotlin] 코틀린 기초1 - 함수, 변수, 클래스, property, enum, when (1) | 2021.06.10 |
Comments