Post

Spring 새로운 RequestMapping

1. 새로운 주석

일반적으로 전통적인 @RequestMapping 주석을 사용하여 URL 핸들러를 구현하려는 경우 다음과 같을 것이다.

1
@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)

새로운 접근 방식을 사용하면 이를 간단히 다음과 같이 줄일 수 있다.

1
@GetMapping("/get/{id}")

Spring은 현재 GET, POST, PUT, DELETE 및 PATCH 와 같은 다양한 유형의 수신 HTTP 요청 메소드를 처리하기 위한 5가지 유형의 내장 주석을 지원한다. 이러한 주석은 다음과 같다.

  • @GetMapping

  • @PostMapping

  • @PutMapping

  • @DeleteMapping

  • @PatchMapping

명명 규칙에서 우리는 각 주석이 각각의 들어오는 요청 메서드 유형을 처리하기 위한 것임을 알 수 있다. 즉, @GetMapping은 요청 메서드의 GET 유형을 처리하는데 사용되고 @PostMapping은 요청 메서드의 POST 유형을 처리하는 데 사용된다.

2. 작동 방식

위의 모든 주석은 @RequestMapping 및 메서드 요소의 해당 값으로 이미 내부적으로 주석이 달려 있다.

예를 들어 @GetMapping 주석의 소스 코드를 살펴보면 다음과 같은 방식으로 이미 RequestMethod.GET 주석이 추가되어 있음을 알 수 있다.

1
2
3
4
5
6
7
@Target({ java.lang.annotation.ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = { RequestMethod.GET })
public @interface GetMapping {
    // abstract codes
}

다른 모든 주석은 동일한 방식으로 생성된다. 즉, @PostMapping에는 RequestMethod.POST로 주석이 추가되고, @PutMapping에는 RequestMethod.PUT으로 주석이 추가된다.

3. 시행

주석을 사용하여 빠른 REST 애플리케이션을 빌드해본다.

Maven을 사용하여 프로젝트를 빌드하고 Spring MVC를 사용하여 애플리케이션을 생성하므로 pom.xml에 필요한 종속성을 추가해야 한다.

1
2
3
4
5
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>

최신 버전의 spring-webmvc는 Central Maven Repository에서 사용할 수 있다.

이제 들어오는 요청 URL을 매핑하기 위해 컨트롤러를 만들어야 한다. 이 컨트롤러 내에서 이러한 모든 주석을 하나씩 사용한다.

1) @GetMapping

1
2
3
4
@GetMapping("/get")
public @ResponseBody ResponseEntity<String> get() {
    return new ResponseEntity<String>("GET Response", HttpStatus.OK);
}
1
2
3
4
@GetMapping("/get/{id}")
public @ResponseBody ResponseEntity<String> getById(@PathVariable String id) {
    return new ResponseEntity<String>("GET Response : " + id, HttpStatus.OK);
}

2) @PostMapping

1
2
3
4
@PostMapping("/post")
public @ResponseBody ResponseEntity<String> post() {
    return new ResponseEntity<String>("POST Response", HttpStatus.OK);
}

3) @PutMapping

1
2
3
4
@PutMapping("/put")
public @ResponseBody ResponseEntity<String> put() {
    return new ResponseEntity<String>("PUT Response", HttpStatus.OK);
}

4) @DeleteMapping

1
2
3
4
@DeleteMapping("/delete")
public @ResponseBody ResponseEntity<String> delete() {
    return new ResponseEntity<String>("DELETE Response", HttpStatus.OK);
}

5) @PatchMapping

1
2
3
4
@PatchMapping("/patch")
public @ResponseBody ResponseEntity<String> patch() {
    return new ResponseEntity<String>("PATCH Response", HttpStatus.OK);
}

4. 애플리케이션 테스트

애플리케이션을 테스트하려면 JUnit을 사용하여 몇 가지 테스트 사례를 만들어야 한다. SpringJUnit4ClassRunner를 사용하여 테스트 클래스를 시작한다. 컨트롤러에서 선언한 각 주석과 모든 핸들러를 테스트하기 위해 5개의 서로 다른 테스트 사례를 만든다.

@GetMapping의 예제 테스트이다.

1
2
3
4
5
6
7
8
9
@Test 
public void giventUrl_whenGetRequest_thenFindGetResponse() throws Exception {

    MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/get");

    ResultMatcher contentMatcher = MockMvcResultMatchers.content().string("GET Response");

    this.mockMvc.perform(builder).andExpect(contentMatcher).andExpect(MockMvcResultMatchers.status().isOk());
}

GET URL /get에 도달하면 상수 문자열 GET Response가 예상된다.

@PostMapping 테스트이다.

1
2
3
4
5
6
7
8
9
@Test 
public void givenUrl_whenPostRequest_thenFindPostResponse() throws Exception {

    MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.post("/post");

    ResultMatcher contentMatcher = MockMvcResultMatchers.content().string("POST Response");

    this.mockMvc.perform(builder).andExpect(contentMatcher).andExpect(MockMvcResultMatchers.status().isOk());
}

PostMan, RESTClient 등과 같은 일반적인 REST 클라이언트를 항상 사용하여 애플리케이션을 테스트할 수 있다. 이 경우 나머지 클라이언트를 사용하는 동안 올바른 HTTP 메서드 유형을 선택하는 데 약간의 주의가 필요하다. 그렇지 않으면 405 오류 상태가 발생한다.

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.