스프링 부트에서 사용되는 패턴은 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의 경로를 변수로 사용한다는 것은 /posts/1
에서 1을 식별할 때 사용하는 경우이다. @~Mapping
어노테이션에 경로를 지정할 때 {}
를 사용하여 변수로 사용할 부분의 변수명을 지정한 후 메소드에 같은 이름으로 매개변수를 생성하고@PathVariable
어노테이션을 지정하면 사용할 수 있다.
쿼리스트링은 /posts?page=1
와 같이 사용하는 것을 의미한다. 보통 GET요청을 할 때 자원의 주요 특징이 아닌 옵션을 지정할 때 많이 사용한다. 매개변수에 @RequestParam
을 지정하면 사용할 수 있다.
POST
, PUT
요청은 BODY에 데이터를 실어서 보낼 수 있다. 이 데이터를 원하는 객체로 매핑을 하기 위해선 매개변수에 @RequestBody
어노테이션을 지정하면 된다.
최근에는 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";
}
}