[Back-end] Kotlin Spring boot으로 간단한 REST API를 만들어보자 - 1
지난번에는 간단하게 스프링 부트를 이용해서 hello world 를 찍어봤습니다. 이번엔 Maria DB 를 이용해서
간단한 CRUD API 를 구현 해보겠습니다.
해당 링크에 들어가서 마리아 디비를 다운로드 해줍시다.
원하는 버전을 고른 후 설치 해줍시다.
설치할 때 UTF-8 체크만 해주세요
설치할 때 아이디 비밀번호를 잘 기억해주세요!
설치를 다했다면
이런 아이콘을 누르고 들어가줍시다.
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 를 만들어보겠습니다.
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 라는 테이블에 맵핑되게됩니다.
JPA 를 이용해서 아주 간단하게 Respository를 만들어봅시다.
JPA를 사용한다면 SQL를 사용하지 않고도 간단한
CRUD를 할 수 있습니다.
@Repository
interface PostRepository: JpaRepository<PostEntity,Long>
이제 비즈니스 로직을 관리하는 서비스 클래스를 만들어 봅시다.
@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
}
}
아까 만든 레포지토리를 이용해서 서비스를 이용해 비즈니스 로직을
다루도록 하겠습니다.
저번 포스트에서 컨트롤러를 이용해서 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만 다루고
나머지는 안드로이드에서 처리해야겠네요.