[Back-end] Kotlin Spring boot으로 간단한 REST API를 만들어보자 - 2

윤호이·2023년 12월 5일
0

Back-End

목록 보기
2/4
post-thumbnail

지난 이야기

[Back-end] Kotlin Spring boot으로 간단한 REST API를 만들어보자 - 1

지난번에는 간단하게 스프링 부트를 이용해서 hello world 를 찍어봤습니다. 이번엔 Maria DB 를 이용해서
간단한 CRUD API 를 구현 해보겠습니다.

Maria DB 다운로드

https://mariadb.org/download

해당 링크에 들어가서 마리아 디비를 다운로드 해줍시다.

원하는 버전을 고른 후 설치 해줍시다.

설치할 때 UTF-8 체크만 해주세요

설치할 때 아이디 비밀번호를 잘 기억해주세요!

Maria DB 설정

설치를 다했다면

이런 아이콘을 누르고 들어가줍시다.

ROOT에 아까 설치 할 때 만든 아이디 비번을 입력해주고

열기를 눌러줍니다.

그 후 데이터 베이스를 새로 생성해줍니다.

저는 yunho 라는 스키마로 만들었습니다.

이제 스프링 부트 프로젝트 안에서

application.properties 안에 해당 내용을 넣어줍시다.

spring.jpa.hibernate.ddl-auto=update
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://[주소]:3306/[스키마]
spring.datasource.username=[DB 아이디]
spring.datasource.password=[DB 비밀번호]

포트는 기본 3306 입니다.
지금은 주소는 localhost 스키마는 yunho로 하겠습니다.

spring.datasource.url=jdbc:mariadb://localhost:3306/yunho

이제 마리아 디비를 스프링 부트에 연동을 했습니다.

이 연결한 디비를 기반으로 REST API 를 만들어보겠습니다.

Entity

DB에 저장할 엔티티를 만들어봅시다.

@Entity
@Table(name = "post")
@Getter
@Setter
data class PostEntity(
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        val id: Long = 0,
        val name: String,
        val age: Int
){
        constructor() : this(0, "", 0)
}

앞으로 해당 엔티티는 post 라는 테이블에 맵핑되게됩니다.

Repository With JPA

JPA 를 이용해서 아주 간단하게 Respository를 만들어봅시다.

JPA를 사용한다면 SQL를 사용하지 않고도 간단한

CRUD를 할 수 있습니다.

@Repository
interface PostRepository: JpaRepository<PostEntity,Long> 

Service

이제 비즈니스 로직을 관리하는 서비스 클래스를 만들어 봅시다.

@Service
class PostService(private val repository: PostRepository) {

    fun getAllPosts() : List<PostEntity> = repository.findAll()
    fun createPost(name: String, age: Int) : PostEntity{
        val post = PostEntity(name = name, age = age)
        return repository.save(post)
    }

    fun getPostById(id:Long) : PostEntity? {
        return repository.findByIdOrNull(id)
    }

    fun updatePost(id: Long, name: String, age: Int) : PostEntity? {
        val exist = repository.findByIdOrNull(id)
        exist?.let {
            return repository.save(PostEntity(name = name, age = age))
        }
        return null
    }

    fun deletePost(id: Long) = if (repository.findByIdOrNull(id) != null){
        repository.deleteById(id)
        true
    }else {
        false
    }
}

아까 만든 레포지토리를 이용해서 서비스를 이용해 비즈니스 로직을

다루도록 하겠습니다.

Controller

저번 포스트에서 컨트롤러를 이용해서 Hello World 를 찍어봤었죠?

이제 제대로 봐봅시다.

@RestController
@RequestMapping("/posts")
class PostController {

    @Autowired
    private lateinit var postService: PostService

    @GetMapping
    fun getAllPosts(): ResponseEntity<List<PostEntity>> {
        val posts = postService.getAllPosts()
        return ResponseEntity(posts, HttpStatus.OK)
    }

    @PostMapping
    fun createPost(@RequestParam name: String, @RequestParam age: Int): ResponseEntity<PostEntity> {
        val createdPost = postService.createPost(name, age)
        return ResponseEntity(createdPost, HttpStatus.CREATED)
    }

    @GetMapping("/{id}")
    fun getPostById(@PathVariable id: Long): ResponseEntity<PostEntity?> {
        val post = postService.getPostById(id)
        return if (post != null) {
            ResponseEntity(post, HttpStatus.OK)
        } else {
            ResponseEntity(HttpStatus.NOT_FOUND)
        }
    }

    @PutMapping("/{id}")
    fun updatePost(
            @PathVariable id: Long,
            @RequestParam name: String,
            @RequestParam age: Int
    ): ResponseEntity<PostEntity?> {
        val updatedPost = postService.updatePost(id, name, age)
        return if (updatedPost != null) {
            ResponseEntity(updatedPost, HttpStatus.OK)
        } else {
            ResponseEntity(HttpStatus.NOT_FOUND)
        }
    }

    @DeleteMapping("/{id}")
    fun deletePost(@PathVariable id: Long): ResponseEntity<Unit> {
        val isDeleted = postService.deletePost(id)
        return if (isDeleted) {
            ResponseEntity(HttpStatus.NO_CONTENT)
        } else {
            ResponseEntity(HttpStatus.NOT_FOUND)
        }
    }
}

저는 Rest로 만들거기 때문에 RestController 로 했습니다.

우리가 만약 주소가 https://localhost:8080 이라면

Controller에선 만약 요청이 https://localhost:8080/posts

로 들어오는 요청을 처리하게 됩니다.

만약 우리가 아이디가 2인 사람을 디비에서 찾고싶으면

https://localhost:8080/posts/2

@GetMapping("/{id}")
   fun getPostById(@PathVariable id: Long): ResponseEntity<PostEntity?> {
       val post = postService.getPostById(id)
       return if (post != null) {
           ResponseEntity(post, HttpStatus.OK)
       } else {
           ResponseEntity(HttpStatus.NOT_FOUND)
       }
   }

이 함수를 통해 처리하게 됩니다.

이 API 를 사용하는 쪽에는 body에 결과와 상태를 리턴해주고요.

하고 싶은 말

다음 시간에는 만든 API를 이용해서 안드로이드 앱에 연동하는 것을 보여드리도록 하겠습니다.

MVC 이지만 사실 V를 전혀 다루지 않고있습니다. 그냥 MC만 다루고

나머지는 안드로이드에서 처리해야겠네요.

profile
열정은 내 삶의 방식, 꾸준함은 내 삶의 증명

0개의 댓글