본문 바로가기
코딩log/Spring Framework

[Spring Framework]HTTP요청 처리하기 - ② URI Pattern Mapping

by 벨크 2023. 8. 6.
반응형

  URI의 I는 identifier 즉 식별자입니다. 따라서 특정 리소스를 식별할 수 있는 Data를 모두 포합니다. 반면에 URL의 L은 locator입니다. 특정 리소스를 식별할 수 있는 주소라는 의미입니다. 따라서 URI 안에 URL이 포함된다고 생각하면 됩니다.(사실 대부분의 요청은 URL로 오기 때문에 URI를 URL로 알고 있어도 큰 문제는 없을 거 같긴 합니다..)

 

  URI와 URL의 정의를 간단하게 알아보았으니, Spring에서 지원하는 URI Pattern Mapping 하는 방법에 대해 알아봅시다.

 


HTTP요청 처리하기 - URI Pattern mapping

 

HTTP요청 처리하기 - ② URI Pattern Mapping

 

URI Pattern Mapping의 기본

 

  Spring Framework에서 URI Pattern을 Mapping 하는 방법은 RequestMapping Annotation을 사용하는 것입니다. 가장 기본적으로 RequestMapping Annotation의 value값에 해당하는 URI를 정의해 주는 것입니다.

 

@Controller
@RequestMapping(method=RequestMethod.POST)
public class Sample {

    @RequestMapping(value = "/hello")
    public String hello(){
        return "Hello Reqeust";
    }
}

 

  /hello라는 URI 요청이 오면 hello라는 메서드를 수행하게 되는 것입니다.

 

  그런데, 같은 기능을 수행하는 여러 가지 URI 요청이 있을 때, 똑같은 메서드를 여러 번 정의해야 하는 문제가 발생합니다. 따라서 RequestMapping Annotation은 다양한 URI 표현 방식을 제공해 줍니다.

 

  • ? : 특정문자 하나만 맵핑 (/sample/?)
  • * : 여러 개의 문자열 맵핑 (/sample/*)
  • ** : 여러 개의 path 맵핑 (/sample/**)

  그럼 위와 같은 표현 방식을 어떻게 사용하는지 간단한 예제 소스로 알아보겠습니다.

 

@RequestMapping(method=RequestMethod.POST)
public class Sample{

    @RequestMapping(value="/hello/?") // /hello/1, /hello/2, /hello/a 와 같은 패턴의 요청을 처리
    public String helloOneChar(){
        return "hello";
    }

    @RequestMapping(value="/hello/*") // /hello/world, /hello/world2, /hello/hi 와 같은 패턴의 요청을 처리
    public String helloMultiChar(){
        return "hello";
    }

    @RequestMapping(value="/hello/**") // /hello/world/hi, /hello/world2/me/too 와 같은 패턴의 요청을 처리
    public String helloMultiplePath(){
        return "hello";
    }
    
}

 

  RequestMapping Annotation은 class 레벨에도 사용할 수 있는데요. class 레벨에 URI Pattern 이 정의되어 있다면, 메서드에 붙은 URI Pattern은 class 레벨에 정의된 패턴 뒤에 이어서 조합이 됩니다.

 

  또, 여러 가지 방식으로 URI 맵핑을 정의하다 보면, 같은 패턴이 여러 개의 메서드에 맵핑될 수 있습니다. 이 때는 가장 구체적으로 정의되어 있는 패턴으로 맵핑됩니다.

 

URI Pattern과 변수 처리

 

  URI 요청을 처리할 때, URI에 포함되어 있는 특정한 값을 받아서 처리해야 할 수 있습니다. 그래서 Spring에서는 URI template Pattern을 URI String과 변수로 이루어져 있다고 정의합니다. 따라서 URI로 요청한 값을 변수로 받아서 처리할 수 있습니다. 예를 들어 URI패턴을 "/users/{userId}"라는 URI template 패턴은 userId라는 변수를 가지고 있고, @PathVariable이라는 Annotation으로 메서드의 파라미터로 받아서 처리할 수 있습니다.

 

@RequsetMapping(method=RequestMethod.POST)
public class Sample {

    @RequestMapping(value="/users/{userId}")
    public String helloUser(@PathVariable("userId")String userId){
        //parameter명과 URI Pattern의 변수 명이 같다면 괄호 생략 가능
        return "hello " + userId;
    }
    
}

 

URI Template Pattern과 정규표현식

 

  URI Template Pattern에 변수명에는 정규표현식을 사용할 수 있습니다. 사용방법은 아주 간단합니다. {varName : 정규표현식}입니다. "/spring-web/spring-web-3.0.5.jar" 이런 URI 요청을 "/spring-web" 경로에 "파일명-버전. 확장자"로 URI Pattern을 정의하고, 정규표현식으로 처리하면 다양한 방식의 요청처리를 하나의 메서드로 해결할 수 있습니다. (URI요청으로 확장자까지 요청하는 건 보안상의 이슈로 권장하지 않습니다. 스프링 부트에서는 기본적으로 확장자 요청을 사용할 수 없게 세팅해 줍니다.)

 

@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{extension:\\.[a-z]+}")
  public void handle(@PathVariable String version, @PathVariable String extension) {
    // ...
  }
}

 


 

이전 글: HTTP 요청 처리하기 - ① HTTP Method 맵핑

 

[Spring Framework]HTTP요청 처리하기 - ① HTTP method 맵핑

HTTP란 대표적인 서버 / 클라이언트 간의 요청/응답 프로토콜입니다. 현재 대부분의 웹 서비스들이 HTTP 통신을 하고 있습니다. 스프링 프레임워크 기반의 웹 애플리케이션들도 대부분 HTTP로 요청

belklog.tistory.com

 

반응형

댓글