![]() | ||
![]() |
2008년 3월호 | ![]() |
|
![]() |
![]() | ||
![]() |
2008년 3월호 | ![]() |
|
![]() |
실무에서 SQL문을 작성하다 보면 동적인 쿼리문 작성을 작성해야 할 때가 많이 있다.
이때 지겹게 if~else if 문을 통해 아주 지저분한 소스 코드를 생성할 때가 왕왕 있게 마련이다.
이때 ibatis에서는 아주 깔금하게 구현할 수 있는 방법을 제공해 준다.
<statement id="dynamicGetAccountList" resultMap="account-result">
select * from account
<dynamic prepend="WHERE">
<isNotNull prepend="AND" property="firstName">
(acc_first_name = #firstName#
<isNotNull prepend="OR" property="lastName">
acc_last_name = #lastName#
</isNotNull>
)
</isNotNull>
<isNotNull prepend="AND" property="emailAddress">
acc_email like #emailAddress#
</isNotNull>
<isGreaterThan prepend="AND" property="id" campareValue="0">
acc_id = #id#
</isGreaterThan>
</dynamic>
order by acc_last_name
</statement>
상황에 의존적인 위 동적 statement로 부터 각각 다른 16가지의 SQL문이 생성될 수 있다. if-else구조와 문자열 연결을 코딩하는 경우 수백라인이 필요할 수도 있다.
동적 statement를 사용하는 것은 몇몇 조건적인 태그를 추가하는 것처럼 간단하게 작성할 수 있다.
이러한 조건들에 대해 간단히 정리하면 아래와 같다.
바이너리 조건 요소-바이너리 조건 요소는 정적값 또는 다른 프로퍼티값을 위한 프로퍼티값과 비교한다. 만약 결과가 true라면 몸체부분의 SQL쿼리가 포함된다.
바이너리 조건 속성
prepend |
Statement에 붙을 오버라이딩 가능한 SQL부분(옵션) |
property |
비교되는 property(필수) |
compareProperty |
비교되는 다른 property (필수 또는 compareValue) |
compareValue |
비교되는 값(필수 또는 compareProperty) |
<isEqual> |
프로퍼티가 값 또는 다른 프로퍼티가 같은지 체크 |
<isNotEqual> |
프로퍼티가 값 또는 다른 프로퍼티가 같지 않은지 체크 |
<isGreaterThan> |
프로퍼티가 값 또는 다른 프로퍼티 보다 큰지 체크 |
<isGreaterEqual> |
프로퍼티가 값 또는 다른 프로퍼티 보다 크거나 같은지 체크 |
<isLessThan> |
프로퍼티가 값 또는 다른 프로퍼티 보다 작은지 체크 |
<isLessEqual> |
프로퍼티가 값 또는 다른 프로퍼티 보다 작거나 같은지 체크
사용법 예제) <isLessEqual prepend="AND" property="age" compareValue="18"> ADOLESCENT = 'TRUE' </isLessEqual> |
단일 조건 요소-단일 조건 요소는 특수한 조건을 위해 프로퍼티의 상태를 체크한다.
prepend statement에 붙을 오버라이딩 가능한 SQL부분(옵션) property 체크하기 위한 프로퍼티(필수)
<isPropertyAvailable> |
프로퍼티가 유효한지 체크 (이를 테면 파라미터의 프로퍼티이다.) |
<isNotPropertyAvailable> |
프로퍼티가 유효하지 않은지 체크 (이를 테면 파라미터의 프로퍼티가 아니다.) |
<isNull> |
프로퍼티가 null인지 체크 |
<isNotNull> |
프로퍼티가 null이 아닌지 체크 |
<isEmpty> |
Collection, 문자열 또는 String.valueOf() 프로퍼티가 null이거나 empty(“” or size() < 1)인지 체크 |
<isNotEmpty> |
Collection, 문자열 또는 String.valueOf() 프로퍼티가 null 이아니거나 empty(“” or size() < 1)가 아닌지 체크
사용법 예제) <isNotEmpty prepend="AND" property="firstName"> FIRST_NAME = #firstName# </isNotEmpty> |
다른 요소들
Parameter Present : 파라미터 객체가 존재하는지 체크
Parameter Present Attributes : prepend - the statement에 붙을 오버라이딩 가능한 SQL부분
<isParameterPresent> |
파라미터 객체가 존재(not null)하는지 체크 |
<isNotParameterPresent> |
파라미터 객체가 존재하지(null) 않는지 체크
사용법 예제) <isNotParameterPresent prepend="AND"> EMPLOYEE_TYPE = 'DEFAULT' </isNotParameterPresent> |
Iterate : 이 태그는 Collection을 반복하거나 리스트내 각각을 위해 몸체 부분을 반복한다.
Iterate Attributes :
prepend - the statement에 붙을 오버라이딩 가능한 SQL부분 (옵션)
property - 반복되기 위한 java.util.List타입의 프로퍼티 (필수)
open - 반복의 전체를 열기 위한 문자열, 괄호를 위해 유용하다. (옵션)
close - 반복의 전체를 닫기 위한 문자열, 괄호를 위해 유용하다. (옵션)
conjunction - 각각의 반복 사이에 적용되기 위한 문자열, AND 그리고 OR을 위해 유용하다. (옵션)
<iterate> |
java.util.List 타입의 프로퍼티 반복 사용법 예제) <iterate prepend="AND" property="userNameList" open="(" close=")" conjunction="OR"> username = #userNameList[]# </iterate> 주의:iterator요소를 사용할 때 리스트 프로퍼티의 끝에 중괄호[]를 포함하는 것은 중요하다. 중괄호는 문자열처럼 리스트를 간단하게 출력함으로부터 파서를 유지하기 위해 리스트처럼 객체를 구별한다. |
자바 SE 6의 성능 모니터링 및 진단 (한글)자바 최신 버전에서 향상된 성능과 모니터링의 장점을 활용하기 ![]() |
![]() |
난이도 : 중급 Cathy Kegley, 소프트웨어 엔지니어, IBM 2008 년 3 월 11 일 자바 SE 6(Java™ Platform, Standard Edition 6)은 성능에 초점을 맞춰 응용 프로그램을 모니터링, 감시하고 공통적인 문제를 진단하기 위해 확장된 도구들을 제공합니다. 이 기사에서는 자바 SE 플랫폼의 모니터링과 관리에 대한 기본적인 사항들을 소개하고, 자바 SE 6에서 보강된 사항들에 대한 상세한 정보를 제공합니다. 자바 SE 6은 응용 프로그램을 관리, 모니터링하고 일반적인 문제점을 진단하는 확장된 도구들을
이 기사는 자바 SE 플랫폼의 모니터링과 관리에 대한 기본적인 사항들을 소개하고, 최신 버전에서 이 기사를 통해 이전 버전의 자바 SE에서 소개된 모니터링 및 관리 기능을 확실히 이해하게 자바 SE 5는 표 1. 플랫폼 MBeans
어떤 응용 프로그램이라도 원하는 빈의 인스턴스를 얻고 절적한 메서드를 호출해 JVM이 제공하는 플랫폼 MBean은 적재된 클래스 개수, JVM 가동시간, 메모리 소모량, 실행 중인 스레드 개수, JVM 리소스를 모니터링하고 관리하는 두 가지 방법이 있다.
정적인 팩토리 메서드를 통해 Listing 1. MXBean에 직접 접근하기
플랫폼 Listing 2. MXBean에 간접 접근하기
참고자료에서 MXBean과 the 자바 SE 5는 락(lock)과 대기 조건(wait codition)에 대한 프레임워크를 제공하는 자바 SE 6은 자바 SE 6은 새로운 클래스 두 개를 도입했다.
객체(ownable synchronizer)를 표현하는
지원하는지 여부를 검사한다.
지원하는지 여부를 검사한다.
마지막으로, 프로그래밍 수준 지원과 더불어, 자바 SE 6은 문제를 감지하고 JVM의 자원 사용량을 모니터링하기
자바 SE 6은 자바 SE 5부터 도입된 모니터링 및 관리 콘솔인 JConsole에 대한 공식 지원을 포함한다. JConsole을 통해 실행 중에 다양한 JVM 통계를 모티터링할 수 있다. 이 도구는 데드락, 락 경합,
다음 절에서 자바 SE 6에서 JConsole의 보강된 부분들을 설명한다. 참고자료에서 JConsole을 자바 SE 6부터 JConsole은 새로운 Attach API를 구현하고 있다. 이 예전에는 JConsole로 모니터링하려면 응용 프로그램을 자바 SE 6에서는 JConsole이 Windows® 운영체제나 GNOME 데스크톱 등의 실행 중인 플랫폼과 일단 시작해 응용 프로그램과 연결되면, JConsole은 각각 다른 JVM 자원을 표현하는 6개의
Overview 탭은 상호 연관된 메모리 사용량, 스레드, 클래스, CPU 사용량에 대한 정보를 그래프 그림 1. JConsole의 Overview 탭 ![]() Overview 탭은 VM 자원 사용 정보에 대한 4개의 그래프와 결과를 보고 싶은 시간 범위를 바꾸기 스레드 그래프는 시간대 별로 살아있는 스레드 개수를, 클래스 그래프는 적재된 클래스 개수를 그림 2의 VM Summary 탭은 자바 SE 6에 새로 추가된 것이다. 여기에는 총 가동시간, 스레드 정보, 그림 2. JConsole의 VM Summary 탭 ![]() MBeans 탭은 MBean들의 동작과 속성에 더 쉽게 접근할 수 있도록 개선되었다. 플랫폼에 등록된 그림 3. JConsole의 MBean 탭 ![]() Attributes 노드를 선택하면 MBean의 모든 속성을 표시한다(그림 4). 그림 4. MBean Attributes ![]() 오른쪽에 표시된 속성과 값은 앞에서 설명한 그림 5. 확장된 속성 값 ![]() 쓰기 가능한 속성은 파란색으로 표시되는데, 클릭한 다음 새 값을 입력해 편집할 수 있다. 예를 들어, 왼쪽 트리 구조에서 Operations 노드를 선택하면 MBean과 연관된 동작들을 표시한다. MBean 그림 6. MBean Operations ![]() 자바 SE 6부터 JConsole은 핫스팟 진단(HotSpot Diagnostic) MBean을 지원한다. 이 MBean은 Figure 7. 핫스팟 진단 MBean ![]() 자바 SE 6부터 JConsole은 플러그인을 지원한다. JConsole과 함께 실행할 수 있는 고유한 커스텀 JConsole 플러그인을 만들려면
JConsole은 서비스-공급자 메커니즘을 사용해 모든 플러그인 클래스를 감지하고 적재한다.
이 명령에서, plugin_path는 JConsole 플러그인들이 들어있는 디렉터리나 JAR 파일의 위치다. 자바 SE 6에는 JTop이라는 JConsole 플러그인이 예제로 포함되어 있다. JTop은 현재
그림 8은 JTop 탭이 선택된 JConsole을 보여준다. 왼쪽 컬럼은 실행 중인 스레드의 이름을 그림 8. JConsole의 JTop 플러그인 ![]()
자바 SE 6은 JConsole 외에도 몇 가지 다른 명령행 도구를 포함한다. 이 진단 도구들은 응용 자바 SE 6은 JVM의 성능 통계를 모니터링하는 데 유용한 명령행 유틸리티들을 포함하고 있다(표 2). 표 2. 모니터링 도구
다음 예제는 Listing 3. jps 유틸리티 사용하기
참고자료에서 이 도구들 각각에 대한 추가 문서와 사용 예를 볼 수 있다. 자바 SE 6은 응용 프로그램이 예상치 못한 동작을 할 때 정밀한 처방을 내릴 수 있도록 도와주는 표 3. 문제 해결 도구
참고자료에서 이 도구들 각각에 대한 추가 문서와 사용 예를 볼 수 있다.
자바 6 플랫폼은 자바 응용 프로그램의 성능과 메모리 문제를 효과적으로 식별하고 진단하는 것을 자바 응용 프로그램의 평균 속도는 시간이 지남에 따라 꾸준히 증가하고 있다. 자바 SE 6이
교육
Caroline Gough, developerWorks, 2006년 4월): MXBean에 대한 더 자세한 정보
썬 개발자 네트워크, 2006년 8월): 자바 SE에서 공통적인 성능 문제 진단하기
이 API를 먼저 살펴보라.
소개한 모니터링 및 문제 해결 도구들에 대한 문서와 예제
토론
|