Morpheus Server Platform을 활용하여 모바일 앱과 연계하기 위한 개발 가이드
아래 그림은 Morpheus Server Platform의 시스템 구성도를 도식화한 것이다.
H/W 에 대한 구성도 이다. DMZ 에는 보안을 위해 Relay Web Server가 위치하고 내부망에는 WAS 및 DB, Storage 를 구성하여 소스 및 정보를 보호할 수 있도록 구성한다. 단 고객사의 보안 정책에 따라 WAS 의 위치는 변경될 수 있다.
아래 그림은 Mobile Server 서비스 구조를 도식화 한 것이다.
Mobile APP과 Mobile Server 간 HTTP 프로토콜을 이용하여 정의된 JSON 데이터 형식으로 송수신하고 웹 요청을 받은 Controller 가 Biz Logic 또는 Interface Module을 호출하거나 수행하여 서비스를 처리한다.
구성요소 | 설명 | 비고 |
---|---|---|
Spring Dispachter Servlet |
|
|
Controller |
|
DAO 또는 Interface module 호출 |
Biz Logic |
|
|
Interface Module |
|
|
DB |
|
|
Legacy System |
|
|
통합 Admin |
|
|
아래 그림은 모바일 서버 플랫폼의 소프트웨어 구성도를 도식화한 것이다.
구분 | 구성요소 | 제품내역 | |
---|---|---|---|
시스템 S/W | OS | Server | Linux, Unix, Windows 계열 OS |
Network | TCP/IP | ||
DBMS | Oracle, MS-SQL, MySql | ||
WAS | Weblogic, Jeus, Tomcat, JBOSS(most overall WAS 지원) | ||
Web Server | WebtoB, Apache (most overall Web Server 지원) | ||
어플리케이션 S/W | 개발 환경 | Server | JDK SE 1.6 권장 (JDK 1.5 이상 지원) |
Spring 3.1.2 Version, Mybatis 3.2.2 Version | |||
Eclipse Helios 이상 권장 |
아래와 같은 절차를 통해 분석 및 확장 개발을 수행한다.
기간계 시스템에서 제공 하는 연동 가이드 및 연동 모듈을 개발 하고 클라이언트와 G/W 서버간의 전문을 정의하여 배포 한다.
Spring 은 Model, View, Controller(MVC) 구조를 가지고 있으며 J2EE 애플리케이션 개발에 일관된 프레임웍을 제공함과 동시에 원하는 컴포넌트만 선택적으로 사용할 수 있다는 이점이 있다. Spring 의 Annotation 기반으로 RESTful API를 구현하여 클라이언트에 서비스를 제공한다.
Spring Framework 에서는 Stereotype Annotation 을 활용하여 MVC 개발을 지원한다. 생산성 향상을 위해서 @Controller, @RequestMapping, @Autowired Annotation 만을 사용한다. 또한 반드시 클라이언트 통신 Controller은 @RequestMapping의 URI를 /api
로 시작하는 URI로 만들어야 한다.
Annotation | 설명 |
---|---|
@Controller | Controller 클래스를 정의 |
@Autowired | 의존관계를 자동으로 설정한다. |
@RequestMapping | 웹 요청에 대한 메소드 매핑 Annotation |
구분 | 설명 |
---|---|
method |
|
value |
|
예제 코드
@Controller
public class SampleCtrl {
private Logger logger = LoggerFactory.getLogger(this.getClass().getName());
//WEB-INF/config/context/legacy-mybatis-context.xml파일에서 설정한 legacyDB 연결세션
@Autowired(required=true)
@Qualifier("sqlSession_legacy")
private SqlSession session;
@Autowired(required=true)
private MessageSource messageSource;
// //////////////////////////////////////////////////////////////////////
// !!!주의 확인: RequestMapping uri 는 반드시 /api로 시작 해야만 한다. // //////////////////////////////////////////////////////////////////////
@RequestMapping(method= RequestMethod.POST, value="/api/msp/sample/{id}")
public ModelAndView sampleList(HttpServletRequest request,
HttpServletResponse response){
// ////////////////////////////////////////////////////////////////////////////
// 클라이언트에서 넘어온 request 값 map으로 리턴해줌 (반드시 포함) //////////////////////////////////////////////////////////////////////////////
//rest로 넘어온 URI Path VARIABLES ATTRIBUTE 맵정보
Map<String,Object> uriPathVal =(Map<String,Object>)request.getAttribute(Const.REST_URI_PATH_VAL);
//클라이언트에서 넘어온 request(HEAD+BODY) 모든정보
Map<String,Object> reqMap = (Map<String,Object>)request.getAttribute(Const.HTTP_BODY);
//클라이언트에서 넘어온 공통 헤더 맵정보
Map<String,Object> reqHeadMap = (Map<String,Object>)request.getAttribute(Const.HEAD);
//클라이언트에서 넘긴 파라미터 맵정보
Map<String,Object> reqBodyMap = (Map<String,Object>)request.getAttribute(Const.BODY);
//클라이언트에서 넘길 Response 맵 세팅
MobileMap responseMap = new MobileMap();
//클라이언트 전달 헤더값에 기본으로 성공인 200번 코드로 세팅
reqHeadMap.put(Const.RESULT_CODE, Const.OK);
//클라이언트 전달 헤더값에 기본으로 성공메세지 Success로 세팅
reqHeadMap.put(Const.RESULT_MESSAGE, Const.SUCCESS);
responseMap.setHeadMap(reqHeadMap);
// ////////////////////////////////////////////////////////////////////////////
Map<String, Object> responseBodyMap= new HashMap<String, Object>();
try{
/********************************************************************************
* 이 부분에 비즈니스 로직을 코딩한다.
*******************************************************************************/
//Legacy DB조회
List<Map<String,Object>> userList =session.selectList("Sample.getSampleData",reqMap);
responseBodyMap.put("userList", userList);
/********************************************************************************
* 이 부분에 비즈니스 로직 마침.
*******************************************************************************/
} catch (Exception e) {
e.printStackTrace();
responseMap.setResultCode(Const.EXCEPTION_ERROR);
if(e.getMessage() != null){
responseMap.setResultMessage(e.getMessage());
} else {
responseMap.setResultMessage(messageSource.getMessage("500.error", null , Locale.getDefault().ENGLISH ));
}
}
responseMap.setBodyMap(responseBodyMap);
return responseMap.jsonView();
}
}
kr.msp.samle.sqlmap
패키지에 SampleManage.xml
파일 생성
<!-- 맵핑될 Mapper 클래스 경로 입력-->
<mapper namespace="Sample">
<select id="getSampleData" parameterType="hashmap" resultType="hashmap">
SELECT '홍길동' USERNM , 'TEST1' USERID, '001' USERSN FROM dual
union ALL
SELECT '테스트' USERNM , 'TEST2' USERID, '002' USERSN FROM dual
union ALL
SELECT '놀부' USERNM , 'TEST3' USERID, '003' USERSN FROM dual
union ALL
SELECT '흥부' USERNM , 'TEST4' USERID, '004' USERSN FROM dual
</select>
</mapper>