스프링 부트에서 사용되는 패턴은 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;
}
현재까지의 패키지 상태
'springboot로 API만들어보기' 카테고리의 다른 글
[스프링부트로 API 만들기] Api 구현해보기 (0) | 2021.01.03 |
---|---|
[스프링부트로 API 만들기] 데이터를 관리해주는 모델 (0) | 2021.01.03 |
[스프링부트로 API 만들기]기능을 수행해주는 서비스 (0) | 2021.01.03 |
[스프링부트로 API 만들기] 스프링부트 프로젝트 시작하기 (0) | 2021.01.03 |
[스프링부트로 API 만들기] 스프링? 스프링부트? (0) | 2021.01.03 |
댓글