Spring

Spring Boot 🌼 - HTTP 요청 처리 Annotation

doridam 2023. 6. 14. 11:48


HTTP 요청 처리 Annotation

Spring은 URL로 들어온 요청을 Mapping된 URL을 찾아 처리한다. 이때 URL을 Mapping 하는 Annotation이 @RequestMapping과 그로부터 파생된 @Get, @Post, @Put, @Update,.. Mapping이다.
기존 형태는 @RequestMapping(value = "test", method= RequestMethod.GET) 의 형태를 가지고 있었지만 Spring 4.3버전부터 Method Mapping을 사용할 수 있게 되며 코드 가독성이 높아졌다.

@RequestMapping

@RequestMapping의 경우 HTTP 요청과 컨트롤러의 메소드를 Mapping 하기위해 사용된다. 다양한 속성을 가지고 있으며 HTTP 메서드, 경로, 요청 헤더, 요청 매개변수 등을 기반으로 요청을 Mapping 할 수 있다.

@RequestMapping의 여러가지 사용법

@RequestMapping의 경우 Class와 Method에 적용할 수 있다. value를 사용해 url을 지정할 수 있고, method를 사용해 적용될 method를 지정할 수 있다.

기본적인 Mapping 방법

@RequestMapping(value = "/test",method = RequestMethod.GET)
public String testView(){
	return "test";
}

메소드에 value와 method를 사용한 URL Mapping이다. GET 방식으로 작동되며, "/test" URL로 접근시 작동된다. 뿐만 아니라 다른 Method도 적용이 가능한데, POST, PUT, PATCH, DELETE 등 주로 사용되는 5가지의 Method가 있다.

Class에 URL을 지정하여 메소드에 공통 URL path 설정

@Controller
@RequestMapping("/page")
public class Test{
	@RequestMapping(value = "/test", method = RequestMethod.GET)
    public String a(){
    	return "test";
    }
}

클래스에 적용하여 URL path를 지정하고, 하위 메소드에는 "/test" URL을 Mapping하여 "/page/a" 에대한 URL경로를 적용하였다. 이렇듯 클래스 또는 메소드에 적용위치에 따라 적용이 다르게 된다.

여러개의 URL을 하나의 메소드에 Mapping

@RequestMapping({"test1","test2"})
public String test(){
	return "test";
}

value에 {}와 같은 배열선언을 통해 여러개의 URL을 하나의 메소드에 Mapping 할 수도 있다.

경로 변수 사용

@RequestMapping("/test/{id}")
public String test(
	@PathVariable String id
	){
	return "test";
			}

@PathVariable을 사용한 URL 경로 변수 사용도 가능하다.

파라미터 조건 Mapping

@RequestMapping(value = "/test", method = RequestMethod.GET, params = "test=true")
@ResponseBody
public String test() {
    return "test";
}


파라미터 조건값이 비어있는 경우 400에러가 발생하지만


파라미터가 있는 정상 조건에서는 잘 작동된다.

헤더 조건 Mapping

@RequestMapping(value = "/test", method = RequestMethod.GET, headers = "test=true")
@ResponseBody
public String test() {
    return "test";
}


헤더의 값이 없을경우 404에러가 발생하지만


test = true 가 있을경우 값을 반환한다.

미디어타입에 따른 조건 Mapping

@GetMapping(value = "/test", consumes = "application/json")
@ResponseBody
public String test() {
    return "test";
}


미디어 타입이 Mapping 조건의 미디어타입과 달리 415에러가 발생한다.


동일할 경우 정상 작동한다.


@MethodMapping

Method Mapping의 경우 Spring 3.4버전부터 추가된 Mapping 어노테이션이다. 기존 @RequestMapping의 method 부분만을 사용하여 "@GetMapping" 이와 같은 형태로 작성한다. RequestMapping과 다른점은 클래스에 적용이 불가능하다. 종류는 많지만 실제로 작동하는 방식은 GetMapping을 제외하고는 모두 동일하다. 하지만 RestAPI를 만들기위해선 적절하게 기능에 맞는 Mapping을 사용해야한다.

@GetMapping

@GetMapping("/test")
public User test(){
  return "test";
}

가장 기본적인 Mapping인 GetMapping이다. 통상적으로 URL 이동을 위해 사용한다. 데이터 전송시 URL을 이용한 파라미터로 전송하기 때문에 보안이 취약하다. 리소스의 조회를 위해 사용한다.

@PostMapping

@PostMapping("/test")
public User test(){
  return "test";
}

PostMapping, Server의 리소스를 생성하고자 할때 사용한다. 흔히 로그인, 회원가입, form을 이용한 게시글 작성 등에 사용되며, 데이터가 Header의 본문을 통해 전송되기 때문에 Get방식에 비해 상대적으로 보안이 강하다는 부분이 있다.

@PutMapping

@PutMapping("/test")
public User test(){
  return "test";
}

PutMapping, Server의 리소스를 수정하고자 할때 사용한다. 데이터 전송방식은 Post와 동일하게 Header의 본문을 통해 전달된다.

@PatchMapping

@PatchMapping("/test")
public User test(){
  return "test";
}

PatchMapping, Server의 리소스 일부를 수정하고자 할때 사용한다. Put과 다른점은 일부 수정한다는것에 있다. 데이터 전송방식은 Post와 동일하게 Header의 본문을 통해 전달된다.

@DeleteMapping

@DeleteMapping("/test")
public User test(){
  return "test";
}

DeleteMapping, 이름 그대로 Server의 리소스를 삭제할때 사용된다. 데이터 전송 역시 Post와 마찬가지고 Header의 본문을 통해 전송된다.


브라우저에서는 Get, Post의 요청만 보낼 수 있다.

브라우저에서 요청을 보내는 방식은 기본적으로 Get, Post 방식으로 적용된다. 만약 다른 Put, Patch, Delete 의 method를 사용하려면 다른 방법이 필요하다.

1. input-hidden 을 이용한 방법

 <form action="/test" method="POST">
    <input type="hidden" name="_method" value="PUT">
    <button type="submit">전송</button>
</form>

form 태그는 POST로 지정하고 내부 input type hidden 태그를 생성 후 name을 "_method" 로 지정, value="PUT"으로 하면 Server에서 해당 값을 읽고 PUTMapping으로 처리한다.

2. ajax를 사용한 방법

<script>function testPutRequest(){
       var xhr = new XMLHttpRequest();
       xhr.open('PUT', '/test', true);
       xhr.send();
   }
</script>

ajax를 사용하여 method 방식을 지정하고 해당 요청을 보내면 method에 맞게 처리된다.