스프링 공식 문서 뿌수기(3), Spring MVC의 Annotated Controllers - RequestMapping

2023. 4. 21. 21:44자바/스프링

728x90
반응형

이전 글에 이어서 Annotated Controllers의 RequestMapping에 대해 본격적으로 글을 작성해보려고 한다.

 


 

 

Request Mapping

 

@RequestMapping 어노테이션은 요청받는 URL 주소를 매핑해주는 역할을 한다. 일반적으로는 메서드보다는 Controller 클래스에 직접 어노테이션을 붙여서 url 주소를 매핑하는 역할을 한다. 메서드에는 조금 더 명확하게 이를 표현하기 위해 @GetMapping이나 @PostMapping 어노테이션으로 Http 메서드까지 포함한 어노테이션을 사용하는 것이 좋다.

 

@RequestMapping: 일반적으로 클래스에 붙인다.

@GetMapping, @PostMapping: 메서드에 붙인다.

 

 

@GetMapping과 @PostMapping은 @RequestMapping을 포함하고 있다. 

 

 

 

 

 

URI 패턴

Path 경로를 설정하는 데에는 두 가지 방법이 있지만 'AntPathMatcher'는 다소 비효율적이어서 대부분의 경우에는 'PathPattern'이 사용되고 있다고 한다.

 

뭐 한번 공식 문서를 보면 큰 차이는 없는 것 같다.

AntPathMatcher

PathPattern

?, *, **와 같은 표현들은 유사한 것을 확인할 수 있다. 다만 예시를 보니 AntPathMatcher는 주로 클래스 경로나 클래스에 대한 리소스를 선택할 때 종종 사용하는 것 같다.  그에 반해 PathPattern은 정적 파일에 대한 리소스를 선택할 때 많이 사용하는 것 같다. 또한 왜인지는 모르겠지만 PathPattern은 공식 문서에서도 빠르게 처리한다고 이야기하고 있다.

 

굳이 외울 필요는 없을 것 같고, 간단하게 예시만 몇 개 확인해보고, 필요할 때 다시 와서 점검해보면 좋을 것 같다.

 

 

PathPattern을 활용한 URI Pattern을 사용할 때에는 @PathVariable이라는 어노테이션을 사용한다. 그리고 url에서는 PathVariable로 사용할 값을 {}로 감싼 것을 확인할 수 있다.

 

URI 변수는 자동으로 적절한 유형으로 변환되거나 TypeMismatchException을 발생시킨다. 원시 타입 뿐만 아니라 Date 같은 타입도 지원되고, 우리가 작성한 클래스의 경우에는 DataBinder를 활용해 이를 등록할 수 있다. DataBinder는 뒤에 나오는 내용이지만 간단하게 설명하면 @RequestParam이나 @PathVariable, @ModelAttribute로 전달된 데이터를 객체로 바인딩해주는 역할을 한다. @InitBinder를 사용하면 이를 직접 등록할 수 있다. (여기에서 내용을 정리하다가 너무 길어져서 게시물을 따로 만들었다.)

 


 

 

변수명과 {} 내에 있는 이름이 동일하거나, 만약 -parameters 컴파일러 플래그로 컴파일하는 경우에는 이름을 명시하지 않아도 사용 가능하다. -parameters 컴파일러 플래그는 setting에서 gradle로 빌드를 하면 자동으로 들어가니 안심해도 된다. 그런데 intellij로 빌드를 하면 대부분 빠지게 되는 것 같다. intellij로 빌드를 하더라도 해당 값을 추가하면 묵시적으로 값을 바인딩해준다.

 

참고로 이전에 올렸던 포스팅 중 기본생성자를 사용하지 않고 @RequestBody에 해당하는 값을 바인딩하는 방법에 대해 포스팅했는데, 그 때 문제가 발생한 것이 intellij로 빌드해서 그런 것이었다. 이 문제 상황 또한 -parameters 컴파일러 플래그 사용해 컴파일하면 프로퍼티나 역직렬화 어노테이션을 사용하지 않아도 해결할 수 있다.

 

2023.04.18 - [자바/스프링 삽질 기록] - Spring에서 @RequestBody로 전달받는 객체의 필드에 final 키워드를 붙일 수 있을까?

 

 

동일한 URI 패턴이 나오는 경우에는 어떡해?

 

URI 패턴이 동일하게 나오는 경우에는 각 패턴에 맞춰 비교를 한다.

이때 아래와 같이 점수를 매겨서 비교를 한다고 한다.

 

- URI 변수의 수가 적은 경우: 1

- 단일 와일드 카드인 경우(*): 1

- 이중 와일드 카드인 경우(**): 2

 

점수가 같으면 더 긴 패턴이, 점수와 길이가 같으면 와일드카드보다 URI 변수가 더 많은 패턴이 선택된다.

 

.*와 같은 접미사 일치는 일관되게 해석하기 어려워 5.3 버전부터는 지원하지 않는다고한다. 

 

 

 

Content-type

 

'

 

consumes나 produces를 사용해 request로 받을 수 있거나 response로 전달할 수 있는 Content-type을 설정할 수 있다.

 

위에서 볼 수 있듯이 MediaType이라는 클래스에서 일반적으로 사용되는 미디어 유형에 대해 상수로 사용할 수 있다.

 

MediaType 클래스는 MimeType을 상속받고 있는데, MIME는 HTTP 프로토콜 내에서 전달되는 데이터 유형을 의미한다. 

 

 

Parameter와 Header

 

재미있는 점은 Parameter와 Header를 통해서도 요청 매핑 범위를 좁힐 수 있다는 것이다.

 

만약 name이 hello인 매개변수가 있을 때 매핑을 시키고 싶다면 위의 예시와 같이 작성하면 된다.

name이 hello가 아닌 매개변수에 대해 매핑을 시키고 싶다면 !hello로 작성하면 된다.

 

스프링 공식 문서에선 Content-type이 헤더에 있기에 이를 headers로 사용해서 제한할 수는 있지만 그 방법보다는 consumes를 사용하는 것을 권장한다고 한다.

728x90
반응형