본문 바로가기
Spring공부/1-REST

@DeleteMapping 값 넘기기 / delete 값 보내기 / Rest API delete 값 / Rest api delete 파라미터 / Rest api delete 헤더 / Rest api delete 사용하는 방법 / @DeleteMapping 해더 / @DeleteMapping 파라미터 / @DeleteMapping body

by 으노으뇨 2022. 12. 11.
728x90
반응형
SMALL

REST API Method 중 Get / Post에 대해서는 일반적인 프로젝트에서 많이 사용한다. 그런데 delete 관련되어서 정보가 많이 없다. REST API 에 대해 엄격하게 사용하려한다면 참고될 만한 포스팅

@DeleteMapping 

서버단으로 값을 넘기는 3가지 방법
  • Paramiter (파라미터) 로 넘기기
  • PathVariable (패쓰배리어블) 로 넘기기
  • 헤더에 정보를 담아 보내기

각 방법에 대한 설명 (파라미터 - > 패쓰배리어블 -> 헤더 순으로 진행)

테스트 환경

내가 보낼 데이터 
var inData = { name : 'kimeunho' };

 

나의 개인정보를 보낼 것이다. 최소 이름정도로 하자. 내 이름 또는 이에 준하는 ID라던가 Primary - Key값 정도되는 정보가 되어야한다. 하다못해 게시판 삭제의 경우 게시판 번호를 넘긴다.

각 방법에 대해 각각 통신하는 버튼을 만들었으며 해당 버튼을 누르면 AJAX통신을 통해 서버에 값을 전달한다. 
페이지 사진 
각 버튼을 눌러서 각 방법으로 통신한다.

JSP 소스 

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<script src="https://code.jquery.com/jquery-3.1.0.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>DELETE TEST 페이지 입니다.</title>
</head>
<body>
	<input type="button" id="deleteHeader" value="send data in Header">
	<input type="button" id="deletePathVal" value="send data in Path">
	<input type="button" id="deleteBody" value="send data in Body">
	<input type="button" id="deleteParam" value="send data in Param">
	<script type="text/javascript" src="/resources/js/test/APITest.js"></script>
</body>
</html>

 

J쿼리를 사용하기 위해서 임포를 한것 외에는 버튼 생성과 JavaScript 연동 소스밖에없다.

::  조건  ::
1. $Ajax 를 사용할 것
2. 다른 설정파일을 따로 건드리지 말 것 ( 오리지날하게 간다는 뜻) 

1. 파라미터로 보내기

Paramiter로 보내기 ( 자주 사용함)
보낼값을 파라미터에 담아서 보내는 방법이다. Url에 그대로 노출될 수 있으며 사람들이 자주 사용한다.
우선 설계하기 가장 간단해서 많이 사용하는 것 같다.

AJAX 소스

function _deleteAjaxParam()
{
	let paramData = new URLSearchParams(inData).toString();
	$.ajax({
  		type: "delete"
  		, url: "param?" + paramData
  		, success: function(){}
	});  
}​

서버 소스 

	@DeleteMapping(value = "/param")
	public String deleteParam(@RequestParam Map<String, String> param)
	{
		return null;
	}

실행 

inData를 쿼리스트롱으로 만들기 위해 사용한 함수의 결과
@RequestParam 으로 받아온 값에 Map 형식으로 받아온 모습

설명 : inData를 쿼리스트링으로 한번 변환한다. 그리고 파라미터로 넘긴다. 그리고 서버쪽에서 받을 때는 Map<String, String> 형태로 받는다.

번외 : 만약 조금 복잡한 데이터 형식을 보낼땐 

var inData = { 
	name : 'kimeunho' 
	, TestVO : {
		age : '29'
		, gender : 'male'
	}
};

 이렇게 보내면

이런 결과를 얻을 수 있다. 

2. PathVariable 

PathVariable 로 값을 보내는 방법 ( 이 방법도 많이 사용하긴하던데;; )
Url에 값을 그대로 보내는 방법은 파라미터와 결이 같다. 
그러나 조금 동적으로 처리 가능하다는 점이있다.

AJAX소스
function _deleteAjaxPath()
{
	$.ajax({
  		type: "delete"
  		, url: "delete/kimeunho"
  		, success: function(){}
	});  
}

서버소스 

	@DeleteMapping(value = "/delete/{path}")
	public String deletePath(@PathVariable(value = "path") String path)
	{
		return null;
	}

실행 화면

@PathVariable 에 path값으로 kimeunho 가 들어온 모습

설명 : 우선 Url 에 그대로 값을 보내는 것에 동일하다. 예를들어 시퀀스가 232인 게시판을 삭제하려고 서버에 요청 할때 /delete/232 이렇게 넘겨서 삭제하는 방법으로 많이 사용한다. 물론 겟방식이 아니라 Url에 그대로 
/delete/kimeunho 이렇게 친다고 서버로 값이 들어가는 것은 아니다.

Url에 그대로 쳐서 나온 결과

3. Header에 값을 넣어서 보내기

Header에 값을 넣어서 보내기
다른 방법과 다르게 Url 에 노출을 최소화 하기 위해서 이용한다. 물론 보안에서 훨씬 좋느냐? 그것도 아니다. 어짜피 개발자 모드에서 헤더 뜯어내고 그러면 다 나온다. 그래도 노출을 최소화하기 위함이다. 

AJAX 소스
function _deleteAjaxHeader()
{
	$.ajax({
  		type: "delete"
  		, url: "header"
  		, headers  :  {'name': 'kimeunho'}
  		, success: function(){}
	});  
}

서버 소스

	@DeleteMapping(value = "/header")
	public String deleteHeader(@RequestHeader Map<String, String> header)
	{
		return null;
	}

실행 화면

헤더의 모든 값이 들어온 모습
그 중 AJAX에서 입력한 headers에 내가 입력한 값이 들어간 모습

설명 : AJAX 통신할때 headers 옵션에 값을 넣어주었다. 그리고 서버단에서 해당 name을 이용해서 사용할 수 있다. 이렇게 번번히 찾아서 사용하는 방법외에도 간단하게 원하는 값 하나만 가지고 오거나 하는 방법이 있다. 하단 응용 참고

:: 응용
1. 원하는 값 하나만 헤더에 담아오기 
너무많은 헤더가져오기 부담스럽고 귀찮다면 아래의 소스를 사용하자

	@DeleteMapping(value = "/header")
	public String deleteHeader(@RequestHeader("name") String name)
	{
		return null;
	}

@RequestHeader(원하는값) 을 넣으면 name에 값이 들어온다.

이름값만 들어온 모습

2. 복잡한 오브젝트 형식도 가져올 수 있을까?

var inData = { 
	name : 'kimeunho' 
	, TestVO : {
		age : '29'
		, gender : 'male'
	}
};

이런형태의 데이터 형태를 가져 올 수 있을까?

뭔가 들어오는데 오브젝트 형태로 들어온다.

 

4. RequestBody는 안될까?

가능은 하나. Delete 명세를 벗어 나는 형태입니다.

A payload within a DELETE request message has no defined semantics; sending a payload body on a DELETE request might cause some existing implementations to reject the request.

가능은 하나 그럼 스프링설정을 변경해주어야 합니다.

그렇게 변경해서 꼭 사용하고 싶다면 차라리 헤더에서 담아서 보내주는게 훨씬 좋을 것같습니다.

설정 파일을 변경하고 소스리뷰에 

??? : 아무튼 변경했음 Delete 메소드에 Body쓰고싶으면 나중에 너희들도 쓰셈

이렇게 하는 것 보다 헤더에 값을 보내거나 PathVariable로 좀더 공인된 방법으로 사용하는 것을 저는 좋아합니다.

그리고 헤더에 사용할땐 꼭 괄호을 열어서 필요한 데이터만 뽑아서 쓰는것을 권장합니다.

728x90
반응형
LIST

'Spring공부 > 1-REST' 카테고리의 다른 글

pull-request  (0) 2021.10.11
REST방식(9)-댓글페이징처리  (0) 2021.10.11
REST방식(8)-댓글페이징처리  (0) 2021.10.11
REST방식(9)-이벤트처리  (0) 2021.10.08
REST방식(8)-Ajax  (0) 2021.10.08