본 장에서는 Anyframe Query Manager를 활용하여 Query XML 파일을 생성하고, 해당 Query XML 파일에 원하는 Query를 추가/변경/활용/삭제하는 방법에 대해 알아본다. 이를 위해 Query Editor 및 Query Wizard 등을 통한 Query 추가/수정에 대해 살펴보고, Content Assist를 이용한 Query 활용방법에 대해서도 살펴본다.
사용자는 새로운 Query 맵핑 XML 파일을 Eclipse 메뉴 혹은 Context Menu를 통해 생성할 수 있다.
Eclipse 메뉴를 통해서 열기
"File > New > SQL XML File" 선택
Context Menu를 통해서 열기
Eclipse Package Explorer 등에서 Context Menu의 "New > SQL XML File" 선택
새로운 Query 맵핑 XML 파일을 생성할 때에는 다음과 같은 사항을 확인한다.
Eclipse 프로젝트 및 폴더 이름을 확인한다. 지정된 위치에 Query 맵핑 XML 파일이 생성된다.
Query 맵핑 XML 파일의 확장자는 반드시 ".xml"이어야 한다.
고유한 파일이름을 부여했는 지 확인한다. Query 맵핑 XML 파일의 이름은 지정된 프로젝트 및 폴더 내에서 고유해야 하며, 해당 사항은 파일 생성 시 자동으로 검증된다.

Query 맵핑 XML 파일에 Query를 추가하는 방법은 크게 두가지가 있다.
숙련된 사용자의 경우, Query Manager Editor에서 직접 Query를 작성하는 것이 더욱 편리하고 빠를 수 있으나, 관련된 내용을 일일이 확인하고 별도의 테스트를 수행해야 하므로 오류의 위험이 다소 존재한다. Query Wizard를 활용할 경우에는 매 Query 작성 시 마다 Query Wizard를 실행시켜 작성해야 하므로, 일정 기간이 지나면 번거로움을 느낄 수 있다. 그러므로, Anyframe Query Manager를 활용할 경우, 개발의 초반부 어느 정도의 Query문 작성 때까지는 Query Wizard를 활용하고, 이후 Query 작성이 패턴화되어 기존의 Query를 Copy and Paste하여도 큰 무리가 없다고 판단되면 직접작성하는 것을 권장한다.Query Wizard를 통한 Query문 작성은 데이터베이스/테이블/컬럼 등의 정보를 GUI를 통해 마우스 조작으로 입력할 수 있고, 작성하고 있는 Query문을 Query Wizard를 종료하지 않고서도 테스트해 볼 수 있는 장점이 있다. 또한, Anyframe Core의 Query Service에서 제공하는 각종 Mapping 방법 및 VO(Value Object), DAO(Data Access Object) 등의 코드를 자동생성할 수 있는 기능을 제공한다.
Query Wizrd를 활용하여 Query문을 작성하는 절차는 다음과 같다.
Query Wizard 실행
Query Wizard는 Query Manager Editor의 Design 탭 및 Source 탭에서 모두 실행이 가능하며, <queryservice> 태그에서 Context Menu를 통해 실행한다.
Design 탭에서 Query Wizard 실행하기

Source 탭에서 Query Wizard 실행하기
Source 탭에서 Query Wizard를 실행하기 위해서는 아래 화면과 같이 <queryservice> , <queries> 등의 태그 이름을 마우스 더블클릭 등으로 선택(하이라이트 반전)한 후 Context Menu를 통해 Add Query를 선택한다.

Query문 작성 및 테스트
Query를 작성하기 위해 Query ID, Query문 등을 입력하고 작성한 Query문을 테스트하면, "Finish" 버튼을 눌러 Query Wizard를 완료시켜 Query 맵핑 XML파일에 Query문을 추가할 수 있고, 추가적으로 VO/DAO를 생성하기 위해 다음단계로 넘어갈 수도 있다.

Query ID를 부여할 때에는 고유한 Query ID를 부여해야 하며, 그렇지 않을 경우 Query Wizard에서 오류메시지를 제공한다. Query문을 작성할 때에는 "Query Statement" 텍스트필드에 Query문을 작성하며, 테이블명이나 컬럼명 등은 우측의 "Database Browser"의 해당 테이블명 혹은 컬럼명을 더블클릭하면 자동으로 Query문 작성영역에 입력된다.
Dynamic Query를 작성할 경우, "Input Parameter Information"의 "Get Parameters" 버튼을 클릭하여 Query문의 변수와 동기화를 시킬 수 있으며, Velocity 문법을 활용한 Dynamic Query일 경우에는 "Dynamic Query" 체크박스가 자동으로 체크된다.
Query문 작성이 완료되면 적절한 테스트값을 부여하여 Query문을 테스트한다. 이 때 테스트 결과는 Query Results View 에 나타나며, 데이터 개수가 많을 경우에는 "Row Limit"의 값을 변경시켜 출력개수를 적절하게 조절할 수 있다.
Query문을 Query 맵핑 XML 파일에 생성하기 할 때 맵핑 정보를 추가할 때에는, Query Wizard 하단의 "Mapping" 카테고리의 체크박스와 라디오버튼을 조작하여 다음과 같은 4가지 맵핑 조건에 따른 Query문을 생성할 수 있다.
이상의 조건들에 따른 Query Wizard의 흐름을 도식화하면 다음과 같다.

참고로, 카멜케이스를 따르는 변수명 지정을 위해서는 "camelCase Option" 체크박스를 선택하며, 위와 같은 조건을 만족하는 VO 및 DAO를 생성하고자할 때에는 "Generate VO/DAO" 체크박스를 선택한 후 다음 단계로 진행한다.
Query Wizard에서는 사용자에게 자유도를 부여하기 위해 해당 기능을 강제하지는 않으나, Anyframe Core의 Query Service에서는 해당 맵핑 방식의 경우, 기본적으로 테이블의 컬럼명을 카멜케이스화한 것으로 맵핑하는 것을 가정하고 동작하므로, 카멜케이스를 지정하지 않을 경우, 의도하지 않은 오류가 발생할 수 있다.
맵핑 정보를 수록하지 않고, Anyframe Core의 Query Service가 자체적으로 Map을 통해 정보를 얻도록 하는 방법
"Do Mapping" 체크박스를 선택하지 않는다.
Result Class만을 지정하여 Anyframe Core의 Query Service가 맵핑정보를 얻도록 하는 방법
"Do Mapping" 체크박스를 선택하고, "With result class only" 라디오버튼을 선택한다.
Result Class와 Table Mapping 정보를 통해 Anyframe Core의 Query Service가 맵핑정보를 얻도록 하는 방법
"Do Mapping" 체크박스를 선택하고, "With table mapping" 라디오버튼을 선택한다.
☞ 만약 Query 작성을 하지 않고 Table Mapping 정보만을 생성하고자 한다면, Table Mapping Wizard 를 활용하도록 한다.
Result Class와 Result Mapping 정보를 통해 Anyframe Core의 Query Service가 맵핑정보를 얻도록 하는 방법
"Do Mapping" 체크박스를 선택하고, "With result mapping" 라디오버튼을 선택한다.
VO 및 DAO 생성
앞단계에서 "Generate VO/DAO" 체크박스를 선택하고 다음 단계로 진행했을 경우, VO 및 DAO를 생성하기 위한 화면이 나타난다.

기존에 작성한 VO를 활용하고자 할 때에는 "VO Exists" 체크박스를 선택하여 기존의 VO를 검색하여 지정하며, 신규로 작성하고자할 때에는 패키지명과 폴더명을 선택하여 지정할 수 있다.

VO 및 DAO 이름을 부여할 때 고유한 이름을 부여해야 하며, 기존에 존재하는 이름을 부여하였을 경우에는 코드 생성 중 기존 파일을 대체할 것인지를 묻는 경고창이 뜬다. 또한, 다른 Eclipse 파일 생성관련 Wizard와 마찬가지로 확장자를 부여하지 않아도 되지만, 만약 확장자를 부여할 경우에는 .java로 지정하도록 한다. 그 밖의 경우에는 오류 경고가 뜬다.
VO 및 DAO의 생성을 위한 정보입력을 마친 후 "Finish" 버튼을 눌러 Query Wizard를 완료시키면, "Progress Inforamtion"이 수초 정도(작업의 복잡도 및 사용자의 시스템 사양에 따라 다름) 나타난 후 생성한 코드들이 Eclipse의 Editor에서 자동으로 열린다.

Query Wizard를 통해 Query 맵핑 XML에 해당 Query문이 추가되며, 사용자가 "Generate VO/DAO" 체크박스 선택을 통해 Query Wizard의 두번째 단계로 진행했을 경우에는 VO 혹은 DAO 등이 추가로 생성된다. 이러한 코드들은 Query Wizard가 정상적으로 종료되면 자동으로 Eclipse의 Editor에서 열리므로, 사용자가 손쉽게 확인할 수 있다.
Query Wizard를 통해서 생성한 query가 포함된 Query 맵핑 XML 파일은 Query Wizard 종료 후 저장되지 않은 상태이므로, Query Wizard 종료 후 사용자가 반드시 해당 파일을 저장해야 한다. 저장하지 않을 경우, 해당 정보를 잃을 수도 있으며 관련 query를 활용하는 DAO 등에서 "존재하지 않는 query" 로 오류 표식이 표시될 수 있다.

비록 GUI 환경의 이점을 살릴 수는 없지만, 숙달된 사용자나 재사용할 수 있는 Query문이 어느정도 이상 축적되었을 경우에는 Query Manager Editor를 활용한 Query문의 직접 작성이 작업의 효율을 더욱 높일 수 있다. 또한, Query Manager Editor는 Content Assist를 통해 Query 맵핑 XML의 DTD에 정의된 각종 태그 및 어트리뷰트 등을 제공하므로, 기존 Query문에 대한 손쉬운 응용 및 개선이 가능하다.
Query 맵핑 XML의 구조, 각 태그 및 어트리뷰트에 대한 상세설명은 Anyframe Core 매뉴얼의 Query Service 부분을 참고한다.
다만, Query Navigator에 서 제공하는 고급검색기능(Query Navigator > More) 중 일부 조건들의 경우, Query Wizard를 통해서 생성되는 주석문을 참고하므로, 해당 기능을 활용하고자 할 경우에는 다음과 같은 주석문을 해당 Query문의 <query> 태그 바로 다음에 추가하도록 한다. 본 주석문에 대한 보다 자세한 내용은 "Query Wizard가 생성하는 주석정보"를 참고한다. <!-- @date.created 2009/01/12 08:00:00 @date.modified 2009/01/12 17:00:00 @author Jihwan Rhie -->
Query 맵핑 XML 파일에 존재하는 기존의 Query를 수정하는 방법은 크게 두가지가 있다.
Query Wizard를 통한 Query문 수정은 Query 맵핑 XML 파일의 Design 탭 혹은 Source 탭에서 <query> 태그의 Query ID를 선택하고 Context Menu를 통해 실행한다. 실행된 Query Wizard에서 Query문을 수정할 때에는 Query Wizard를 활용한 Query문 추가 와 동일한 방법을 따른다.

Query Manager Editor를 통한 Query문 수정은 기존의 Query문을 편집한다는 점만 제외하고는 새로운 Query문을 추가하는 것과 동일한 방법을 따른다. 보다 자세한 사항은 Query Manager Editor를 활용한 Query문 추가 를 참고한다.
Query 맵핑 XML 파일에 존재하는 기존의 Query를 삭제하는 방법은 크게 두가지가 있다.
Context Menu를 통해서 Query문을 삭제하고자 할 때에는 Query Manager Editor의 Design탭에서 해당 Query를 선택하고, Context Menu의 "Remove"를 실행한다.

Query문을 직접 삭제하고자 할 때에는 Query Manager Editor의 Source 탭에서 해당하는 Query를 선택한 후 삭제한다. 이때, 선택할 범위는 삭제하고자 하는 Query문이 포함된 <query>와 </query> 로 묶인 범위이다.

Anyframe Query Manager는 Content Assist 기능을 제공함으로써 사용자가 보다 편리하고 빠르게 Query문을 편집하고 활용할 수 있도록 한다. 사용자는 Eclipse의 다른 Content Assist와 동일하게 키보드 단축키(기본값으로 Ctrl+Space)를 통해 Anyframe Query Manager의 Content Assist가 제공하는 기능을 활용할 수 있다.
Content Assist의 환경설정은 Eclipse Preferences의 "Java > Editor > Content Assist > Advanced"에서 설정하며, Anyframe Query Manager의 Content Assist가 단축키의 호출대상이 될 지의 여부를 정한다.

Eclipse Java Editor에서 Anyframe Core의 Query Service를 활용한 DAO(IQueryService를 활용하거나 AbstractDAO를 상속받았을 때)에 대하여 Content Assist가 Query ID에 대한 후보목록을 보여준다. 이 기능은 Query Service의 메소드가 인자로 받는 Query ID(String 타입으로 " "로 묶인 부분) 입력부분에서 키보드 단축키를 통해 Content Assist를 호출했을 때 제공된다.

해당하는 메소드가 AbstractDAO로 부터 상속받는 create(), findByPk(), findListWithPaging(), update(), remove() 등일 경우, Anyframe Query Manager의 Preferences 에서 정의한 prefix와 suffix 규칙을 따르는 Query문만 Content Assist를 통해 조회된다.
Anyframe Query Manager의 Query Manager Editor의 Source 탭에서 Query 편집 시Query 맵핑 XML의 태그 및 어트리뷰트에 대한 후보목록을 보여준다.

Anyframe Query Manager는 Context Menu를 통해 DAO와 관련된 Query문이나 Query문과 관련된 VO를 손쉽게 찾아서 열 수 있는 기능을 제공한다.
DAO에서 사용하는 특정 Query문의 내용을 확인하고 싶을 때, Query 맵핑 XML 파일이 너무 많거나 Query문이 너무 많다면 해당 Query문이 어디에 있는 지 알기 어려울 수 있다. 이를 위해 Anyframe Query Manager는 Context Menu를 통해서 해당 Query문을 바로 열 수 있는 기능을 제공한다.
본 기능을 활용하는 방법은 다음과 같다.
DAO에서 활용하고 있는 Query문 중 바로 열고자 하는 Query ID를 마우스 더블클릭 등을 통해 선택하여 반전(하이라이트)시킨 후, Context Menu에서 "Open Query in Query Manager Editor"를 선택한다.

바로 열고자 선택한 Query ID가 Query Manager Editor를 통해 열리고, 해당 Query ID가 반전되어 있는 것을 확인할 수 있다.

Query문에서 사용하는 특정 VO의 내용을 확인하고 싶을 때, VO가 너무 많거나 하여 해당 VO를 찾아가기 번거로울 수 있다. 이를 위해 Anyframe Query Manager는 Context Menu를 통해서 해당 VO를 바로 열 수 있는 기능을 제공한다.
본 기능을 활용하는 방법은 다음과 같다.
Query문에서 활용하고 있는 VO를 마우스 더블클릭 등을 통해 선택하여 반전(하이라이트)시킨 후, Context Menu에서 "Open Class in Java Editor"를 선택한다.

바로 열고자 선택한 Query ID가 Java Editor를 통해 열린다.
