티스토리 뷰

Spring 에서 ProtocolBuffer 의 Converter 를 제공한게 4.x 버전부터입니다.

떄문에 3.x 버전에서는 필요한 클래스들이 없어서 그대로 적용이 불가능하지만,

특정 코드만 복사해오면 쉽게 적용가능합니다.


1. 관련코드 다운로드

필요한 Spring 클래스와 인터페이스를 다운로드하여 프로잭트에 포함시킵니다.

ProtobufHttpMessageConverter
https://github.com/spring-projects/spring-framework/blob/master/spring-web/src/main/java/org/springframework/http/converter/protobuf/ProtobufHttpMessageConverter.java
ExtensionRegistryInitializer
https://github.com/spring-projects/spring-framework/blob/master/spring-web/src/main/java/org/springframework/http/converter/protobuf/ExtensionRegistryInitializer.java

2. servlet-context.xml 설정

Spring 4.x 에서는 org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter 클래스가 들어가야 하지만 없으므로,

1번에서 다운로드한 파일을 넣어줍니다.

<mvc:annotation-driven>
	<mvc:message-converters>
		<ref bean="protobufHttpMessageConverter" />
	</mvc:message-converters>
</mvc:annotation-driven>

<bean 
	id="protobufHttpMessageConverter"
	class="com.example.core.converter.ProtobufHttpMessageConverter" />

3. 테스트용 서버 컨트롤러

테스트용proto 로 생성한 PacketTest.PACKET_TEST 파일을 이용했습니다.

Spring 4.x 라면 RequestEntity 를 사용했겠지만, Spring 3.x 에는 없는 클래스이므로, HttpEntity 클래스를 대신 사용합니다.

어차피 RequestEntity 도 HttpEntity 를 상속해서 만든거라서 상관없습니다.


import com.example.entity.PacketTest; import org.springframework.http.HttpEntity; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.google.protobuf.ByteString; @Controller @RequestMapping(value="/example") public class TestController { @RequestMapping(value = "/test", method = { RequestMethod.POST }) public ResponseEntity<PacketTest.PACKET_TEST> test(HttpEntity<PacketTest.PACKET_TEST> inputMessage) throws Exception { System.out.println(inputMessage.toString()); PacketTest.PACKET_TEST.Builder messageBuilder = PacketTest.PACKET_TEST.newBuilder(); messageBuilder.setData1("ABC"); messageBuilder.setData2(10); messageBuilder.setData3(20L); messageBuilder.setData4(true); messageBuilder.setData5(ByteString.copyFrom("ABC".getBytes())); PacketTest.PACKET_TEST outputMessage = messageBuilder.build(); return new ResponseEntity<PacketTest.PACKET_TEST>(outputMessage, HttpStatus.OK); } }

4. 테스트용 클라이언트

클라이언트는 spring버전이 상관없으므로, 그냥 Spring 4.x 로 만들었습니다.

import java.util.ArrayList; import java.util.List; import com.example.entity.PacketTest; import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter; import org.springframework.web.client.RestTemplate; import com.google.protobuf.ByteString; public class ProtoPacketApplication { private static int port = 8080; public static void main(String[] args) { ProtobufHttpMessageConverter protoConverter = new ProtobufHttpMessageConverter(); List<HttpMessageConverter<?>> converters=new ArrayList<HttpMessageConverter<?>>(); converters.add(protoConverter); RestTemplate restTemplate = new RestTemplate(converters); PacketTest.PACKET_TEST.Builder builder = PacketTest.PACKET_TEST.newBuilder(); builder.setData1("AAAAAAAAAA"); builder.setData2(10000); builder.setData3(2000000000); builder.setData4(true); builder.setData5(ByteString.copyFrom("BBBBBBBBB".getBytes())); PacketTest.PACKET_TEST request = builder.build(); ResponseEntity<PacketTest.PACKET_TEST> response = restTemplate.postForEntity( "http://localhost:" + port + "/example/test", request, PacketTest.PACKET_TEST.class); int httpStatus = response.getStatusCode().value(); PacketTest.PACKET_TEST data = response.getBody(); System.out.println("httpStatus : " + httpStatus); System.out.print("data-------------------\n" + data.toString()); System.out.println("-----------------------"); } }

5. 테스트

서버를 먼서 실행하고, 테스트클라이언트를 실행합니다.

1)클라이언트에서 proto클래스를 만들어 던지고

2)서버에서는 그것을 받아 print, 다시 proto클래스를 재생성

3)클라이언트는 받아서 print 하는 식으로 테스트했습니다.

//서버 로그 data1: "AAAAAAAAAA" data2: 10000 data3: 2000000000 data4: true data5: "BBBBBBBBB" //클라이언트 로그 httpStatus : 200 data------------------- data1: "ABC" data2: 10 data3: 20 data4: true data5: "ABC" -----------------------


정상적으로 서버가 동작함을 알 수 있습니다.

Spring 4.x 에서도 기본적인코드는 동일합니다.


아래는 테스트에 사용된 코드파일 입니다.


ExtensionRegistryInitializer.java


PacketTest.java


PacketTest.proto


ProtobufHttpMessageConverter.java


ProtoPacketApplication.java


TestController.java



[작성자] devbible.tistory.com


'Development' 카테고리의 다른 글

[Java] StringJoiner (comma separated string)  (0) 2016.04.08
[SQL SERVER] paging query  (0) 2016.03.25
[Redis] INFO vs MONITOR  (0) 2016.03.08
[Linux] tar , tar.gz 압축 및 해제  (0) 2016.01.03
[Linux] VirtualBox에 CentOS 7 설치  (0) 2015.12.20
댓글