본문 바로가기
Spring

[Spring] RestTemplate을 적용하여 CORS 이슈 해결

by 태진아밴드 2019. 9. 26.

웹에서 차트를 구현했던적이 있었는데 이를 위해 받아오는 데이터가 외부도메인인 탓에 

 

CORS 정책때문에 삽질을 하던 적이 있었다.

 

그 때 사용했던게 Spring의 RestTemplate이였다.

 

RestTemplate은 Spring의 HTTP 통신 템플릿인데 이를 이용하여

 

서버 내부적으로 호출 한 뒤 컨트롤러 단에서 데이터를 다시 전송하는 방식으로 구현했었다.

 

예제를 위해 간단한 Test code를 올려둔다.

 

일단 pom.xml에 http관련 라이브러리를 추가한다.

 

<!-- http -->
<!-- httpclient -->
<dependency>
	<groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5.8</version>
 </dependency>
 <!-- httpcore -->
 <dependency>
 	<groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpcore</artifactId>
    <version>4.4.10</version>
    </dependency>
 <!-- httpasyncclient -->
<dependency>
	<groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpasyncclient</artifactId>
    <version>4.0-beta3</version>
</dependency>

 

 

그리고 root-context.xml에 restTemplate의 bean을 추가해준다.

 

<bean id="restTemplate"	class="org.springframework.web.client.RestTemplate">
	<property name="requestFactory">
    	<bean class="org.springframework.http.client.SimpleClientHttpRequestFactory">
        	<property name="connectTimeout" value="5000" />
            <property name="readTimeout" value="5000" />
        </bean>
    </property>
    <property name="messageConverters">
    	<list>
        	<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
        </list>
    </property>
</bean>

 

 

마지막으로 테스트 코드를 작성한다.

 

import java.net.URI;
import java.util.Arrays;

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

public class RestTemplateTest {

	private static final Logger logger = LoggerFactory.getLogger(RestTemplateTest.class);

	@Test
	public void restTemplateTest() throws Exception{

			RestTemplate restTemplate = new RestTemplate();
			URI uri = URI.create("http://요청 url");
			HttpHeaders headers = new HttpHeaders();
			headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
			headers.setContentType(MediaType.APPLICATION_JSON);
			headers.set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36");
			HttpEntity<String> entity = new HttpEntity<String>("parameters", headers);
			ResponseEntity<String> result  = restTemplate.exchange(uri, HttpMethod.GET, entity, String.class);
			logger.info(result.toString());

	}

}

 

restTemplate 객체 생성 후 header 객체에 헤더정보를 담아준다.

 

그리고 exchage 메서드로 uri와 헤더정보를 담아서 실행하는 코드이다.

 

이제 테스트메서드를 JUnit 테스트로 돌려보면?

 

 

로그에 데이터가 정상적으로 호출되는걸 확인할 수 있다.

 

이제 요청한 데이터를 가져가다 요리지지고 조리지지고 해서 쓰면 된다!

 

나 같은 경우엔 가져온 데이터를 스크립트단에서 차트에 붙이는데에 삽질을 했었다.

 

두번 다시는 하고싶지 않은 삽질의 추억..😢