Spring

[스프링] Spring Controller 컨트롤러 Ajax 데이터통신 유형 정리

dev.mk 2022. 2. 28. 09:50
반응형

Ajax <> Controller 데이터 통신 방법 정리를 위해 작성한다. (매번 삽질)

 

@RequestParam 어노테이션을 활용하면, Request Header에 Parameter를 넣어서 전달
@RequestBody 어노테이션을 활용하면, Request Body에 Data를 넣어서 전달

Get method은 순수하게 데이터를 읽을 때 > SELECT
Post method는 데이터를 입력 > INSERT
Put method는 데이터를 수정 (UPDATE) or 삭제 (DELETE)
Delete method는 데이터를 삭제 (DELETE)


1. @RequestParam 로 값 받기

typeget  , dataType : text  , contentType: application/json; charset=UTF-8

- 데이터를 URL에 담에서 보낸다.

화면

$.ajax({ 
    type: "get"
    , url: "/get/hello2?id=100"
    , contentType:"application/json; charset=UTF-8" //charset=UTF-8 생략가능
    , dataType : "text"
    , success: function(data){
        console.log('통신결과');
        console.log(data);
    }
})

컨트롤러

//없는 파라미터를 던지면 400에러가 난다
@GetMapping("/get/hello2")
public String GetMapping (@RequestParam int id) {
    System.out.println(" get/hello2 호출 ");
    System.out.println(" id  : "+id); //결과 100
    return "Get Mapping DataType String";
}

 

- 컨틀로러에서 메소드의 리턴이 String이면 dataType옵션을 text로 해야한다. dataType을 json으로 하면 아무것도 받지 못한다.

- 없는 파라미터를 get로 보내면 400에러가 발생한다.  /get/hello2?name=100  ERROR 

- application/json; charset=UTF-8에서 charset=UTF-8 생략가능하다.

 

2. @RequestBody 안쓰고 Vo로 값 받기 (FormData type Vo)

type : post,  dataType : text,  contentType: application/x-www-form-urlencoded; charset=UTF-8

- 데이터를 body에 담아서 보낸다.

 

화면

$.ajax({ 
	type: "post"
	, url: "/post/insertBbs"
	, data: {"no" : "1", "id" : "devmk"}
	, contentType:"application/x-www-form-urlencoded; charset=UTF-8" //charset=UTF-8 생략가능
    //contentType 옵션 생략시 기본이 application/x-www-form-urlencoded; charset=UTF-8
	, dataType : "text"
	, success: function(data){
		console.log('통신결과');
		console.log(data);
	}
})

컨트롤러

@PostMapping("/post/insertBbs")
public String PostMappingTest (Vo vo) { //@RequestBody 삭제
    System.out.println("Vo : "+vo.toString());
    //출력결과 [no=1, id=devmk]
    return "Post Mapping DataType String";
}

 

- ajax 에서 폼데이터(FormData)를  vo로 보내려면 contentType생략하거나 contentType에 application/x-www-form-urlencoded; charset=UTF-8을 지정해야 한다.

- FormData를 보낼때 사용하며 FormData는 json이 아니기 때문에 @RequestBody를 삭제한다.

 

 

3. @RequestBody 쓰고 Vo로 값 받기 (Json Type Vo)

type : post,  dataType : text,  contentType: application/json; charset=UTF-8

화면

$.ajax({ 
	type: "post"
	, url: "/post/insertBbs"
	, data: JSON.stringify({"no" : "1", "id" : "devmk"})
	, contentType:"application/json"
	, dataType : "text"
	, success: function(data){
		console.log('통신결과');
		console.log(data);
	}

})

컨트롤러

@PostMapping("/post/insertBbs")
public String PostMappingTest (@RequestBody Vo vo) { //@RequestBody추가
    System.out.println("Vo : "+vo.toString());
    //출력결과 [no=1, id=devmk]
    return "Post Mapping DataType String";
}

 

- 컨트롤러에서 json형태의 vo를 받으려면 json 문자열 형식으로 변환해서 보내야 하기 때문에 JSON.stringify를 사용한다. (JSON.stringify는 자바스크립트 객체를 JSON 문자열로 변환) json 형태의 Vo를 받기위함.

- @RequestBody란 ? HTTP Body안에 JSON을 VO에 맵핑하는 스프링 어노테이션이다. Body를 자바 객체로 받는다.

 

4. @RequestParam Map으로 값 받기

type : post,  dataType : text,  contentType: 생략

- 데이터를 body에 담아서 보낸다.

 

화면

$.ajax({ 
	type: "post"
	, url: "/post/insertBbs"
	, data: {"no" : 1, "id" : "devmk"}
	, dataType : "text"
	, success: function(data){
		console.log('통신결과');
		console.log(data);
	}

})

컨트롤러

@PostMapping("/post/insertBbs")
public String PostMappingTest (@RequestParam Map<String, Object> vo) {
    System.out.println("Vo : "+vo.toString()); 
    //출력결과 [no=1, id=devmk]
    return "Post Mapping DataType String";
}

- contentType 을 생략하면 default값이 application/x-www-form-urlencoded; charset=UTF-8로 적용된다.

-  ajax에서 보낸 데이터를 컨트롤러에서 @RequestParam 어노테이션을 이용하여 Map으로 받을 수 있다.

 

 

PutMapping, DeleteMapping은 PostMapping과 다르게 @RequestBody형태로 받아야 하며

ajax에서는 json형태로 보내야한다.

//Controller 받는부분
@PutMapping("/update")
@ResponseBody
public ApiResultVo<Integer> update(@RequestBody Vo vo) throws Exception {

//javascript
$.ajax({'type': 'put', contentType:"application/json", 'data' : JSON.stringify({'key1' : 'value1', 'key2' : 'value2'}), 'url': '/update'})

//Controller 받는부분
@DeleteMapping("/delete")
@ResponseBody
public ApiResultVo<Integer> delete(@RequestBody Vo vo) throws Exception {

//javascript
$.ajax({'type': delete, contentType:"application/json", 'data' : JSON.stringify({'key1' : 'value1', 'key2' : 'value2'}), 'url': '/delete'})

 

반응형