Spring boot 리다이렉트 + patchmapping 테스트 방법

스브코·2022년 2월 15일

오늘 과제 테스트 중에 전에 해본적 없는 두가지를 찾아서 적용해보았다.

  1. spring boot 리다이렉트 방법
  2. patchmapping 테스트 방법 by testRestTemplate

일단 리다이렉트와 patchmapping은 해본적이 없었다.


리다이렉트 방법

@GetMapping("/r/{shortId}")
    public String redirectFromShortId(@PathVariable String shortId) {
        return "redirect:" + redirectService.redirectFromShortId(shortId);
    }

이런식으로 "redirect:" + url을 해주면된다.

삽질1 : @RestController = @ResponseBody + @Controller 이기때문에 @RestController에서 위와같이 리턴을 해주면 그냥 문자열이 반환된다. @Controller에서 해주어야지 뷰를 반환하기때문에 해당 url로 리다이렉트가 가능하다.

삽질2 : redirect: /r/test 로 해주면 현재 서블릿 컨텍스트에 대한 상대적인 경로로 리다이렉트를 하게 됩니다. 절대경로로 리다이렉트 하기위해서는 http://를 꼭 붙여서 redirect: http//:localhost:8080/r/test와 같이 입력해 주어야 한다.


patchmapping 테스트 방법

patchmapping은 putmapping이라 조금 다른데, 사용하는 부분에서는 다른점이 없는듯 싶고, 이론적으로는 이런식으로 다르다.

putmapping: 리소스 교체의 의미, 하나만 바꾸고 싶어도 전체를 다 바꾸어야함

patchmapping: 리소스 업데이트의 의미, 속성 중 하나만 업데이트 할수 있음

patchmapping을 testRestTemplate으로 그냥 테스트하면

I/O error on PATCH request for "http://localhost:53037/short-links/bwosp": Invalid HTTP method: PATCH; nested exception is java.net.ProtocolException: Invalid HTTP method: PATCH
org.springframework.web.client.ResourceAccessException: I/O error on PATCH request for "http://localhost:53037/short-links/bwosp": Invalid HTTP method: PATCH; nested exception is java.net.ProtocolException: Invalid HTTP method: PATCH
	at app//org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:785)
	at app//org.springframework.web.client.RestTemplate.execute(RestTemplate.java:711)
	at app//org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:602)
	at app//org.springframework.boot.test.web.client.TestRestTemplate.exchange(TestRestTemplate.java:697)
	at app//com.example.ab180test.IntegrationTest.test5(IntegrationTest.java:111)
	at java.base@11.0.13/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base@11.0.13/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base@11.0.13/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base@11.0.13/java.lang.reflect.Method.invoke(Method.java:566)
	at app//org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725)

뭐이런 에러가 나오는데, 아래 링크에 따르면 testRestTemplate의 기본값은 patch method를 사용하는 기능이 제공되지 않는다고 한다.(그럼 patchforobject 메소드는 도데체 왜있는거지....?!?) 어쨋든 그래서 apache client를 의존성에 추가해주면 된다고 하는데,

https://rtmccormick.com/2017/07/30/solved-testing-patch-spring-boot-testresttemplate/

implementation 'org.apache.httpcomponents:httpclient:4.4.1'

위와 같이 의존성을 추가 해주니 정상적으로 testRestTemplate으로 patch method 테스트가 가능하였다.

profile
익히는 속도가 까먹는 속도를 추월하는 그날까지...

0개의 댓글