Gentle Breeze

Technical Service <6> Query Service 본문

⑦ IFSS 방법론/IFSS 기초(개발자)

Technical Service <6> Query Service

재령 2008. 10. 8. 13:38
* 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 를 이용한 검색시 유용)
Comments