본문 바로가기

Spring

[Spring Boot] Rest API 만들기(2) Controller 구현

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;
    }
}