흐르는 시간의 블로그...

GOLang으로 첫번째 프로젝트를 진행했다.

프로젝트라고 할것까지 없는 사실 C++로 했으면 두시간짜리를 거의 며칠에 걸쳐서 했다.

다음에는 빨라질꺼라 기대를 하며... 작업을 진행했다.


과정에서 느낀점 몇가지는 아래와 같다. 

(매우 간단한 프로젝트였다는 점을 감안하자)

  • File 관련 작업이 매우 편리하다
  • JSON으로 출력하는 것도 매우 편리하다
  • 기본 라이브러리만 가지고 한다면 이종(linux/windows)간에도 매우 편리하다
  • 하나의 패키지 내에서 파일의 분포나 기능의 분할이 아직은 낯설다
  • 파일 분리가 엉망으로 된 것 같다
  • CentOS에서 인스톨할때 편리하다 - yum 사용
  • yum으로 인스톨할 경우 GOROOT가 잡는게 난감했다(맞는건지 모르겠다) - /usr/lib/golang
  • 간단하게나마 로그파일을 남겼다
  • 스택오버플로우는 진리다!


원래는 CPPJSON 라이브러리를 쓰다가...

어차피 POCO의 Logger를 사용하는 중이기 때문에 하나라도 줄이자라는 생각에...

Poco::JSON을 사용하기로 하였다.


그러나... 간단한 문제가 어려운 상황에 봉착하였다.

영문으로는 아래에다 질문을 올렸고 잘 아는 어떤분(?)이 좋은 댓글을 달아 줬다.

나도 알아낸바가 있지만 짧은 영어로 길게 설명하기 어려워... 여기다가 좀 더 달아본다.


Bad cast exception on poco-library when I tried to cast Int64


원래 소스코드는 저기가서 보시고...

수정한 소스코드는 아래에 있다.


stack overflow에서 지적된 부분의


첫번째는...

_object == NULL 로 비교하면 안된다는 부분이다.


두번째는

각 이름에 해당하는 부분들에 null 값이 올 수 있다는 점이다.

따라서 그 부분을 체크하지 않으면 exception이 발생한다.


세번째는

extract 대신 convert를 사용해야 한다는 점이다.

위의 링크에 가서 테스트에 사용한 bcodew값을 보면 서울 지역은 int 안쪽에 들어오고 다른 지역은 Int64를 사용해야 한다

"BCodeW"를 통해 가져온 값의 타입을 보면 Int 범위는 "i", Int64범위는 "l"을 보여준다.

extract는 해당하는 값의 레퍼런스를 가져오기 때문에 정확한 타입이 맞지 않으면 Bad Cast Exception을 발생시킨다.

Int64가 더 큰 범위임에서 자동 캐스팅이 발생하지 않는다.

큰 범위로 캐스팅해서 값을 가져오고자 한다면 convert를 사용하자.

// POCO JSON 사용
bool CUBIUtils::ParseAddressResult( llong& _BCodeW, char* _szPOI, char* _szJibun, char* _szAPIResult )
{
	JSON::Parser parser;
	try
	{
		formatlog( LOG_DEBUG, "CUBIUtils::%s(%d) AddrSrc: %s", __func__, __LINE__, _szAPIResult);

		JSON::Object::Ptr _object = parser.parse(_szAPIResult).extract();

		_BCodeW = 0;
		if ( _object->isNull("BCodeW"))
			formatlog( LOG_WARN, "CUBIUtils::%s(%d) BCodeW is NULL", __func__, __LINE__);
		else
			_BCodeW = _object->get("BCodeW").convert();

		if ( _object->isNull("poi"))
			formatlog( LOG_WARN, "CUBIUtils::%s(%d) poi is NULL", __func__, __LINE__);
		else
			strcpy( _szPOI, _object->get("poi").extract().c_str());

		if ( _object->isNull("jibun"))
			formatlog( LOG_WARN, "CUBIUtils::%s(%d) jibun is NULL", __func__, __LINE__);
		else
			strcpy( _szJibun, _object->get("jibun").extract().c_str());
	}
	catch(exception &e)
	{
		formatlog( LOG_ERROR, "CUBIUtils::%s(%d) JSON parsing Exception. %s", __func__, __LINE__, e.what());
		return false;
	}

	return true;
}

델파이에서 TJsonObject를 사용할때 Access Violation 발생하는 경우에 대한 내용이다.


http://stackoverflow.com/questions/24815625/parsing-valid-json-with-tjsonobject-using-embarcadero-code-example-fails-with-ex



현재 Access Violation이 계속해서 발생하고 있다.

문제는 JSON 이슈인지 HTTP 문제인지 확인되지 않는다.


이후 더 진행해서 정리한다.