미소를뿌리는감자의 코딩

[Spring] annotation - RestController, GetMapping w. Postman 본문

강의수강/[Spring]

[Spring] annotation - RestController, GetMapping w. Postman

미뿌감 2024. 2. 28. 23:16
728x90

RestController와 GetMapping에 대해서 알아보자.

 

1. RestController

RESTful 웹 서비스 형성을 간소화 하기 위해서 적는 annotation이다.

@RestController = @Controller + @ResponseBody 이다.

주 목적: clinet가 만든 요청을 다루기 위해서 만들었다. : 

REST API ( GET, POST, Delete, PUT requests )들을 다룰 수 있도록 도와준다. 

* REST stands for.. Representational State Transfer

 

@controller: web request가 도달할 수 있는 종착역

@ResponseBody: HttpMessageWriter를 통해서, 반환하는 것을 직렬화 (serialize)

 - 즉 client에게 response를 보내는 본문: responseBody

- 반대로, server에게 request 보내는 본문: resquestBody

 

요약하자면, RestController은 client request가 도달하는 곳이며, REST API를 다루고, response를 보내는 본문을 만드는 곳이다.

 

주된 사용처는 다음과 같다.

만약, html과 같은 view를 반환해야한다면, Controller를 사용하는 것이 맞다.

Controller를 사용하면서, JSON을 반환해야하는 함수에만 따로 @ResponseBody를 적어준다.

 

package com.sparta.springmvc.response;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/response")
public class ResponseController {
    // Content- Type: text/html
    // Response Body
    // {"name" : "Robbie", "age":95} 로 client에게 반환
    @GetMapping("/json/string")
    @ResponseBody
    public String helloStringJson() {
        return "{\"name\":\"Robbie\",\"age\":95}";
    }

    // Content-Type : application/json
    // Response Body
    //{"name" : "Robbie", "age":95}  위에는 text type, 여기는 application/json 형태
    // Java의 객체를 Json 형태로 변환을 해준다. 반환하는.. 모든 것을 위에처럼 나타내기 힘드니까
    @GetMapping("/json/class")
    @ResponseBody
    public Star helloClassJson() {
        return new Star("Robbie", 95);
    }
}

위와 같이, @Controller와 @ResponseBody가 서로 분리되어 사용되고 있음을 확인할 수 있다.

 

하지만 반환하는 것이 JSON 밖에 없고, view를 반환할 일이 없다면, @RestController를 사용해줌이 편리하다.

@RestController는 Controller + ResponseBody이므로, ResponseBody를 생략해 줄 수 있다.

다음을 @RestController를 사용해 주는 예이다.

package com.sparta.springmvc.response;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/response/rest")
public class ResponseRestController {
    // [Response header]
    //   Content-Type: text/html
    // [Response body]
    //   {"name":"Robbie","age":95}
    @GetMapping("/json/string")
    public String helloStringJson() {
        return "{\"name\":\"Robbie\",\"age\":95}";
    }

    // [Response header]
    //   Content-Type: application/json
    // [Response body]
    //   {"name":"Robbie","age":95}
    @GetMapping("/json/class")
    public Star helloClassJson() {
        return new Star("Robbie", 95);
    }
}

 

다시 언급하지만, responsebody를 사용하는 이유는 spring boot에서, templates에서 html을 반환하는 것을 기본으로 인지하고 있기 때문에, html 파일이 아닌 그대로를 반환한다고 알려주기 위함이다.

 

2. GetMapping

RESTful web 서비스를 building 하는 annotation이다.

HTTP GET request를 특정 handler method에게 연결하는 역할을 한다. (restcontroller나, controller가 될 수 있을 것이다.)

 

<Get vs. Post>

- GET: side effect 없이 data를 가져오기 위해 사용 // 가져와서 보여줌. 상태를 바꾸지 않음.

- POST: server state를 바꾸기 위해 사용. 자원을 만들거나 업데이트 하기 위해 사용. // 서버 데이터를 바꿈.

 

Get은 민감한 자료를 보내는데 사용하면 안된다. why? parameter에 내용이 노출되기 때문에

반면 post는 response할 때, Body에 담아서 보낸다. 따라서 길이의 제한 없이 많은 자료를 보낼 수 있다.

따라서 담아 보내기 때문에, 보안상으로 더 안전하다고 생각할 수 있다.

+ 더 안전하게 하기 위해서는 '암호화' 해야 한다.

 

3. Postman

이를 통해서 spring통해 만든 api를 확인할 수 있다. 

@RestController
public class HelloController {

    @GetMapping("/api/hello")
    public String hello() {
        return "Hello World!";
    }
}

 

이런식으로 작성했다고 했을 때, 

 

사용한 GET 방식으로 바꾸어주고,

로컬 host로 이용하므로 localhost:8080을 통해 접근해서, 위에 적어놓은 것처럼 /api/hello를 통해서 접근한다.

 

8080을 한 이유는 default가 8080이다.

728x90