본문 바로가기
springboot로 API만들어보기

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

by alwaysone 2021. 1. 3.

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

컨트롤러?

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

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

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

>> post/controller/PostController.java

@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 없이 작성할 수 있다.

최종 결과물

>> post/controller/PostController.java

@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 updatePostRequest updatePostRequest
    ){
        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";
    }
}

 

> post/request/UpdatePostRequest.java

@Getter
@AllArgsConstructor
public class UpdatePostRequest {
    String title;
    String body;
}

현재까지의 패키지 상태

댓글