[Spring Boot] REST API 실습

Hood·2024년 7월 2일
0

Spring Boot

목록 보기
2/14
post-thumbnail

들어가며

인덕대학교 A&I 동아리를 하며 스터디 한 것을 바탕으로 작성하였습니다.


FirstSpringBoot

저번 포스트 때 https://start.spring.io/ 해당 URL에 들어가
FirstSpringBoot 라는 프로젝트 파일을 생성했었다.
이번 포스트에는 RESTful API를 실습해 볼 것이다.

@annotation 이란?

Spring Boot 에는 @ 어노테이션(annotation)이 존재한다.
Annotation 은 사전적 의미로는 주석이라는 뜻이며,
자바에서 Annotation 은 코드 사이에 주석처럼 쓰이며
특별한 의미, 기능을 수행하도록 하는 기술이다.
프로그램에서는 추가적인 정보를 제공해주는 메타데이터를 제공해 줄 것이다.

🔎 @RestController 생성

annotation의 기능을 알았다면, 프로젝트 파일 안에서 @RestController 를 생성해 보자.
@RestController 어노테이션은 Spring Boot에서 @Controller + @ResposibleBody이 합쳐진 표현이다. @RestController를 클래스에 명시해주면 해당 클래스 내에서
REST API를 생성할 수 있다.


✍ Human Class 생성

그럼 실습으로 Human 클래스를 만들어 클래스의 데이터들을 가져오는 간단한
REST API를 생성해 보자.
먼저 firstSpringBoot 프로젝트 파일 안으로 들어가
human 이라는 패키지를 생성해주고 그 안에 Controller와 model 패키지를 생성해 주었다.
이후 model 패키지 안에는 Human.kt
Controller 패키지 안에는 HumanController.kt 코틀린 파일을 생성해준다.
그리고 다음과 같은 코드를 각각 넣어준다.

//human.kt
class Human (
    val name :String,
    val age : Int,
    var id : Int,
)


//humanController.kt
@RestController()
@RequestMapping("/humans")
class HumanController {
    final var humans = mutableListOf<Human>()

    init {
        humans.addAll(
            listOf(
                Human(name = "짱구", age = 5, id = 1),
                Human(name = "맹구", age = 5, id = 2),
                Human(name = "철수", age = 5, id = 3),
                Human(name = "유리", age = 5, id = 4),
            )
        )
    }
    
    @GetMapping
    private fun getHumanList(): ResponseEntity<List<Human>> {
        return ResponseEntity
            .status(HttpStatus.OK)
            .body(humans)
    }
}

이후 실행해 본다면 다음과 같이 PostMan 에서
http://localhost:8080/humans 안에서
해당 결과를 얻을 수 있을 것이다.

✍ GET

이것이 스프링 부트의 @(Annotation)을 사용한 @GetMapping 이다.
GET 은 데이터를 읽는 것으로 일반적으로 데이터베이스에 저장된 내용을 요청한다.
리스트를 생성하고 그 리스트를 ResponsseEntity 안에 넣어주고
그 리스트를 GET으로 요청하면 HttpStatus를 OK로 준다는 간단한 원리이다.

🔎 HttpStatus

그렇다면 HttpStatus 응답 코드를 좀 알아야 할 것이다.
왜냐하면 HTTP 메소드는 기본적으로 응답 코드를 가지고
API 요청에 따라 응답코드를 반환해야 하기 때문이다.
간단하게 오늘 REST API 코드에 넣을 코드는 다음과 같다.

응답 코드반환
200OK, 요청이 성공하였다.
201CREATED, 요청이 성공하여, 새로운 데이터가 생성되었다.
202ACCEPTED, 요청은 전달받았으나, 아직 진행중이다.
204NO-CONTENT, 요청은 성공했지만, 반환하는 데이터가 존재하지 않는다.

✍ POST

POST 메소드는 데이터 생성을 요청하는 메소드이다.
좀 더 정확하게는 부모의 하위 리소스를 생성하는 행위이다.
기본적으로 200의 응답코드를 가지지만, 201의 응답코드를 반환하는 것이 더욱 좋다.
그럼 아래 코드를 Controller에 추가해 보자.

//humanController.kt
    @PostMapping
    fun postHuman(@RequestBody human : Human) : Human {
        humans.add(human)
        return human
    }

해당 코드는 리스트 안에 json을 넘겨주면
그 형식에 따라 새로운 데이터를 리스트 안에 넣어줄 것이다.
그리고 생성이 완료되면 CREATED 201 응답코드를 반환한 것이 보일 것이다.
이것이 바로 POST의 원리이다.

✍ PUT

PUT 메소드는 데이터의 변경을 요청하는 메서드이다.
하지만 입력 파라미터의 데이터가 존재하지 않는 경우
생성할 수 있게 메소드를 제작할 수 있다.
기본적으로 200의 응답코드를 가지지만 새로운 데이터가 생성되는 경우
POST와 동일한 메소드를 반환한다.

//humanController.kt
    @PutMapping("/{id}")
    fun putHuman(@PathVariable id: String, @RequestBody human: Human): ResponseEntity<Human> {
        var index: Int = -1
        for (h in humans) {
            if (h.id == id.toLong()) {
                index = humans.indexOf(h)
                humans[index] = human
            }
        }

        return if (index != -1) ResponseEntity.status(HttpStatus.OK).body(human) else postHuman(human)
    }

해당 코드는 경로의 리스트에 아이디를 찾아가서 그 인덱스 안에 있는 데이터를
수정하고 데이터가 없다면 생성하는 코드이다.
경로를 따라가기 위해서는 @PathVariable을 붙여줘야합니다.

✍ DELETE

마지막 DELETE 메서드는 데이터의 삭제를 요청하는 메소드입니다.
일반적으로 데이터베이스의 저장된 내용을 삭제하는 메서드이며,
기본적으로 200의 응답코드를 가지지만 요구에 따라 204의 응답코드를 반환할 수 있습니다.

//humanController.kt
    @DeleteMapping("/{id}")
    fun deleteHuman(@PathVariable id : String) : ResponseEntity<Any> {
        humans.removeIf{ it.id == id.toLong() }
        return ResponseEntity.status(HttpStatus.NO_CONTENT).build()

    }

DELETE도 마찬가지로 해당 경로의 id에 들어가 그 내용을 리스트에서 삭제하는
간단한 코드입니다. 그리고 삭제되었다면 응답코드를 204로 반환해줍니다.


📌 결론

RESTAPI를 사용하기 위해서는 Annotation 을 잘 붙어야 하며
수행 내용에 따라 정확한 HttpStatusCode 를 넘겨줘야 합니다.
해당 내용을 잘 기억해 둡시다.

해당 코드들은 GitHub에서 확인 할 수 있습니다.
https://github.com/stdiodh/SpringBoot

profile
달을 향해 쏴라, 빗나가도 별이 될 테니 👊

0개의 댓글