예전에는 JSON 데이터 타입보다 x-www-form-urlencoded 데이터 타입을 주로 사용

📍 x-www-form-urlencoded

x-www-form-urlencoded 데이터 형식:
?userId=euiyeon0519&userName=박의연&title=의연&content=최고
이런식으로 데이터를 완전 풀어서 표현을 해 전송해야 하므로 한계가 있음❗

📂 PostController.java

  • x-www-form-urlencoded 형태의 데이터를 서버로 요청
  • @RequestParam을 사용
    @PostMapping("/posts")
     public String post(@RequestParam String title, @RequestParam String content){
//        System.out.println("title = " + title);
//        System.out.println("content = " + content);

        //  ✅ println()대신 Lombok의 @Slf4j를 사용
        log.info("title={}, content={]", title, content);
        return "Hello World";
    }

📂 PostControllerTest.java

    @Test
    @DisplayName("/posts로 POST 요청")
    void postTestURL() throws Exception {
        // expected
        mockMvc.perform(MockMvcRequestBuilders.post("/posts")
        				// application/x-www.form-urlencoded
                        .contentType(MediaType.APPLICATION_FORM_URLENCODED)       
                        .param("title", "글 제목입니다.")
                        .param("content", "글 내용입니다.")
                )
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().string("Hello World"))
                .andDo(MockMvcResultHandlers.print());
    }
}

📍 JSON

JSON 데이터 형식:

{
  "title": "제목",
  "content": "내용",
  "user": {
    "id": : "유저 아이디",
    "name": "유저 이름"
  }
}

그에 비해JSON은 위와 같이 표현 가능✅
특히 user의 경우, 새로운 객체를 만들면 되기 때문에
데이터를 온전하게 표현할 수 있다는 장점이 있고
클래스로 표현하기에도 용이함

📂 PostController.java

  • JSON형태의 요청 데이터를 PostCreate 라는 클래스 객체에 매핑해서 받음
    @PostMapping("/posts")
    public String post(@RequestBody PostCreate params){
        log.info("title={}, content={}", parmas.getTitle(), params.getContent());
        return "Hello World";
    }

📂 PostControllerTest.java

    @Test
    @DisplayName("/posts로 POST 요청")
    void postTestJSON() throws Exception {
        // expected
        PostCreate request = PostCreate.builder()
                .title("제목입니당")
                .content("내용입니당")
                .build();

        mockMvc.perform(MockMvcRequestBuilders.post("/euiyeonlog/posts")
                        .contentType(APPLICATION_JSON)
                        .content("{\"title\" : \"제목입니다\", \"content\" : \"내용입니다\"}")
                )
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andExpect(MockMvcResultMatchers.content().string("Hello World"))
                .andDo(MockMvcResultHandlers.print());
    }

📍 정리

@RequestParam

  • HTTP 요청의 파라미터값(쿼리 파라미터, 폼 데이터)를 바인딩할 때 사용
  • URL 쿼리 파라미터 또는 폼 데이터에서 값을 추출
  • 주로 GET 요청이나, x-wwww-form-urlencoded 타입의 POST 요청에 사용
  • @RequestParam은 JSON 데이터 처리에 적합하지 않음❌

@RequestBody

  • HTTP 요청의 본문(body) 데이터를 객체로 매핑할 때 사용
  • 요청 본문 데이터를 자바 객체로 매핑
  • 주로 POST, PUT, PATCH 요청에서 JSON, XML 데이터를 처리

ref

인프런 호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)

profile
"개발자는 해결사이자 발견자이다✨" - Michael C. Feathers

0개의 댓글