무작정 개발.Vlog

[Spring] @RequestMapping 옵션

by 무작정 개발
반응형

이번 글에서는 @RequestMapping 어노테이션의 옵션들에 대해 정리할 것입니다.

 

국비 과정을 들으며, 기존에 알고 있던 @RequestMapping 옵션들과 다른 옵션들이 존재하는 것을 알게 되어 기존에 알고 있던 것들과 새로운 것들을 다시 정리하는 시간을 가지게 되었습니다.

  • @RequestMapping 어노테이션에 대한 자세한 글은 하단에 있는 이전 글 참고

[Spring] @RequestMapping이란 그리고 동작 방식

 

[Spring] @RequestMapping이란 그리고 동작 방식

이번 글에서는 Spring 개발 시 자주 사용하는 @RequestMapping의 개념 및 동작 방식에 대해 정리할 것입니다. [목차] 1. @RequestMapping이란? 2. @RequestMapping 작성 예시 3. @RequestMapping 동작 방식 1. @RequestMapping

backendcode.tistory.com


1. @RequestMapping이 받는 옵션

 

이제 @RequestMapping이 받는 옵션들에 대해 알아볼 것입니다.

RequestMapping은 기본적으로 같은 URL과 모든 옵션이 같을 수 없습니다. 이렇게 지정하는 옵션은 Handler(핸들러)에서 매핑하는 기준이 됩니다.

value, method, params, headers, consumes, produces 중에서 1개라도 달라야지 올바르게 Handler가 매핑을 해줄 수 있습니다.

 

[ RequestMapping 옵션 종류 ]

이름 타입 설명
value String [] URL 값으로 매 핑 조건 부여(default)
method RequestMethod [] HTTP  Request 메서드 값을 매핑 조 건으로 부여
사용 가능한 메서드는 GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE
params String [] HTTP Request 파라미터를 매핑 조건으로 부여
consumes String [] 설정과 Content-Type Request 헤더가 일치할 경우에만 URL이 호출됨
produces String [] 설정과 Accept Request 헤더가 일치할 경우에만 URL이 호출됨

지금부터 @RequestMapping 옵션들에 대해 하나씩 정리할 것입니다.

 

반응형

(1) value

value는 연결한 URL를 뜻합니다.

보통 호스트 주소와 포트 번호를 제외하고 Api 설계 규약에 따라 이름을 짓고, 다음과 같이 설정할 수 있습니다.

  • 다른 옵션들을 제외하고, value 옵션만 주어질 경우 " value = " 부분을 생략할 수 있습니다.
@RequestMapping(value = "/value/sample")

// -> value만 있을 경우 "value = " 생략 가능
@RequestMapping("/value/sample")

 

추가적으로 아래와 같이 다중 요청도 가능하며 셋 중 어느 URL를 거쳐도 다 연결이 가능합니다.

  • 대신 "  {    }   " 형식으로 감싸줘야 합니다.
@RequestMapping({"/api", "/api/two", "api/three"})

 

두 번째로, [ Ant Pattern ]을 적용한 URL Mapping도 가능합니다.

예시를 들자면, 아래와 같이 Mapping(매핑)하면 "/api/test1", "/api/test2", "/api/test3" 전부 연결이 가능합니다.

@RequestMapping(value = "/api/**")

 

세 번째로,  { } 사이에 변수를 넣어서 URL을 매핑하는 것도 가능합니다.

이러한 매핑 방법인 경우 method 인자로 @PathVariable을 id로 받아야 합니다.

@RequestMapping(value = "/api/{id}")

(2) method

RequestMethod의 경우에, GET, POST, PUT, DELETE, HEAD, OPTIONS, TRACE 등 8가지가 있습니다.

보통의 경우 @RequestMapping 어노테이션에 아래와 같이 method를 작성할 수 있습니다.

 

// GET 방식일 경우
@RequestMapping(value = "/api", method = RequestMethod.GET)

 

덧붙이자면 이전 글에서도 작성하였지만  GET, POST, PUT, PATCH, DELETE 등 method에 대해 각각에 맞는 method 옵션이 적용된

( @GetMapping, PostMapping, DeleteMapping 등)의 어노테이션이 Spring 4.3 버전부터 추가되어 존재하고, @RequestMapping 하위에 써서 코드를 좀 더 간결하게 작성 가능합니다.

 

@RestController
@RequestMapping("/api")
public class MainController {

// -> Local 환경에서 실행한다면 -> localhost:8080
	....
    
    // -> localhost:8080/api/created
    @PostMapping("/created")
    public String created() {
    	....
    }
    // -> localhost:8080/api/read
    @GetMapping("/read")
    public String read() {
    	....
    }

}

 

추가적으로 @RequestMapping은 Class, Method에 붙일 수 있지만, @GetMapping, @PostMapping 등은 Method에만 붙일 수 있습니다.


(3) params

params는 Api URL을  [ "/api?id=1&password=1234" ]와 같이 전달할 때 사용합니다.

params에 전달한 것과 일치하는 param이 붙으면 이 Method로 매핑해줍니다.

 

@RequestMapping(value = "/api/getList", method = RequestMethod.GET, params = {"id", "password"})
public String getList(@RequestParam("id") String paramId, 
							@RequestParam("password") String password {
	...
}

(4) consumes

consumesrequest(요청)의 content-type request header가 일치하는 것을 찾는 옵션입니다.

요청에 들어오는 인자 값이 무엇인지에 따라서 같은 URL, Method 임에도 구분이 가능합니다.

But, @RequestBody와 @ModelAttribute의 경우 HttpMessageConverter에서 객체로 변환하는 과정을 거치며 기본 값으로

[ application/json ] 이 지정되어 있기 때문에 특정 옵션을 줄 수 없습니다.

  • consumes는 필수 옵션이 아니라 굳이 지정해주지 않아도 됨
  • @RequestBody / @ModelAttribute인 경우 -> [ application/json ] 이 기본 값(디폴트 값)으로 전달
  • @RequestParam / @PathVariable인 경우 -> [ text/plan ] 이 기본 값으로 전달
@PostMapping(value = "/api/list/{name}", consumes = MediaType.TEXT_PLAIN_VALUE)
public String getList(@PathVariable String name) {
	....
}

 


(5) produces

produces는 response(응답)의 accept-request header 가 특정 옵션으로 반환될 것을 지정하는 옵션입니다.

응답(response)이 무엇인지 미리 예측하는 것은 불가능하기에 같은 URL로 요청(request)이 들어왔을 때 produces 옵션으로 구분해서 실행하는 것은 불가능합니다.

 

그리고 @RestController에서 ResponseEntity를 반환하는 경우에는 기본으로 [ application/json ]으로 값이 지정되어 있기에 특정 옵션을 설정할 수 없습니다.

  • produces는 필수 옵션이 아니므로 따로 지정해주지 않아도 [ application/json ]으로 기본 값이 전달되거나 와일드카드로 값이 전달됩니다.
  • 아래와 같이 produces를 사용할 수 있습니다.
@GetMapping(value = "/api/getList", produces = MediaType.TEXT_PLAN_VALUE)
public String getList() {
	return "getList";
}

Reference

 

@RequestMapping의 produces, Content-Type, Consumes란?

 

@RequestMapping의 produces,Content-Type,Consumes란?

| @RequestMapping의 produces 속성을 이용하여 Response의 Content-Type을 제어할 수 있다. @Consumes : 수신 하고자하는 데이터 포맷을 정의한다. @Produces : 출력하고자 하는 데이터 포맷을 정의한다. 1.요청헤더

2ham-s.tistory.com

 

반응형

블로그의 정보

무작정 개발

무작정 개발

활동하기