RestApi개발 과정 중 컨트롤러 구현 방법 및 유용한 어노테이션에 대해 알아보겠습니다.
1. Controller 역할
구현 방법에 앞서 컨트롤러의 역할은 여러 형태의 클라이언트로부터 요청을 받아 비즈니스 로직으로 전달하고
비즈니스 로직의 결과를 응답해주는 역할을 합니다.
2. Methods
Restful 한 api를 구현하기 위해 HTTP Methods를 활용하여 API가 처리해야 할 행위를 정의합니다.
주로 사용하게 되는 Methods는 아래와 같으며 URL 설계에 대한 내용은 다른 포스팅에서 다루도록 하겠습니다.
- GET: 리소스를 조회합니다.
- POST: 리소스를 생성합니다
- PUT: 리소스를 교체합니다.
- DELETE: 리소스를 삭제합니다.
- PATCH: 리소스를 업데이트합니다.
참고로 PUT과 PATCH의 차이는 PUT은 기존 데이터를 요청된 데이터로 교체하고
PATHC는 요청된 데이터만 업데이트를 합니다.
[PUT] /user/1 | [PATCH] /user/1 | |
요청 Data | { Id: 1, age: 25 } |
{ Id: 1, age: 25 } |
원본 Data | { Id: 1, name: "홍길동", age: 20 } |
{ Id: 1, name: "홍길동", age: 20 } |
결과 Data | { Id: 1, name: null, age: 25 } |
{ Id: 1, name: "홍길동", age: 25 } |
하지만 실무에서는 다양한 방법으로 PUT과 PATCH에 대해 구현하는 방법이 다르니 참고해두면 좋습니다.
3. Controller 관련 어노테이션
어노테이션 | 설명 |
@RestController | 모놀릭 방식의 MVC 패턴 방식이 아닌 Rest API 구현을 위한 컨트롤러 선언 @Controller + @RequestBody 기능을 제공합니다. |
@Controller | MVC 패턴 방식을 위해 제공하는 어노테이션 |
@RequestMapping | 요청에 대한 Methods, URL 매핑 |
@GetMapping | GET 요청 대한 URL 매핑 |
@PostMapping | POST 요청 대한 URL 매핑 |
@PutMapping | PUT 요청 대한 URL 매핑 |
@DeleteMapping | DELETE 요청 대한 URL 매핑 |
@PatchMapping | PATCH 요청 대한 URL 매핑 |
@PathVariable | API URL중 특정 구분 값을 처리하기 위해 사용 |
@RequestHeader | Request Header에 대해 매핑 |
@RequestParam | Request Parameter 에 대해 매핑 |
@ModelAttribute | Request Parameter 에 대해 Object Model로 매핑하기 위해 사용 |
@RequestBody | Request Body 에 대해 Object Model로 매핑하기 위해 사용 |
4. 구현 방법
Rest Api 컨트롤러임을 선언하기 위해 @RestController를 사용합니다.
그리고 Methods 별 어노테이션 또는 @RequestMapping 어노테이션을 사용하여 각 API URL에 대해분기 처리를 하고 Request 정보(Header, Parameter, Body...)를 매핑하면 아래 예시처럼 컨트롤러 구현은 간단하게 처리 가능합니다.
package kr.co.sample.sampleapi.controller;
import kr.co.sample.sampleapi.entity.User;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
@RestController
public class TestController {
@GetMapping(value = "/user/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
public Object findUser(
@PathVariable(value = "id", required = true) String id,
@RequestHeader(value = "User-Agent") String userAgent,
@RequestParam(value = "param1", required = false) String param1,
@RequestParam(value = "param2", required = false) String param2){
return true;
}
@GetMapping(value = "/user", produces = MediaType.APPLICATION_JSON_VALUE)
public Object findUsers(
@RequestHeader(value = "User-Agent") String userAgent,
@ModelAttribute User user){
return true;
}
@PostMapping(value = "/user", produces = MediaType.APPLICATION_JSON_VALUE)
public Object CreateUser(
@RequestHeader(value = "User-Agent") String userAgent,
@RequestBody(required = true) User user){
return true;
}
}
'Spring' 카테고리의 다른 글
[Spring Boot] Rest API 만들기(5) 비동기 예외 처리 (0) | 2021.01.26 |
---|---|
[Spring Boot] Rest API 만들기(4) 예외 처리 @RestControllerAdvice (2) | 2021.01.23 |
[Spring Boot] Rest API 만들기(3) Swagger API 문서 자동화 적용 (1) | 2021.01.13 |
[Spring Boot] Rest API 만들기(1)- 프로젝트 생성 intellij(Community) + JPA (0) | 2019.11.19 |