[스프링부트로 API 만들기] API 요청을 받아 처리하는 컨트롤러

황상일·2021년 1월 2일
1

스프링 부트에서 사용되는 패턴은 MVC패턴이라고 이전에 설명을 했었다. 그중에서 컨트롤러에 대해 알아보겠다.

컨트롤러?

컨트롤러는 이름의 뜻 그대로 제어를 담당한다. 사용자의 요청을 받아서 그에 맞는 행동을 연결해 주는 역할을 한다. 그렇기 때문에 사용자의 요청을 분석하고, 처리된 결과를 응답할수 있도록 가공해주어야 한다.

스프링 부트에서의 컨트롤러

스프링 부트에서는 클래스에 @Controller를 포함한 어노테이션만 붙여주어도 컨트롤러를 만들 수 있습니다.

@Controller
@RequestMapping("/posts")
public class PostController {

    @GetMapping
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public String getPosts(
            @RequestParam Long page
    ){
        return "posts";
    }


    @GetMapping("/{postId}")
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public String getPost(
            @PathVariable long postId
    ){
        return "post";
    }


    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    @ResponseBody
    public String addPost(
            @RequestBody updatePostRequest updatePostRequest
    ){
        return "post added";
    }

    @PutMapping("/{postId}")
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public String updatePost(
            @PathVariable long postId,
            @RequestBody updatePostRequest updatePostRequest
    ){
        return "post updated";
    }

    @DeleteMapping("/{postId}")
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public String deletePost(
            @PathVariable long postId
    ){
        return "post deleted";
    }
}

경로 지정하기

@~Mapping어노테이션은 요청의 URL을 지정하는 기능을 가지고 있습니다. @RequestMapping을 클래스에 선언하면, 해당 컨트롤러의 전역적인 경로를 지정할 수 있고, @GetMapping, @PostMapping 을 메소드에 선언하면 상세 URL과 HTTP메소드를 지정할 수 있습니다.
예를 들면 getPost는 /post 경로로, GET 요청, updatePost는 /post/{postId}로 PUT 요청을 받았을 떄 동작을 하게 됩니다.

응답 상태값 지정하기

HTTP에서 요청에 응답할 때 여러가지 상태코드를 같이 반환한다. HTTP에서 지켜야 하는 규칙이기 때문에 상황에 맞게 지정해주는 것이 중요하다. @ResponseStatus를 사용하여 지정할 수 있다.

요청으로 부터 변수 받기

HTTP에서 컨트롤러가 사용자에게 요청을 받는 방법은 여러가지가 있다. URL의 경로, 쿼리스트링, requestbody, header 보통은 앞의 세개를 많이 사용하니 이부분에 대해서 기술하겠다.

URL의 경로를 변수로 사용하기

URL의 경로를 변수로 사용한다는 것은 /posts/1에서 1을 식별할 때 사용하는 경우이다. @~Mapping어노테이션에 경로를 지정할 때 {}를 사용하여 변수로 사용할 부분의 변수명을 지정한 후 메소드에 같은 이름으로 매개변수를 생성하고@PathVariable 어노테이션을 지정하면 사용할 수 있다.

쿼리스트링을 변수로 사용하기

쿼리스트링은 /posts?page=1와 같이 사용하는 것을 의미한다. 보통 GET요청을 할 때 자원의 주요 특징이 아닌 옵션을 지정할 때 많이 사용한다. 매개변수에 @RequestParam을 지정하면 사용할 수 있다.

Request Body를 변수로 사용하기

POST, PUT요청은 BODY에 데이터를 실어서 보낼 수 있다. 이 데이터를 원하는 객체로 매핑을 하기 위해선 매개변수에 @RequestBody 어노테이션을 지정하면 된다.

RestController

최근에는 MVC패턴에서 V를 따로 개발을 많이 하는 추세이다. @Controller는 View를 반환하기 때문에 앞의 예제에서 @ResponseBody를 붙여서 반환하는 데이터가 응답값임을 나타냈지만 @RestController를 사용하면 View를 사용하지 않고 데이터를 반환한다는 의미이기 때문에 @ResponseBody 없이 작성할 수 있다.

최종 결과물

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

    @GetMapping
    @ResponseStatus(HttpStatus.OK)
    public String getPosts(
            @RequestParam Long page
    ){
        return "posts";
    }


    @GetMapping("/{postId}")
    @ResponseStatus(HttpStatus.OK)
    public String getPost(
            @PathVariable long postId
    ){
        return "post";
    }


    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public String addPost(
            @RequestBody GetPostRequest getPostRequest
    ){
        return "post added";
    }

    @PutMapping("/{postId}")
    @ResponseStatus(HttpStatus.OK)
    public String updatePost(
            @PathVariable long postId,
            @RequestBody String request
    ){
        return "post updated";
    }

    @DeleteMapping("/{postId}")
    @ResponseStatus(HttpStatus.OK)
    public String deletePost(
            @PathVariable long postId
    ){
        return "post deleted";
    }
}

현재까지의 패키지 상태

profile
받은만큼 나눠주자

0개의 댓글