2023.08.26 - Spring 입문 (1주차) -1

mjjin·2023년 8월 26일
0

데이터를 Client에 반환하는 방법


JSON 데이터 반환하는 방법

  • 템플릿 엔진이 적용된 SpringBoot에서는 Controller에서 문자열을 반환시, templates 폴더에서
    해당 문자열의 .html 파일을 찾아 반환한다.
  • html 파일이 아닌 JSON 데이터를 브라우저에 반환시에는 해당 메서드에 @ResponseBody 애너테이션을 추가한다.

반환값이 String 일 경우

@GetMapping("/response/json/string")
@ResponseBody
public String helloStringJson() {
    return "{\"name\":\"Robbie\",\"age\":95}";
}

Java는 JSON 타입을 지원하지 않기 때문에, JSON 형태의 String 타입으로 변환해야 한다.

반환값이 String 외 자바 클래스일 경우

@GetMapping("/response/json/class")
@ResponseBody
public Star helloClassJson() {
    return new Star("Robbie", 95);
}

스프링은 내부적으로 자동으로 자바의 객체를 Json 타입으로 바꾸며
이 때, Key는 필드 이름으로 설정된다.

@RestController를 사용시 해당 클래스의 모든 메서드에 @ResponseBody 애너테이션이 추가된다.

Jackson

JSON 데이터 구조를 처리해주는 라이브러리이다.
ObjectJSON 타입의 String으로 변환해 줄 수 있으며, 역으로도 변환이 가능하다.
직접 JSON 데이터 처리시, Jackson 라이브러리의 ObjectMapper를 사용하면 된다.

Object To JSON

@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);
}
  • objectMapper의 writeValueAsString 메서드를 사용하여 변환 할 수 있다.
    파라미터에 JSON으로 변환시킬 Object의 객체를 주면 된다.

  • Object를 JSON 타입의 String으로 변환하기 위해서는 해당 Object에 get Method가 필요하다.

JSON To Object

@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());
}
  • objectMapper의 readValue 메서드를 사용하여 변환할 수 있다
    첫 번째 파라미터는 JSON타입의 String, 두 번째 파라미터에는 변환할 Object의 class 타입을 넣는다.
  • JSON 타입의 String을 Object로 변환하기 위해서는 해당 Object에 기본 생성자, get or set 메서드가 필요하다.

Path Variable과 Request Param

Path Variable

// [Request sample]
// 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);
}

서버에 보내려는 데이터를 URL 경로에 추가할 수 있다.

  • 데이터를 받기 위해서는 /star/{name}/age/{age} 이처럼 URL 경로에서 데이터를 받고자 하는 위치의 경로에
    {data} 중괄호를 사용한다.
  • (@PathVariable String name, @PathVariable int age) 그리고 해당 요청 메서드 파라미터에
    @PathVariable 애너테이션과 함께 {name} 중괄호에 선언한 변수명과 변수 타입을 선언하면 해당 경로의 데이터를 받아온다.

Request Param

// [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);
}
  • 데이터를 받기 위해서는 ?name=Robbie&age=95에서 key 부분에 선언한 name과 age를 사용하여
    value에 선언된 Robbie,95 데이터를 받아올 수 있다.
  • (@RequestParam String name, @RequestParam int age) 해당 요청 메서드 파라미터에
    @RequestParam 애너테이션과 함께 key 부분에 선언한 변수명과 변수타입을 선언하면 데이터를 받아올 수 있다.

form 태그 POST

// http://localhost:8080/hello/request/form/param

// HTML
<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>
// [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);
}
  • @RequestParam(required = false) required 옵션을 false로 설정하면 Client에서 전달받은 값들에서
    해당하는 값이 포함되지 않아도 오류가 발생하지 않는다.
    • @PathVariable도 해당 옵션이 존재한다.
    • Client로 부터 값을 전달받지 못한 해당 변수는 null로 초기화된다.
    // [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);
    }
}

0개의 댓글