RestTemplate 사용시 반복적인 작업을 처리하고 싶을 때

2015-12-01 09:06

Spring 프레임워크 환경에서 API Server를 테스트할 때 유용하게 사용할 수 있는 라이브러리 중의 하나가 RestTemplate이다. RestTemplate을 활용해 테스트하다보면 반복적으로 처리해야 하는 작업이 있다.

대표적인 예로 로그인한 사용자를 기반으로 테스트할 필요가 있는 경우이다. 이미 로그인을 했다는 가정하에 테스트를 해야하는데 매번 로그인 코드를 작성하는 것은 반복적인 작업이다. RestTemplate은 이 같은 문제를 해결하기 위해 Interceptor를 추가할 수 있는 기능을 제공하고 있다.

먼저 Basic Auth 기반 header를 추가하는 interceptor를 구현한다.

import java.nio.charset.Charset

import org.apache.commons.codec.binary.Base64
import org.springframework.http.client.{ClientHttpRequestExecution, ClientHttpRequestInterceptor}
import org.springframework.http.{HttpHeaders, HttpRequest}

class BasicAuthInterceptor(username: String, password: String) extends ClientHttpRequestInterceptor {
  override def intercept(request: HttpRequest, body: Array[Byte], execution: ClientHttpRequestExecution) = {
    val headers = request.getHeaders()
    basicAuth(headers)
    execution.execute(request, body)
  }

  private def basicAuth(headers: HttpHeaders) = {
    val auth = username + ":" + password
    val encodedAuth = Base64.encodeBase64(auth.getBytes(Charset.forName("US-ASCII")))
    val authHeader = "Basic " + new String( encodedAuth )
    headers.add("Authorization", authHeader )
  }
}

위와 같이 interceptor를 구현한 후 다음과 같이 사용할 수 있다.

  def restTemplateWithBasicAuth = {
    loginUser = aPersistedSomeUser()
    val restTemplate = new RestTemplate()
    restTemplate.setInterceptors(Collections.singletonList(new BasicAuthInterceptor(loginUser.email, loginUser.password)))
    restTemplate
  }

위와 같이 RestTemplate을 생성하는 기반 코드를 만들어 놓은 후 로그인이 필요한 RestTemplate이 필요할 경우 위 메서드를 활용하면 된다.

0개의 의견 from FB

0개의 의견 from SLiPP

의견 추가하기