Spring - Jackson

김상엽·2024년 1월 22일
0

Spring

목록 보기
4/26
post-thumbnail

TIL

Spring

Client에게 데이터 response하기

본격적으로 Spring을 배우면서 가장 궁금했던 부분이었다. 내부 동작은 기존의 Java와 많이 다르지 않을 것이라고 예상을 했지만, 가장 큰 차이점은 Java에서는 값을 System.out.print로 출력해주던 방식이었는데, Spring에서는 어떻게 값을 반환해줘야 할지 궁금했었다.

JSON으로 String 반환하기

@GetMapping("/response/json/string")
@ResponseBody
public String helloStringJson() {
    return "{\"name\":\"Robbie\",\"age\":95}";
}
  • Java는 JSON 타입을 지원하지 않기 때문에 JSON 형태의 String 타입으로 변환해서 사용해야 한다.

JSON으로 객체 반환하기

@GetMapping("/response/json/class")
@ResponseBody
public Star helloClassJson() {
    return new Star("Robbie", 95);
}
  • Spring에서 자동으로 Java의 객체를 JSON으로 변환해준다.

Jackson 라이브러리

Jackson은 JSON 데이터 구조를 처리해주는 라이브러리이다.

  • ObjectJSON 타입의 String으로 변환해줄 수 있다.
  • JSON 타입의 StringObject로 변환해줄 수 있다.

Object를 JSON 타입의 String으로 변환

    ObjectMapper objectMapper = new ObjectMapper();
    String json = objectMapper.writeValueAsString(Object);
  • objectMapper의 writeValueAsString 메서드를 사용하여 변환할 수 있다.
    • 파라미터에 JSON으로 변환시킬 Object의 객체를 주면된다.
  • ObjectJSON 타입의 String으로 변환하기 위해서는 해당 Object에 get 메서드가 필요하다.

JSON타입의 String을 Object로 변환

    ObjectMapper objectMapper = new ObjectMapper();
    Star star = objectMapper.readValue(json, Object.class);
  • objectMapper의 readValue 메서드를 사용하여 변환할 수 있다.
    • 첫 번째 파라미터는 JSON 타입의 String, 두 번째 파라미터에는 변환할 Object의 class 타입을 주면된다.
  • JSON 타입의 StringObject로 변환하기 위해서는 해당 Object에 기본 생성자get 혹은 set 메서드가 필요하다.

Client로부터 request받기

이것 또한 Spring을 배우면서 가장 궁금했던 부분이었다. 내부 동작은 기존의 Java와 많이 다르지 않을 것이라고 예상을 했지만, 가장 큰 차이점은 Java에서는 값을 Scanner를 통해 입력받는 방식이었는데, Spring에서는 어떻게 값을 입력받아야 할지 궁금했었다.

Path Variable

//[Request sample] GET http://localhost:8080/hello/request/star/kimtablenext/age/27
@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);
}
  • GET http://localhost:8080/hello/request/star/kimtablenext/age/27형식의 HTTP 요청이 오면,
    • @GetMapping("/star/{name}/age/{age}") 처럼 URL 경로에서 데이터를 받고자 하는 위치에 중괄호를 사용한다.
    • 그리고 @PathVariable String name, @PathVariable int age 처럼 메서드 파라미터에 @PathVariable 애너테이션과 함께 {name} 중괄호에 선언한 변수명과 변수타입을 선언하면 해당 경로의 데이터를 받아올 수 있다.

Request Param

//[Request sample] GET http://localhost:8080/hello/request/form/param?name=kimtablenext&age=27
@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);
}
  • GET http://localhost:8080/hello/request/form/param?name=kimtablenext&age=27 형식의 HTTP 요청이 오면,
    • param?name=kimtablenext&age=27 부분에서 name, age를 key로 사용하여 value에 선언된 kimtablenext, 27을 받아올 수 있다.
    • @RequestParam String name, @RequestParam int age 처럼
      @RequestParam 애너테이션과 함께 key 부분에 선언한 변수명과 변수타입을 선언하면 데이터를 받아올 수 있다.

form 태그 POST

<form method="POST" action="/hello/request/form/model">
  <div>
    이름: <input name="name" type="text">
  </div>
  <div>
    나이: <input name="age" type="text">
  </div>
  <button>전송</button>
</form>
  • HTML의 form 태그를 사용하여 POST 방식으로 HTTP 요청을 보낼 수 있다.
  • 이때 해당 데이터는 HTTP Body에 name=kimtablenext&age=27 형태로 담겨져서 서버로 전달된다.
@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);
}
  • 이러한 경우에는 @GetMapping 애너테이션만 @PostMapping 애너테이션으로 바꾸어주면 된다.

특징

  • @RequestParam은 생략이 가능하다.
  • @RequestParam(required = false)
    • 이렇게 required 옵션을 false로 설정하면 Client에서 전달받은 값들에서 해당 값이 포함되어있지 않아도 오류가 발생하지 않는다.
    • @PathVariable(required = false) 도 해당 옵션이 존재한다.
    • Client로 부터 값을 전달 받지 못한 해당 변수는 null로 초기화된다.

오늘의 회고

그동안 Spring을 배우면서 가장 궁금했던 부분이 드디어 해결되었다!
사실 이 부분 때문에 개인과제의 구조측면에서 감이 전혀 잡히지 않았었는데, 이제는 구조가 확실히 머리속에서 그려진다!
내일 바로 구현해봐야겠다.

profile
개발하는 기록자

0개의 댓글