MyBatis 3.0의 예제를 보면 파라미터를 하나 던지는 예제만 줄줄 있습니다. 그 타입이 primitive 이던, POJO 형태든지 말이죠.
여러 개의 파라미터를 던지려면 @Param 어노테이션을 사용하고, map으로 xml 파일에 정의해 주면 됩니다.
1. 먼저 Mapper Interface에 메소드를 정의합니다. public Map selectMachineAgentMap(@Param("machineId") int machineId, @Param("agentId") int agentId);
2. mapper.xml 파일에 paramterType을 map으로 잡습니다.
<select id="selectMachineAgentMap" parameterType="map" resultType="map"> SELECT MACHINE_ID, AGENT_ID FROM M_MACHINE_AGENT_MAP_TBL WHERE MACHINE_ID = #{machineId} AND AGENT_ID = #{agentId} </select>
위와 같이 하면 MyBatis는 맵 객체를 생성하고 거기에 @Param에 해당하는 이름으로 전달받은 인자를 저장합니다. 이후 프로세서에서는 #{}의 이름에 해당하는 key를 이용하여 데이터를 추출하고 컬럼의 메타데이터에 해당하는 타입으로 캐스팅하여 쿼리를 날리게 됩니다.
System 상태 및 모니터링 대상이 파일/패키지 소프트웨어일 경우 어떻게 접근할 것인가에 대한 컨셉을 XML로 표현했습니다. 실제 구현체는 너무 복잡해서 패스.
<sys-mon>
<!--
에이전트에 대한 이름을 설정한다. 에이전트 이름은 컨트롤러 측과 데이터베이스의 유일한 식별정보이다.
내부적으로는 머신의 식별을 MAC Address, 에이전트의 식별을 에이전트의 이름을 이용한다.
따라서 에이전트의 이름은 전체 클라우드 플랫폼 영역에서 유일하여야만 하는 제약 조건을 가진다.
만일 동일한 이름이 있을 경우, 시스템 에이전트가 올바르게 동작하지 않을 수 있다.
-->
<agent-info>
<name>JW_WIN</name>
</agent-info>
<!--
컨트롤러의 측의 IP와 PORT를 명시하는 부분이다. 컨트롤러와의 접속 해제시 재접속을 하는 방법으로 2차 URL을 줄 수 있는 환경이 마련되어 있다.
즉 IP:PORT,IP:PORT의 형태로 컨트롤러의 주소를 나열하면, 문제 발생시 콤마(,)이후의 접속 정보로 재접속을 시도하게 된다.
서버 컨트롤러는 클러스터 구성이 되어 있게 되므로 다음과 같이 설정하면 에이전트의 페일오버가 진행된다.
예) 192.168.0.1:8080,192.168.0.2:8080
-->
<controller-info>
<host>127.0.0.1:8080,127.0.0.1:8180,127.0.0.1:8280</host>
</controller-info>
<!--
서비스 제공자의 모니터링 수집 정보가 데이터베이스에 존재할 경우 해당 데이터베이스에 대한 연결풀을 설정한다.
일반적인 JDBC에서 사용하는 데이터 정보를 기술하게 되며, commons-pool을 이용하여 데이터베이스 연결을
미리 name 속성에 해당하는 이름으로 생성하여 놓는다.
여러개의 데이터 소스를 설정한다면 root 엘리먼트의 <data-source></data-source> 설정을 복수로 한다.
-->
<data-source name="jdbc/platform">
<driver-class>com.mysql.jdbc.Driver</driver-class>
<connect-uri>jdbc:mysql://localhost:3306/cloud</connect-uri>
<user>cloud</user>
<password>cloud</password>
</data-source>
<data-source name="jdbc/informatica">
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<connect-uri>jdbc:oracle:thin:@localhost:1521:CLOUD</connect-uri>
<user>INFOM</user>
<password>INFOM</password>
</data-source>
<!--
System Resource Monitoring Cycle(Baseline : milliseconds)
시스템 리소스에 대한 모니터링 주기를 밀리초 단위로 표시한다. 시스템 리소스 데이터의 수집주기는 5분이지만 데이터의 오류를 막기 위하여 아래에 설정된 repeat-interval을 통해
일정 시간 간격 사이의 데이터를 수집한다.
즉, 5분에 한 번씩 데이터를 수집한다고 가정했을 때, 데이터 수집시점에는 적은 리소스를 사용할 수 있다.
하지만 2분 30초 시점에 리소스에 문제가 발생을 했다면 그 정보는 추적이 불가능한 상태로 남게 된다.
이를 방지하게 하기 위하여 5분간의 평균값, 최대값, 최소값을 얻기 위한 방법으로 리소스 데이터 수집 주기를 설정한다.
-->
<system-monitoring>
<repeat-interval>30000</repeat-interval>
</system-monitoring>
<!--
가용성 체크를 담당하는 설정이 아래와 같다.
availability 태그의 name 속성은 클라우드 플랫폼 내에서 유일하도록 설정한다.
-->
<availability name="MSTR_AVAILABILITY" repeat-interval="100000">
<!--
메소드는 현재 HTTP와 SHELL 형식이 지원된다. 이 두 값중의 하나를 반드시 사용해야 한다.
메소드가 HTTP인 경우 command 항목에 하나의 파라미터를 가지며, http 호출이어야 한다.
<command>
<param>http://xxx.xxx.xxx.xxx:8080/sdscloud/index.jsp</param>
</command>
메소드가 SHELL일 경우 MS-Windows의 경우 아래의 같이 cmd /c 옵션을 각 파라미터 값을 사용한다.
<command>
<param>cmd</param>
<param>/c</param>
<param>tasklist /FI "IMAGENAME eq eclipse*"</param>
</command>
메소드가 SHELL이며 Unix계열인 경우 아래와 같은 유닉스 쉘을 사용하도록 한다.
<command>
<param>sh</param>
<param>-c</param>
<param>ps -ef | grep java</param>
</command>
-->
<method>HTTP</method>
<!--
HTTP 메소드일 경우 command param의 첫번째 항목에 체크해야 할 URL을 명시하도록 한다.
아래의 param URL을 repeat-interval에 의하여 주기적으로 가용성 체크를 시도한다.
-->
<command>
<param>http://xxx.xxx.xxx.xxx:8080/cloud/index.jsp</param>
</command>
<!--
호출의 결과값으로 반드시 포함되어 있어야 하는 문자열 값을 명시한다.
-->
<validation-string></validation-string>
<!--
메소드 호출시 응답 대기 시간을 밀리초 단위로 설정한다. 만약 3초 이내에 응답이 안 올 경우
가용성에 문제가 있는 것으로 인식한다.
-->
<timeout>3000</timeout>
<!--
어떤 서비스 제공자의 서비스를 모니터링하고 있는지 기술한다. 안타깝게도 웹 플랫폼에서
제공하는 서비스 제공자의 아이디 값을 자동으로 얻어올 수 없기 때문에 service-id는
데이터베이스의 M_SVC_TBL에서 조회한 후 아래에 기술해 주어야만 한다.
이후 server-name, server-version, server-install-path, metadata-name등은
모니터링하는 서버의 항목을 기술하도록 한다.
-->
<provider service-id="2"
server-name="JBoss Web Server"
server-version="5.0"
server-install-path=""
server-vendor="Red Hat"
metadata-name="MSTR_AVAILABILITY"
is-local="false">
</provider>
</availability>
<availability name="APACHE_AVAILABILITY" repeat-interval="100000">
<method>SHELL</method>
<!-- for windows -->
<command>
<param>cmd</param>
<param>/c</param>
<param>tasklist /FI "IMAGENAME eq eclipse*"</param>
</command>
<!-- for linux -->
<!--
<command>
<param>sh</param>
<param>-c</param>
<param>ps -ef | grep java</param>
</command>
-->
<validation-string></validation-string>
<timeout>3000</timeout>
<provider service-id="2"
server-name="MSTR_APACHE"
server-version="5.0"
server-install-path=""
server-vendor="Apache Foundation"
metadata-name="APACHE_WEB_AVAIL"
is-local="false">
</provider>
</availability>
<!--
collector는 서비스 제공자가 남기는 실제 모니터링 데이터를 추출해오는 데 사용된다.
collector는 복수개의 provider 정보를 가질 수 있으며, 대부분의 서비스 제공자
로그가 파일 또는 데이터베이스에 남기 때문에 provider 태그는 파일과 DB 둘 중의 하나로 결정된다.
-->
<collector name="PLATFORM_COLLECTOR" repeat-interval="180000">
<!--
서비스 제공자의 모니터링 데이터를 데이터베이스에서 추출해올 경우 적용 클래스는
"com.athena.sysmon.job.CommonDatabaseJob" 클래스이다.
이 때 데이터베이스에 대한 접속이 미리 이루어져 있어야 하므로 위에서 기술한
data-source-name을 설정하도록 한다.
또한 이때의 extrace-type은 DB로 설정하도록 한다.
use-datalist속성은 추출된 데이터를 테이블 형태로 볼 것인지 여부를 결정하는 데 사용한다.
true로 설정되어 있다면 추출된 실제 데이터를 그대로 웹 화면에서 테이블 형태로 볼 수 있다.
-->
<provider class="com.athena.sysmon.job.CommonDatabaseJob"
service-id="2"
data-source-name="jdbc/platform"
server-name="PLATFORM"
server-version="1.0"
server-install-path=""
server-vendor="SAMSUNG SDS"
metadata-name="TENANT_USER_CNT"
extract-type="DB"
use-datalist="false"
is-local="false"
use-tenant-list="true">
<!--
데이터베이스 추출에 필요한 쿼리를 설정한다.
-->
<query>
SELECT TENANT_ID, USER_CNT FROM V_SVC_TENANT_VIEW WHERE SVC_ID = 2
</query>
<!--
데이터베이스에서 추출된 컬럼 데이터중 미터링으로 사용될 데이터에 대한
설정을 billable 태그로 복수개 설정하는 것이 가능하다.
-->
<billable name="USER_CNT" type="int" method="sum" />
</provider>
<provider class="com.athena.sysmon.job.CommonDatabaseJob"
service-id="2"
data-source-name="jdbc/platform"
server-name="PLATFORM"
server-version="1.0"
server-install-path=""
server-vendor="SAMSUNG SDS"
metadata-name="LOGIN_CNT"
extract-type="DB"
use-datalist="false"
is-local="false"
use-tenant-list="true">
<query>
SELECT TENANT_ID, TOTAL_ACCESS_CNT FROM V_TENANT_LOGIN_CNT_VIEW
</query>
<billable name="TOTAL_ACCESS_CNT" type="int" method="sum" />
</provider>
<!-- 서비스별 계약 건수 -->
<provider class="com.athena.sysmon.job.CommonDatabaseJob"
service-id="2"
data-source-name="jdbc/platform"
server-name="PLATFORM"
server-version="1.0"
server-install-path=""
server-vendor="SAMSUNG SDS"
metadata-name="SVC_COUNT"
extract-type="DB"
use-datalist="false"
is-local="false"
use-tenant-list="false">
<query>
SELECT COUNT(SVC_ID) AS SVC_COUNT from V_RUN_USVC_CONTRACT_TBL
WHERE SVC_ID = 2
</query>
<billable name="SVC_COUNT" type="int" method="sum" />
</provider>
</collector>
<collector name="INFO_COLLECTOR" repeat-interval="180000">
<!-- Service ID 2 is BI Service -->
<provider class="com.athena.sysmon.job.CommonDatabaseJob"
service-id="2"
data-source-name="jdbc/informatica"
server-name="INFORMATICA"
server-version="1.0"
server-install-path=""
server-vendor="INFORMATICA"
metadata-name="C_INFOM_SESSION1"
extract-type="DB"
use-datalist="true"
is-local="false">
<query base-time-field="END_TIME">
SELECT
COMP_ID TENANT_ID,
SUBJECT_NAME,
SESSION_NAME,
SUCCESSFUL_ROWS,
FAILED_ROWS,
LAST_ERROR,
LAST_ERROR_CODE,
START_TIME,
END_TIME,
'RED HAT' TENANT
FROM
A_SESSION_LOG
WHERE #range_expression#
ORDER BY END_TIME
</query>
<billable name="SUCCESSFUL_ROWS" type="int" method="sum" />
<billable name="FAILED_ROWS" type="int" method="avg" />
</provider>
<!--
서비스 제공자 모니터링 대상이 디스크에 기록되는 파일일 경우
"com.athena.sysmon.job.CommonFileJob" 클래스를 설정하여 정보를 추출한다.
이 때 extract-type은 "FILE"로 기술해줘야 하며, 이 때 기술된 data-source-name은
물리적인 파일의 위치를 기술해줘야 한다.
또한 파일의 경우 각 필드를 구분할 수 있는 구분자 값을 delimeter속성에 기본적으로
입력해주어야 한다.
-->
<provider class="com.athena.sysmon.job.CommonFileJob"
service-id="2"
data-source-name="C:\SamsungPoc\httpd-2.2\logs\access_log"
server-name="Apache"
server-version="2.2"
server-install-path="C:\SamsungPoc\httpd-2.2"
server-vendor="Apache"
metadata-name="Apache Access Log"
extract-type="FILE"
is-local="false"
line-unit="3">
<!--
field-map을 구분자에 의해서 잘려진 각 데이터가 표시하는 정보를 나타낸다.
아래의 필드값을 컨트롤러의 각 항목의 메타데이터로 표시되어지며,
tail 이벤트에 의해 추출된 데이터 값이 파싱되어 컨트롤러 측으로 전송된다.
추출된 데이터가 컨트롤러로 전송될 필요가 없다면 ignore 속성을 true로 한다.
ignore 속성이 true이면 파싱된 필드는 서버로 전송되지 않는다.
-->
<regular-expresssion>
<![CDATA[^([\d.]+) (\S+) (\S+) \[([\w:/]+\s[+\-]\d{4})\] "(.+?)" (\d{3}) (\d+)]]>
</regular-expresssion>
<field-map>
<field name="IP_ADDRESS" type="String"/>
<field name="IDENT" type="String" ignore="true"/>
<field name="WHAT" type="String" ignore="true"/>
<field name="REQUEST_TIME" type="String"/>
<field name="LOCALE" type="String"/>
<field name="METHOD" type="String"/>
<field name="URL" type="String"/>
<field name="HTTP_VERSION" type="String" ignore="true"/>
<field name="RESPONSE_CODE" type="String"/>
<field name="RESPOSNE_BYTES" type="int"/>
</field-map>
</provider>
</collector>
</sys-mon>