Notice
Recent Posts
Recent Comments
Gentle Breeze
Technical Service <6> Query Service 본문
* Query Service
- 정의 : 쿼리문이나 객체의 입력만으로 DB 데이터 조작을 가능하게 하는 기능을 제공
- 특징 : DataSource Service 기반 (Connection 을 위해)
Mapping XML 파일 정의가 복잡하지만 tool을 이용하면 편리하게 정의 가능
Table Mapping 및 사용할 쿼리를 정의한 매핑 XML 파일을 이용
SQL 문을 Dynamic 하게 정의하여 이용 → 동적 Query를 지원 (eg : 하나의 select 문을 재사용)
- QueryServiceImpl 객체는 PagingJdbcTemplate 객체와 의존관계
PagingJdbcTemplate 객체는 dataSource 객체와 의존관계
- <filename> : iBatis Mapping File이 정의 - 특정 테이블과 VO 클래스를 Mapping
- <nullcheck> : 빈 문자열 - Data 값이 null 일 경우 빈 문자열로 치환
- <sqlload dynamic="true" frequency="n" /> : n초마다 Mapping File을 다시 Loading
- <skiperror> : Query에서 발생되는 error를 skip
- 기본 속성 정의는 한 번 지정된 후 수정하지 않고 Mapping File만 추가시켜 사용함
- 예시 (table-mapping 이용)
* queryservice.xml
<bean name="queryService" class="systemier.services.queryservice.impl.QueryServiceImpl">
<property name="jdbcTemplate">
<ref bean="jdbcTemplate"/>
</property>
<config:configuration>
<filename>classpath:sql/mapping-user-userservice.xml</filename>
<nullcheck type="VARCHAR" default-value=""/>
<sqlload dynamic="false" frequency="5"/>
<skiperror>true</skiperror>
</config:configuration>
</bean>
* mapping-user-userservice.xml
<queryservice>
<table-mapping>
<!-- 회원 테이블과 클래스 UserVO 매핑 -->
<table name="USERS"
class="integration.systemier.services.query.vo.UserVO">
<field-mapping>
<dbms-column>USER_ID</dbms-column>
<class-attribute>userId</class-attribute>
</field-mapping>
<field-mapping>
<dbms-column>USER_NAME</dbms-column>
<class-attribute>userName</class-attribute>
</field-mapping>
<field-mapping>
<dbms-column>PASSWORD</dbms-column>
<class-attribute>password</class-attribute>
</field-mapping>
<field-mapping>
<dbms-column>SSN</dbms-column>
<class-attribute>ssn</class-attribute>
</field-mapping>
.....
<primary-key> // PK 지정
<dbms-column>USER_ID</dbms-column>
</primary-key>
</table>
</table-mapping>
<queries>
<!-- Query : 검색 조건에 기반하여 회원 목록 조회 -->
<query id="getUserList" isDynamic="false"> //동적 쿼리가 아니일 경우 반드시 isDynamic을 false!
//id 값은 일반적으로 메소드 이름과 동일하게 사용
<statement>
SELECT USER_ID, USER_NAME, PASSWORD
FROM USERS
WHERE USER_ID like ?
</statement>
<param type="VARCHAR"/>
<result class="integration.systemier.services.query.vo.UserVO" />
</query>
<!-- Query : 신규 회원 등록 -->
<query id="addUser" isDynamic="false">
<statement>
INSERT INTO USERS
(USER_ID, USER_NAME, PASSWORD)
VALUES (?, ?, ?)
</statement>
<param type="VARCHAR" /> //쿼리의 ? 에 바인딩 되는 파라미터 (순서가 중요)
<param type="VARCHAR" />
<param type="VARCHAR" />
</query>
</queries>
</queryservice>
- Table-Mapping
Query 정의 시 일반적인 경우 Arraylist 가 HashMap 형태로 return 되어 구현시 불편한 점이 많이 활용도 낮음
table-mapping 을 이용할 경우 VO 객체를 여러개 생성 후 ArrayList 에 넣어서 return 되므로 편리
단, table-mapping 을 사용하기 위해서는 먼저 table 에 data 를 mapping 한 뒤 쿼리 statement 아래에
<result class="VO 클래스 경로"> 를 지정 해 주어야 함
- Result-Mapping
Table-Mapping 을 하지 않았을 경우로 출력하고자 하는 data 의 수가 한정된 소량의 data 이거나 table 을
join 할 경우 해당 결과에 대한 VO 가 이미 생성되어 있지 않으므로 <result-mapping> 을 이용하여 <result>의
하위 항목으로 결과값의 Column 과 변수를 Mapping 하는 방법
- Dynamic Query
Dynamic Query 인 경우 Query 에 BIND 변수를 이용하여 쿼리를 완성하고 변수를 설정해 주는 방법과
치환 문자열 키에 상응하는 값을 setting 하여 쿼리를 완성하는 방법,
#if ($파라미터) ~ #else ~ #end 의 조건 분기 처리를 이용하는 방법 등이 있다. (LIKE 를 이용한 검색시 유용)
- 정의 : 쿼리문이나 객체의 입력만으로 DB 데이터 조작을 가능하게 하는 기능을 제공
- 특징 : DataSource Service 기반 (Connection 을 위해)
Mapping XML 파일 정의가 복잡하지만 tool을 이용하면 편리하게 정의 가능
Table Mapping 및 사용할 쿼리를 정의한 매핑 XML 파일을 이용
SQL 문을 Dynamic 하게 정의하여 이용 → 동적 Query를 지원 (eg : 하나의 select 문을 재사용)
- QueryServiceImpl 객체는 PagingJdbcTemplate 객체와 의존관계
PagingJdbcTemplate 객체는 dataSource 객체와 의존관계
- <filename> : iBatis Mapping File이 정의 - 특정 테이블과 VO 클래스를 Mapping
- <nullcheck> : 빈 문자열 - Data 값이 null 일 경우 빈 문자열로 치환
- <sqlload dynamic="true" frequency="n" /> : n초마다 Mapping File을 다시 Loading
- <skiperror> : Query에서 발생되는 error를 skip
- 기본 속성 정의는 한 번 지정된 후 수정하지 않고 Mapping File만 추가시켜 사용함
- 예시 (table-mapping 이용)
* queryservice.xml
<bean name="queryService" class="systemier.services.queryservice.impl.QueryServiceImpl">
<property name="jdbcTemplate">
<ref bean="jdbcTemplate"/>
</property>
<config:configuration>
<filename>classpath:sql/mapping-user-userservice.xml</filename>
<nullcheck type="VARCHAR" default-value=""/>
<sqlload dynamic="false" frequency="5"/>
<skiperror>true</skiperror>
</config:configuration>
</bean>
* mapping-user-userservice.xml
<queryservice>
<table-mapping>
<!-- 회원 테이블과 클래스 UserVO 매핑 -->
<table name="USERS"
class="integration.systemier.services.query.vo.UserVO">
<field-mapping>
<dbms-column>USER_ID</dbms-column>
<class-attribute>userId</class-attribute>
</field-mapping>
<field-mapping>
<dbms-column>USER_NAME</dbms-column>
<class-attribute>userName</class-attribute>
</field-mapping>
<field-mapping>
<dbms-column>PASSWORD</dbms-column>
<class-attribute>password</class-attribute>
</field-mapping>
<field-mapping>
<dbms-column>SSN</dbms-column>
<class-attribute>ssn</class-attribute>
</field-mapping>
.....
<primary-key> // PK 지정
<dbms-column>USER_ID</dbms-column>
</primary-key>
</table>
</table-mapping>
<queries>
<!-- Query : 검색 조건에 기반하여 회원 목록 조회 -->
<query id="getUserList" isDynamic="false"> //동적 쿼리가 아니일 경우 반드시 isDynamic을 false!
//id 값은 일반적으로 메소드 이름과 동일하게 사용
<statement>
SELECT USER_ID, USER_NAME, PASSWORD
FROM USERS
WHERE USER_ID like ?
</statement>
<param type="VARCHAR"/>
<result class="integration.systemier.services.query.vo.UserVO" />
</query>
<!-- Query : 신규 회원 등록 -->
<query id="addUser" isDynamic="false">
<statement>
INSERT INTO USERS
(USER_ID, USER_NAME, PASSWORD)
VALUES (?, ?, ?)
</statement>
<param type="VARCHAR" /> //쿼리의 ? 에 바인딩 되는 파라미터 (순서가 중요)
<param type="VARCHAR" />
<param type="VARCHAR" />
</query>
</queries>
</queryservice>
- Table-Mapping
Query 정의 시 일반적인 경우 Arraylist 가 HashMap 형태로 return 되어 구현시 불편한 점이 많이 활용도 낮음
table-mapping 을 이용할 경우 VO 객체를 여러개 생성 후 ArrayList 에 넣어서 return 되므로 편리
단, table-mapping 을 사용하기 위해서는 먼저 table 에 data 를 mapping 한 뒤 쿼리 statement 아래에
<result class="VO 클래스 경로"> 를 지정 해 주어야 함
- Result-Mapping
Table-Mapping 을 하지 않았을 경우로 출력하고자 하는 data 의 수가 한정된 소량의 data 이거나 table 을
join 할 경우 해당 결과에 대한 VO 가 이미 생성되어 있지 않으므로 <result-mapping> 을 이용하여 <result>의
하위 항목으로 결과값의 Column 과 변수를 Mapping 하는 방법
- Dynamic Query
Dynamic Query 인 경우 Query 에 BIND 변수를 이용하여 쿼리를 완성하고 변수를 설정해 주는 방법과
치환 문자열 키에 상응하는 값을 setting 하여 쿼리를 완성하는 방법,
#if ($파라미터) ~ #else ~ #end 의 조건 분기 처리를 이용하는 방법 등이 있다. (LIKE 를 이용한 검색시 유용)
'⑦ IFSS 방법론 > IFSS 기초(개발자)' 카테고리의 다른 글
Supporting Tools <2> DBIO (0) | 2008.10.09 |
---|---|
Supporting Tools <1> Code/Conf Gen (0) | 2008.10.09 |
Technical Service <5> IdGeneration Service (0) | 2008.10.08 |
Technical Service <4> DataSource Service (0) | 2008.10.08 |
Technical Service <3> Properties Service (0) | 2008.10.08 |
Comments