요청 매핑
요청이 왔을 때 어떤 컨트롤러를 호출해야 하는지를 매핑하는 것.
단순 URL로 매핑하는 것 뿐만 아니라 여러 요소를 조합해 매핑할 수 있다.
URL 매핑
- @RequestMapping(“/hello-basic”)
- URL 호출이 오면 이 메서드가 실행되도록 매핑한다.
- 대부분의 속성을 배열로 제공하므로 다중 설정이 가능하다.
- ex) [“/hello-basic”, “/hello-go”]
HTTP 메서드 매핑
1
@RequestMapping(value = "/mapping-get-v1", method = RequestMethod.GET)
으로 하면 GET만 정상 작동한다.
만약 POST 요청을 보내면 스프링 MVC는 HTTP 405(Method Not Allowed)를 반환한다.
물론 이 @GetMapping과 같은 축약 애노테이션을 사용하는 것이 더 직관적이다.
PathVariable(경로 변수) 사용
많이 사용되는 형태이다.
변수명이 같다면 @PathVariable String userId 로 생략해 사용 가능하다.
최근 HTTP API는 리소스 경로에 식별자를 넣는 스타일을 선호한다.
- /mapping/userA
- /users/1
PathVariable 다중 사용
userA의 주문번호 100 이런식으로 사용한다.
특정 파라미터 조건 매핑
?mode=debug 가 있어야지만 매핑이 된다.
PathVariable이 많이 사용되고, 얘는 잘 사용하지는 않는다.
특정 헤더 조건 매핑
URL은 /mapping-header 이고,
URL에서 파라미터를 가져오는 것이 아닌 헤더에 mode : debug 가 있으면 매핑이 된다.
미디어 타입 조건 매핑
미디어 타입을 이용해 매핑한다.
Content-Type, consume
consume은 컨트롤러 입장에서 보면 content-type을 소비한다고 볼 수 있기 때문에 이렇게 표현한다고 보아도 된다.
위의 코드만 보면 json 타입의 데이터가 오면 응답한다.
만약 요청의 Content-Type이 맞지 않으면 HTTP 415 (Unsupported Media Type)을 반환한다.
Accept, produce
HTTP 요청의 Accept 헤더를 기반해 미디어 타입으로 매핑한다.
만약 맞지 않으면 HTTP 406 (Not Acceptable)을 반환한다.
API 예시
회원 관리를 HTTP API로 만든다고 생각하고 매핑을 어떻게 하는지 알아본다.
- 회원 목록 조회: GET ‘/users’
- 회원 등록: POST ‘/users’
- 회원 조회: GET ‘/users/[userID]’
- 회원 수정: PATCH ‘/users/[userID]’
- 회원 삭제: DELETE ‘/users/[userID]’
실제로 데이터가 오가는 부분은 없이 매핑만 한 예시이다.
컨트롤러를 리팩터링하려면 위에 클래스 단위로 @RequestMapping(“/mapping/users”)를 해주어 중복되는 부분을 제거하는 방법이 있다.