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

스브코·2022년 2월 15일
0

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

  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개의 댓글