본문 바로가기
내일배움캠프(Sparta)/Spring

[Spring] Jackson / Path Variable / Request Param

by mmm- 2023. 11. 2.

Jackson

: Java 객체와 JSON 데이터 간의 변환을 자동으로 처리해주는 라이브러리

  • Oject ➡️ JSON 타입의 String 변환 가능
    (반대로, JSON 타입의 String ➡️ Oject 변환 가능)
  • 3.0 버전 이후 Spring은 Jackson과 관련된 API를 제공함으로써, JSON 데이터를 처리하지 않아도 자동으로 처리해줌

 

Object To JSON (객체 ➡️ JSON)

  • Get 메서드 필요

 

ObjectMapper

: 객체를 JSON으로 serialization or JSON을 객체로 deserialization할 때 사용하는 Jackson 라이브러리의 클래스

  • writeValueAsString() 이라는 메서드를 가지고 있음.
    • 해당 메서드에 Object 객체를 매개변수로 넣어주면 String 타입으로 반환해줌
public class JacksonTest {
    @Test
    @DisplayName("Object To JSON : get Method 필요")
    void test1() throws JsonProcessingException {
        Star star = new Star("Robbie", 95);

        ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper
        String json = objectMapper.writeValueAsString(star);

        System.out.println("json = " + json);
    }
}

 


JSON To Object

  • 기본 생성자와 get or set 메서드가 필요
  • readValue() 라는 메서드를 가지고 있음.
    • 해당 메서드에 첫 번째 파라미터에는 JSON 타입의 String을 넣어주고, 두 번째 파라미터에는 어떤 객체로 mapping 할 건지를 넣어주면 됨.
@Test
@DisplayName("JSON To Object : 기본 생성자 & (get OR set) Method 필요")
void test2() throws JsonProcessingException {
    String json = "{\"name\":\"Robbie\",\"age\":95}"; // JSON 타입의 String

    ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper

    Star star = objectMapper.readValue(json, Star.class);
    System.out.println("star.getName() = " + star.getName());
}

 


  • 브라우저에서 서버로 HTTP 요청을 보낼 때 데이터를 함께 보낼 수 있음
  • 서버에서는 해당 데이터를 받아 사용해야하는데 데이터를 보내는 방식은 여러 가지 

 

Path Variable 방식

: 보내려고 하는 데이터를 브라우저에서 경로에 넣어놓는 것

  • 서버에 보내려는 데이터를 URL 경로에 추가 가능
	// GET http://localhost:8080/hello/request/star/Robbie/age/95
    @GetMapping("/star/{name}/age/{age}")
    @ResponseBody
    public String helloRequestPath(@PathVariable String name, @PathVariable int age)
    {
        return String.format("Hello, @PathVariable.<br> name = %s, age = %d", name, age);
    }

 

  • @PathVariable annotation을 파라미터 안에 넣어 해당 경로에 있는 중괄호로 감싸진 데이터를 받아옴

Request Param 방식

: Query String 방식이라고도 부름.

  • @RequestParam annotation 생략도 가능.
  • 해당 annotation이 생략되어있지 않으면 (required = true)가 default로 설정되어 있는 것이므로 값이 꼭 와야 함.
    • @RequestParam(required = false)로 설정 바꿀 수 있음. ➡️ false로 설정할 경우 null 값이 들어옴

 

GET 방식

// [Request sample]
// GET http://localhost:8080/hello/request/form/param?name=Robbie&age=95
@GetMapping("/form/param")
@ResponseBody
public String helloGetRequestParam(@RequestParam String name, @RequestParam int age) {
    return String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age);
}
  • 위의 코드 2번째 줄에서 ? 앞 param 까지가 API 요청 URL
  • 데이터를 시작할 때 물음표로 시작'
  • 여러 데이터를 보낼 수 있고, 데이터간 구분 방법은 & 
  • @RequestParam annotation을 파라미터 안에 넣어 ? 이후에 있는 데이터를 받아옴

 

Form태그 POST

  • Content type: application/x-www-form-urlencoded
    이와 같은 타입으로 넘어옴
  • POST는 GET과는 다르게 HTTP Body(payload)에 데이터를 가지고 있음.
    // [Request sample]
    // POST http://localhost:8080/hello/request/form/param
    // Header
    //  Content type: application/x-www-form-urlencoded
    // Body
    //  name=Robbie&age=95
    @PostMapping("/form/param")
    @ResponseBody
    public String helloPostRequestParam(@RequestParam String name, @RequestParam int age) {
        return String.format("Hello, @RequestParam.<br> name = %s, age = %d", name, age);
    }

용어 정리

  • serialization
    : 직렬화. 객체를 JSON으로 변환하는 것 (JSON 외에도)
  • deserialization
    : 역직렬화. JSON을 객체로 변환하는 것 (JSON 외에도)