티스토리 뷰
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
ProtobufHttpMessageConverter.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 |
- Total
- Today
- Yesterday