Programing/JAVA

JAVA COBR 파싱 CBOR이란 Concise Binary Object Representation

리커니 2017. 11. 2.
반응형

 

java cbor 파싱 cbor이란 Concise Binary Object Representation

 

1. CBOR 이란?

CBOR 이란 Concise Binary Object Representation 의 약자로 간결한 이진 객체의 형태 표현으로 보시면 됩니다.

쉽게 JSON, XML 과 같은 데이터 표현의 한 방법인 것이죠.

하지만 Binary 데이터 이기 때문에 다른 표현 방식보다 가벼운 것이 장점 입니다.

자세한 설명은 아래의 Link 를 참고하세요.

 

Link : http://cbor.io/

 

그럼 사용방법을 알아보도록 하죠.

 

테스트 스펙은 아래와 같습니다.

[SPEC]

전자정부프레임워크 3.6

JAVA 8

Tomcat 7.0

 

우선 pom.xml 에 dependency를 추가 합니다.

 

[pom.xml]

  <dependency>
      <groupId>co.nstant.in</groupId>
      <artifactId>cbor</artifactId>
      <version>0.7</version>
  </dependency>

 

클라이언트에서는 String으로 CBOR 형태의 데이터를 GET방식으로 보내준다고 가정합니다.

 

예를들면 아래와 같이 되는 것이죠.

 

http://localhost:8080/proxy/cbor?value=82019818011a5923cef0f5f4f5f4...............

 

CBOR도 바이너리 데이터 전송방식이기때문에 프로토콜이 정의되어 있어야 합니다.

몇번째 값은 무엇을 의미하는 것인지.

 

 

이제 데이터를 받을 컨트롤러를 보도록 하죠.

 

[TextController]

@RequestMapping(value="/cbor", produces="text/plain;charset=UTF-8")
@ResponseBody
public void cborInsertMsd(HttpServletRequest request, HttpServletResponse response) throws Exception {
    String returnVal = null;
    try{
        String cbor = request.getParameter("value").toLowerCase();

        ByteArrayInputStream bais = new ByteArrayInputStream(SendData.toByteArray(cbor));
        List<DataItem> dataItems = new CborDecoder(bais).decode();

        for(DataItem dataItem : dataItems){
            System.out.println(dataItem.getMajorType());
            System.out.println(dataItem);
        }
    }catch(Exception e){
        e.printStackTrace();
    }
}

 

request.getParameter로 value 값을 받습니다.

이 value가 CBOR String 값이겠죠.

그 값을 받아 toByteArray 함수를 사용해 바이트배열 형태로 전환 합니다.

그런 후 그 값을 CBOR 디코딩 하는 것이죠.

그래서 출력을 해보면 아래와 같이 출력이 됩니다.

 

ARRAY
[1, [1, 1495518960, SIMPLE_VALUE, SIMPLE_VALUE, SIMPLE_VALUE, SIMPLE_VALUE, 3, WM9VDSDSPYA123456, [2321364848, 2321364848], 1495518961, [2321364848, 2321364848], 1495518962, [2321364848, 2321364848], 1, 1495518960, 01028372796, 1, SIMPLE_VALUE, SIMPLE_VALUE, SIMPLE_VALUE, SIMPLE_VALUE, SIMPLE_VALUE, SIMPLE_VALUE, SIMPLE_VALUE]]

 

major type 이 ARRAY

데이터가 쭉쭉 찍히게 되죠.

 

그런데 의문점이 프로토콜정의서에는 SIMPLE_VALUE라고 찍힌 데이터가 Boolean 타입 데이터가 들어가는 자리인데

제대로 되지 않네요.

디코딩쪽에 뭔가 모를 문제가 있는 것 같습니다.

 

CBOR 라이브러리 중에 SimpleValueType 클래스 를 보면 20일때 false 21일때 true 인데

f4, f5가 제대로 디코딩 되지 않는것 같습니다.

원인에 대해서는 차차 찾아보기로 하고,

 

저의 경우에는 빠른 처리가 필요해서 받은 CBOR 타입의 스트링을 변환해서 원하는 값을 얻었습니다.

 

CBOR의 경우 간편하고 가볍긴 하지만 아직 많이 사용되지는 않는 데이터 타입인거 같습니다.

구글링을 해도 별 자료가 나오지 않네요.

 

그래서 cbor -> json 으로의 변환도 디코딩 된 String 값을 가공해서 만들어 냈습니다.

물론 찾아보면 json 타입으로의 변환도 간단 하겠지만.

 

시간날 때 CBOR에 대해서 더 파봐야 될 것 같습니다.

그럼 이만 ㅎ

 

제대로 되는 CBOR 디코드는 아래의 Link를 참고하세요.

Link : Java CBOR parsing, CBOR to JSON Object

 

반응형

댓글

💲 추천 글