본문 바로가기
Spring Boot

[Kotlin Spring Boot 강의] JDBC로 실제 DB 연동하는 CRUD API 구현 방법

by 뷰티풀스택 2025. 2. 3.
반응형

Kotlin Spring Boot으로 Database 연동하는 CRUD API 만들기

 

1. Database Source 연결하기

IntelliJ 에디터 사용법

에디터 오른쪽에 상단에 보면 작은 아이콘으로 Gradle도 있고 Database도 있다. Database를 누르고, 간단한 DB 정보들을 입력해주면 별도의 pgAdmin 등 클라이언트 필요없이 에디터에서 모두 관리 할 수 있어서 편리하다.

IntelliJ Database

 

데이터 소스 선택

+ 버튼을 누르면 현존하는 대부분의 데이터베이스를 선택할 수 있다.

Data Source 종류

 

Connection 정보 입력

간략하게 연결정보를 입력한다. 혹시, Amazon RDS 를 사용한다면 Host에 localhost 대신 URL 주소를 입력하면 된다.

 

Test Connection

올바르게 입력이 되었다면 Test Connection을 누르면 아래와 같이 정상연결됨을 확인할 수 있다.

 

참고로, jdbc 주소는 스프링에서 사용할 예정이니 기억하기를 바란다.

jdbc:postgresql://localhost:5432/postgres

 

2. 스프링에서 Database Source 설정하기

소스 디렉토리 하위에 보면 application.properties 라는 파일이 있다. 이곳에서 위에서 설정한 Postgre Database 정보를 입력해줄 것이다.

Kotlin application.properties 파일 위치

 

Driver Class 이름 세팅

처음 application.properties 파일을 열게 되면 다음의 한줄만 있고 아무것도 없을 것이다.

spring.application.name=demo

 

PostgreSQL DB의 Driver Class 이름을 입력준다. 혹시 모를때에는 위에서 설정하였던 Data Sources and Drivers라는 창을 열고 Drivers 탭을 클릭하면 아래와 같이 다양한 데이터베이스 리스트가 나온다.

Kotlin Database Drivers 정보 확인 방법

 

Postgre DB Class Name

 

JDBC Connection Info 세팅

위에서 알아두었던 PostgreSQL의 JDBC URL을 입력한다. 

spring.application.name=demo

# Postgres Driver Class
spring.datasource.driver-class-name=org.postgresql.Driver

# JDBC URL
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres

# Postgres Connection Info
spring.datasource.username=postgres
spring.datasource.password=yourpassword

 

3. 스키마 생성

리소스 디렉토리에 스키마파일을 작성한다.

 

Kotlin Schema 파일

 

-- schema.sql
CREATE TABLE IF NOT EXISTS books (
    id      SERIAL  PRIMARY KEY,
    title   TEXT    NOT NULL,
    author  TEXT    NOT NULL
);

 

application.properties 파일에 위의 schema.sql 파일을 추가한다.

spring.sql.init.schema-locations=classpath:schema.sql
spring.sql.init.mode=always

 

4. PostgreSQL Driver Starter 추가

build.gradle.kts 에서 PostgreSQL Starter를 추가해준다. 아래와 같이 Add Starters 버튼을 클릭하면 편리하다.

 

SQL 탭에서 PostgreSQL을 선택하면 자동으로 Driver가 추가가 된다.

 

5. 실제 데이터베이스에 테이블 생성되었는지 확인

현재까지 세팅한 것을 기반으로 Spring Boot Application을 실행한다. 그리고, 실제 PostgreSQL 데이터베이스를 확인하면 books 라는 테이블이 정상적으로 잘 만들어진 것을 볼 수 있다.

 

6. 기존 Data Class에 Table 어노테이션 추가하기

기존 Book Data Class는 다음과 같다. 혹시, 이전 블로그를 보지 않았다면 아래에서 볼 수 있다.

https://scienceai.tistory.com/entry/Kotlin-Spring-Boot-%EA%B0%95%EC%9D%98-Data-class%EB%A1%9C-Json-%ED%98%95%EC%8B%9D-Rest-API-%EB%A7%8C%EB%93%9C%EB%8A%94-%EB%B0%A9%EB%B2%95

 

[Kotlin Spring Boot 강의] Data class로 Json 형식 Rest API 만드는 방법

Kotlin data class로 Json 형식 Rest API 만드는 방법지난 강의에서는 Rest API 구현 기초를 위해 간단하게 Hello 메세지만 Plain text로 응답하는 간단한 Rest API를 만들었다.[Kotlin Spring Boot 강의] 사용자 입력에

scienceai.tistory.com

 

package com.example.demo

data class Book(val id: Int, val title: String, val author: String)

 

이제 아래와 같이 데이터베이스 테이블에 사용되는 Data Class임을 선언한다.

package com.example.demo

data class Book(val id: Int, val title: String, val author: String)

 

참고로, Database Source 툴바를 오른쪽에 열어두고 같이 보면서 작업하면 편리하다.

 

7. JDBC Template Service 추가

JDBC는 가장 기본적인 DB 서비스를 추가하는 package이다. query 함수는 2개의 입력이 필요한데, 첫번째는 SQL 문을 입력한후, 각 Row 마다 적용할 콜백 함수를 정의해주어야 한다. 

package com.example.demo

import org.springframework.data.repository.findByIdOrNull
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.jdbc.core.query
import org.springframework.stereotype.Service

@Service
class BookService(private val db: JdbcTemplate) {
    fun findBooks(): List<Book> = db.query("SELECT * FROM books") { response, _ ->
        Book(response.getInt("id"), response.getString("title"), response.getString("author"))
    }

    fun addBook(book: Book): Book {
        db.update(
            "INSERT INTO books (title, author) VALUES (?, ?)",
            book.title, book.author
        )
        return book.copy(title = book.title, author = book.author)
    }

    fun findBookById(id: Int): Book? =
        db.query("SELECT * FROM books WHERE id = ?", id) { response, _ ->
            Book(response.getInt("id"), response.getString("title"), response.getString("author"))
        }.singleOrNull()
}

 

8. CRUD Controller 업데이트

컨트롤러는 웹 요청과 서비스로직을 연결하는 것으로써 지난 강의에서 배웠던 Request Mapping을 적절히 해주면 쉽게 구현된다.

package com.example.demo

import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
import java.net.URI

@RestController
@RequestMapping("/books")
class BookController(private val service: BookService) {
    @GetMapping
    fun findBooks() = ResponseEntity.ok(service.findBooks())

    @PostMapping
    fun addBook(@RequestBody book: Book): ResponseEntity<Book> {
        val savedBook = service.addBook(book)
        return ResponseEntity.created(URI.create("/books/${savedBook.id}")).body(savedBook)
    }

    @GetMapping("/{id}")
    fun getBook(@PathVariable id: Int): ResponseEntity<Book> = service.findBookById(id).toResponseEntity()

    private fun Book?.toResponseEntity(): ResponseEntity<Book> = this?.let { ResponseEntity.ok(it)} ?: ResponseEntity.notFound().build()
}

@RequestBody는 Json 입력 데이터를 HTTP Body에 넣어질 수 있도록 Object로 변환해준다. 정상적으로 DB에 저장이 되면 201 응답이 되도록 ReponseEntity.created 를 해주면 된다.  

이제, 실제 웹요청과 관련 데이터베이스를 연결해보겠다.

 

9. API 호출

API GET LIST

 

지금 조회하면 아무 것도 리턴되지 않는다. 데이터베이스를 만들고 아무것도 넣지 않아서 정상이다. 

 

데이터 추가

id는 자동으로 증가되도록 스키마를 만들어 두었기 때문에 title과 author만 값을 입력해서 POST 요청하면 된다. 참고로, IntelliJ에서는 매우 편리한 requests 툴이 내장되어 있다.

아래와 같이 http 확장자로 편하게 POST JSON 요청을 할 수 있다.

### Post Request
POST http://localhost:8080/books
Content-Type: application/json

{
  "title": "코틀린 강의",
  "author": "뷰티플스택"
}

### Post Request
POST http://localhost:8080/books
Content-Type: application/json

{
  "title": "스프링 부트 강의",
  "author": "뷰티플스택"
}

### Post Request
POST http://localhost:8080/books
Content-Type: application/json

{
  "title": "코틀린 안드로이드 강의",
  "author": "뷰티플스택"
}

### Get all the books
GET http://localhost:8080/books

 

정상적으로 수행이 되었다면 201 응답을 아래와 같이 받게 된다.

POST http://localhost:8080/books
Content-Type: application/json

{
  "title": "코틀린 안드로이드 강의",
  "author": "뷰티플스택"
}

###

HTTP/1.1 201 
Location: /books/0
Content-Type: application/json
Transfer-Encoding: chunked

 

실제 PostgreSQL DB에서도 조회해보면 정상적으로 3개의 Post 요청이 잘 추가되어있음을 확인할 수 있다.

 

다시 API GET LIST

다시 API Get List를 요청해본다. 처음에는 아무것도 응답이 없었는데 지금은 정상적으로 3개의 아이템이 전달된다.

http://localhost:8080/books

 

API Get Find By Id

아이디를 알고 있을 경우 별도 파라미터 입력없이 URI에 바로 ID 값을 입력해 특정 데이터만 가져올 수도 있다.

 

축하합니다!

이로써 우리는 실제 PostgreSQL DB와 연동하는 코틀린 스프링 부트 벡엔드 API를 만드는 방법을 터득하였다.

이번 강의가 어려웠을 경우에는 꼭 이전 강의를 다시 복습하기를 바란다.

[Kotlin Spring Boot 강의] Data class로 Json 형식 Rest API 만드는 방법

 

[Kotlin Spring Boot 강의] Data class로 Json 형식 Rest API 만드는 방법

Kotlin data class로 Json 형식 Rest API 만드는 방법지난 강의에서는 Rest API 구현 기초를 위해 간단하게 Hello 메세지만 Plain text로 응답하는 간단한 Rest API를 만들었다.[Kotlin Spring Boot 강의] 사용자 입력에

scienceai.tistory.com

 

반응형

댓글