본문 바로가기
Back-end/Spring MVC 개념

13. Annotation 기반의 URL 매핑

by devraphy 2022. 3. 10.

0. 개요

- 이전 포스팅에서 Front Controller의 동작을 Annotation을 이용하여 적용하는 방법에 대해서 알아보았다.

- 이번 포스팅에서는 Spring Boot가 지원하는 다양한 URL 매핑 방식 및 annotation에 대해서 알아보자.


 1. URL 매핑 형식 지원

- 백엔드에서 URL을 매핑하는 작업은 굉장히 중요한 작업이다.

- 매핑 URL에 오타가 있다면 완전히 다른 주소가 되기 때문이다.

@RequestMapping("/springmvc/view")
@ReqeustMapping("/springmvc/view/")

- 사실 "/springmvc/view"와 "/springmvc/view/"는 엄연히 다른 URL이다. 

- 그러나 Spring Boot에서는 위의 예시에 나온 URL을 동일한 주소로 처리해준다.


2. @PathVariable

- 최근 사용되는 URL 매핑 방식이다.

- Spring Boot에서 지원하는 기능으로 URL 자체에 변수를 할당하여 사용하는 방식이다.

 

- @PathVariable을 사용하면 URL parameter를 꺼내서 사용할 수 있다.

- URL parameter를 편리하게 사용할 수 있으며, URL을 깔끔하게 작성 및 매핑할 수 있다.

// @PathVariable의 이름과 이를 받아오는 변수명이 동일하면 생략이 가능하다.

    @GetMapping("/mapping/{userId}")
    public String mappingPath(@PathVariable String userId) {
        log.info("mappingPath userId = {}", userId);
        return "PathVariable";
    }

    // 다중 PathVariable 선언
    @GetMapping("/mapping/users/{userId}/orders/{orderId}")
    public String mappingPath(
        @PathVariable String userId, 
        @PathVariable Long orderId) 
    {
        log.info("mappingPath userId={}, orderId={}", userId, orderId);
        return "multi-pathVariable";
    }

 

- @PathVariable의 이름과 이를 받아오는 변수명이 동일하다면 생략할 수 있다.

@PathVariable("userId") String data ==> @PathVariable String userId

3.  URL parameter를 이용한 조건 매핑 

- @PathVariable의 사용으로, 요즘은 잘 사용하지 않는 방식이다.

 

- URL에 특정 parameter를 설정하여, URL을 요청할 때 반드시 특정 parameter와

   parameter의 값이 유효한 경우에만 요청을 허락하는 URL 매핑 방식이다. 

 

- @RequestMapping 또는 축약형(@GetMapping, @PostMapping, etc)에서 사용할 수 있다.

- params라는 옵션으로 특정 URL parameter를 설정할 수 있다.

@GetMapping(value = "/mapping-param", params = "mode=debug")
    public String mappingParam() {
    }

- 위의 예시의 경우, URL이 반드시 "mapping-param?mode=debug"의 형태로 들어와야 한다.

- 만약 특정 parameter와 그 값을 만족하지 않는 경우, 상태 코드 400(bad request)을 Client에게 반환한다. 


4. Header 값을 이용한 조건 매핑

- URL parameter를 이용하여 URL 매핑에 조건을 부여한 것과 같은 방식으로 Header 값을 사용할 수 있다.

- Header 값을 이용하여 조건을 설정하는 방법은 header 옵션을 이용한다.

- 동일하게 @RequestMapping 또는 축약형(@GetMapping, @PostMapping, etc)에서 사용할 수 있다.

@GetMapping(value = "/mapping-header", headers = "mode=debug")
public String mappingHeader() {
   log.info("mappingHeader");
   return "ok";
}

5. Content Type을 이용한 조건 매핑(Server)

- Client로부터 전달받는 데이터의 미디어 타입(MIME Type)을 이용한 조건 매핑 방식이다.

- Header에 포함된 미디어 타입을 이용한 방식으로, consume 옵션을 사용한다.

 

- 옵션의 이름이 consume인 이유는, Client가 전달한 데이터를 Server에서 사용/소비하기 때문이다.

- consume 옵션을 사용하여 Server가 받을 수 있는 데이터 타입의 제약을 설정할 수 있다.

- 특정 데이터 타입 외의 데이터를 포함한 요청은 거절되기 때문이다.

@PostMapping(value = "/mapping-consume", consumes = "application/json")
public String mappingConsumes() {
   return "ok";
}

6. Content Type을 이용한 조건 매핑(Client)

- Client가 받을 수 있는 데이터 타입의 제약을 설정하는 매핑 방식이다.

- Server가 Client에게 전달하는 HTTP response에 담긴 데이터 타입을 설정하는 것이다.

 

- Client가 요청을 보낼 때, header의 accept 속성을 설정한다.

- accept 속성에는 Client가 소화할 수 있는 미디어 타입이 value로 명시된다.

 

- 매핑 옵션으로 produce를 사용한다.

- 옵션의 이름이 produce인 이유는, Server가 보낸 데이터를 이용하여 Client는 웹 페이지를 생성하기 때문이다. 

@PostMapping(value = "/mapping-produce", produces = "text/html")
public String mappingProduces() {
   return "ok";
}

7. HTTP 요청 메서드에 따른 매핑

- 동일한 URL에 대해서 HTTP 요청 메서드에 따라 다른 처리를 수행하도록 설정할 수 있다.

- 다음 예시를 보면 이해가 쉬울 것이다.

@GetMapping("/users")
public String searchUser() {} // 회원 목록 조회 기능

@PostMapping("/users")
public String saveUser() {} // 회원 등록 기능
@GetMapping("/users/{userId}")
public String searchUser() {} // 특정 회원 검색 기능

@PatchMapping("/users/{userId}")
public String updateUser() {} // 특정 회원의 정보수정 기능

@DeleteMapping("/users/{userId}")
public String deleteUser() {} // 특정 회원 삭제 기능

- 이처럼 동일한 URL을 매핑했지만, 요청 메서드에 따라 다른 비즈니스 로직을 수행하도록 설정할 수 있다.

'Back-end > Spring MVC 개념' 카테고리의 다른 글

15. Request - message Body 조회방법  (0) 2022.03.15
14. Request - URL parameter 조회방법  (0) 2022.03.14
12. Annotation 기반의 Spring MVC  (0) 2022.03.09
11. Spring MVC의 특징  (0) 2022.03.08
10. Front Controller(2)  (0) 2022.03.07

댓글