본문 바로가기

프로그래밍/Spring

Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (2) - 사전지식

이번 글에서는 Xplatform과 Spring 연동 템플릿에 대한 본격적인 설명에 앞서서 알아두어야 할 사전지식(?)에 대한 설명을 하고자 한다. 이 글에서 설명하는 내용을 미리 알아두면 앞으로의 글들을 이해하는데 조금은 도움이 될 것이라 생각한다.

 

우리가 웹프로그래밍을 하면서 서버와 클라이언트가 주고받는 데이터의 위치는 Request 및 Response의 header와 body를 모두 사용하지만 XPlatform과 서버로 데이터를 주고받을때는 body만 사용한다. 그렇기 때문에 Spring에서 사용하는 @RequestParam 어노테이션등을 이용해서 데이터를 받을 수가 없다(굳이 따지면 서버의 URL에 GET 방식으로 구성하면 받을수는 있지만 Xplatform의 VariableList가 더 사용하기에 편하기 때문에 굳이 이 방법을 사용할 일이 없다) body로 주고받을때는 xml로 주고받게 된다. 이 부분은 fiddler 프로그램을 통해 확인할 수 있다. 일례를 들어 다음의 xml은 템플릿에서 search 버튼 클릭시 Request의 body로 날라가는 내용이다.

 

<?xml version="1.0" encoding="utf-8"?>
<Root>
	<Parameters>
		<Parameter id="firstIndex" type="STRING">5</Parameter>
		<Parameter id="recordCountPerPage" type="STRING">20</Parameter>
		<Parameter id="id" type="STRING">100</Parameter>
		<Parameter id="regUser" type="STRING">chang</Parameter>
	</Parameters>
	<Dataset id="__DS_TRANS_INFO__">
		<ColumnInfo>
			<Column id="strSvcID" type="STRING" size="256"/>
			<Column id="strURL" type="STRING" size="256"/>
			<Column id="strInDatasets" type="STRING" size="256"/>
			<Column id="strOutDatasets" type="STRING" size="256"/>
		</ColumnInfo>
		<Rows>
			<Row>
				<Col id="strSvcID">selectSvc</Col>
				<Col id="strURL">egovSampleSelect.do?id=50&firstIndex=0&recordCountPerPage=10&regUser=terry</Col>
				<Col id="strInDatasets"/>
				<Col id="strOutDatasets">ds_output</Col>
			</Row>
		</Rows>
	</Dataset>
</Root>

 

Xplatform에서 데이터를 전달할때는 2가지의 데이터 모델을 사용한다. 첫번째는 DataSet 이라는 것으로 위에 있는 XML 중 Dataset 태그로 구성되어 있는 내용이 DataSet이다. DataSet은 row와 column 구조로 되어 있으며 각 column 에 대한 정보(이름, 타입, 크기 등)를 저장하고 있다. 그리고 row에서 해당 column과 매핑이 되는 데이터를 저장하고 있다. 형태만 놓고 보면 Database의 record와 같은 형태라 보면 좀더 이해하기 쉬울듯 하다. Xplatform에서는 이러한 DataSet을 여러개 주고 받을 수가 있는데 서버 측에서는 이렇게 여러개의 DataSet을 DataSetList 라는 개념으로 한번에 읽어들일 수 있다. 그리고 각 DataSet의 정해진 이름을 통해서 DataSetList에서 해당 DataSet을 가져올 수 있다. 두번째는 Variable 이라는 것으로 이것은 key와 value로 구성되는 변수 이름과 값의 형태를 가지고 있다. 위의 XML에서 parameter 태그로 표현할 것이 바로 그것이다. 서버에서는 Variable 클래스로 이를 받을 수 있으며 이러한 Variable이 여러개 모여 있는 것을 VariableList로 받아올 수 있다. Xplatform에서는 DataSet과 Variable을 해당 UI를 통해 직접 이름을 주어 만들고 매핑하며 프로그래밍하기 때문에 XML을 직접적으로 제어하는 일은 없다. XML로 만드는 것은 Xplatform이 자동으로 만들어서 해준다. Xplatform에서 서버로 통신하는 역할을 하는 메소드인 transaction 메소드에서 이러한 과정을 거치게 된다. Variable은 transaction 메소드에서 5번째 파라미터에 속하는 인자값으로 전달하며 a=b 형태로 설정한다. 이때 a는 Varaible의 key 에 해당하며 b는 Variable의 value에 해당된다. 이것또한 위에서 언급했듯이 공백을 구분자로 해서 여러개를 보내줄 수 있다.

 

Xplatform에서 사용하는 데이터형은 Java의 그것과는 약간 미묘하게 다른 부분이 있다. Xplatform의 javadoc 문서가 온라인으로 배포되는 것이 아니어서 링크를 걸어줄 수는 없지만 javadoc 문서를 혹 구하게 되면 DataTypes 라고 하는 클래스에 이에 대한 도표가 있다. 이 부분만 그림으로 캡춰해서 보여주면 아래와 같다

 

 

위의 표를 보면 알다시피 1대1로 매핑이 이루어지는 그런 구조가 아니다. 때문에 상황에 따라서 적절한 데이터형을 return 해주는 메소드를 호출해야 할 필요성이 있다. 나중에 설명되겠지만 HandlerArgumentResolver 개발시에 파라미터에 설정된 VO 클래스 안에 있는 멤버변수의 타입에 따라서 적절한 메소드를 호출해야 한다. DataSet 클래스에 대한 javadoc을 보면 row index와 column index를 주어 해당 값을 가져오는 메소드들이 데이터형별로 있기 때문에 상황에 따라 적절한 메소드를 호출하면 된다.

 

Xplatform에서 다루는 데이터 형태와 이에 대한 Java 타입에 대한 설명은 이정도로 마치고 다음으로는 이 Xplatform과 Spring 연동 템플릿을 개발하면서 참조했던 자료에 대해 얘기를 좀 하겠다. 사실 이 얘기는 이 템플릿을 이해하는데 있어서 중요한 것은 아니지만 이 템플릿을 수정할려고 할때는 알아두어야 할 사항이어서 언급해둔다. 또한 비단 Xplatform이 아니라 Miplatform이나 Nexacro 같은 투비소프트 솔루션 연동시 어떤 방법으로 연동해야 할 지 모르는 개발자들을 위해 남겨두는 자료의 성격으로 봐주었음 한다. 실제로 진행을 해본건 아니지만 지금 얘기하는 이 방법으로 Miplatform이나 Nexacro에 대한 연동 템플릿도 이번 연재로 소개하게 되는 Xplatform 연동 템플릿과 같은 형태의 템플릿으로 개발할 수 있을것으로 생각되기 때문이다. 이번 템플릿을 개발하면서 가장 많이 본 자료는 3개가 있다.

 

  1. Spring Javadoc & Reference
  2. Xplatform 클래스 Javadoc
  3. Xplatform에서 제공해주는 jsp와의 연동 샘플 코드

 

1번은 Spring을 연동하는 것이니 관련 Javadoc과 Reference 문서를 보는건 당연한거구, 2번의 경우는 Xplatform에서 제공하는 Java 클래스의 정보와 이에 대한 데이터 타입의 매칭관련으로 자주 보게 되었다. 그러나 구체적으로 어떻게 코딩으로 구현해야 하는지는 3번을 통해 하게 되었다. 아래에 보여주는 코드는 투비소프트에서 Xplatform을 공부할 수 있게 제공해주는 Xplatform 예제에서 같이 제공해주는 xp_base_sawon_sel.jsp의 코드 일부분이다.

 

PlatformData o_xpData = new PlatformData();
...
try {	
	...
	
		/********* Dataset 생성 ************/
	  DataSet ds = new DataSet("ds_sawon");
	  
	  ds.addColumn("sabun",DataTypes.STRING, (short)5);
	  ds.addColumn("name",DataTypes.STRING, (short)10);
	  ds.addColumn("dept",DataTypes.STRING, (short)2);
	  ds.addColumn("jikgup",DataTypes.STRING, (short)2);
	  ds.addColumn("ipsa_date",DataTypes.DATE, (short)8);
	  ds.addColumn("gender",DataTypes.STRING, (short)1);
	  ds.addColumn("marry",DataTypes.STRING, (short)1);
	  ds.addColumn("email",DataTypes.STRING, (short)100);
	  ds.addColumn("smemo",DataTypes.STRING, (short)500);
	  while(rs.next())
	  {
	  	int row = ds.newRow();
	  	
	  	ds.set(row, "sabun", rs.getString("sabun"));
	  	ds.set(row, "name", rs.getString("name"));
	  	ds.set(row, "dept", rs.getString("dept"));
	  	ds.set(row, "jikgup", rs.getString("jikgup"));
	  	ds.set(row, "ipsa_date", rs.getString("ipsa_date"));
	  	ds.set(row, "gender", rs.getString("gender"));
	  	ds.set(row, "marry", rs.getString("marry"));
	  	ds.set(row, "email", rs.getString("email"));
	  	ds.set(row, "smemo", rs.getString("smemo"));
	  }
	  	
		/********* 생성된 Dataset을 DatasetList에 추가 ************/
		o_xpData.addDataSet(ds);
	
		nErrorCode = 0;
		strErrorMsg = "SUCC";
		
	} catch (SQLException e) {
		
		nErrorCode = -1;
		strErrorMsg = e.getMessage();

	}	
	
	...
			
} catch (Throwable th) {
	nErrorCode = -1;
	strErrorMsg = th.getMessage();
}

VariableList varList = o_xpData.getVariableList();
		
varList.add("ErrorCode", nErrorCode);
varList.add("ErrorMsg", strErrorMsg);

HttpPlatformResponse pRes = new HttpPlatformResponse(response, PlatformType.CONTENT_TYPE_XML, "UTF-8");

pRes.setData(o_xpData);
pRes.sendData();

 

DB를 연동하는 부분과 같은 설명에서 불필요한 부분은 생략했다. 위의 코드를 통해 알 수 있는 것은 Xplatform 에서 데이터가 넘어오면 어떤 절차를 거쳐야 하는지, 그리고 조회된 결과를 어떠한 절차로 돌려줘야 하는지를 알 수 있게 된다. 이 부분을 Spring에서 구현해주면 되는 것이다. 즉 데이터가 넘어올때 해줘야 하는 부분은 Spring의 HandlerArgumentResovler 인터페이스를 구현한 클래스에서, 조회된 결과를 넘겨주는 부분은 View 인터페이스를 구현한 클래스에서 해주면 된다. 이후에 이것과 관련된 설명에서 구체적인 코드가 나올테니 일단 이런 샘플 코드를 Spring에서 해당 단계에 맞춰서 사용해주면 된다는 식만 알아두면 된다. 그러면 투비소프트의 기타 솔루션과의 연동도 큰 문제는 없으리라 생각한다.

 

 1. Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (1) - 개요

 2. Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (2) - 사전지식

 3. Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (3) - HttpServletRequestWrapper

 4. Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (4) - Spring Controller에서 하려는 것

 5. Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (5) - HandlerMethodArgumentResolver 분석(1)

 6. Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (6) - HandlerMethodArgumentResolver 분석(2)

 7. Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (7) - HandlerMethodArgumentResolver 분석(3)

 8. Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (8) - HandlerMethodArgumentResolver 분석(4)

 9. Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (9) - XplatformView 분석

 10. Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (10) - 예외처리