그냥 이런거군 이라고 몰라도 그런갑다 하자 -ㅅ-;;
그 다음으로 SQLMap은 application이 DB와 소통하기 위해 제공하는 입력 파라미터 값과 조합되는 매핑 구문을 정의한다.
자, 이 설정 파일을 좀더 자세히 알아보장~ 일단 iBatis in action 의 내용을 주력으로 정리한 것이다.
SQL Maps 설정파일(SlqMapConfig.xml)은 위의 그림에서도 볼 수 있듯이 iBatis 설정의 중심이다.
이 파일은 DB접속에서 부터 실제 사용할 SQL Map들까지 모든 것을들 프레임워크에 제공해준다.
[참고] 핵심 설정 파일은 보통 SQLMapConfig.xml이라고 이름을 정한다.
반드시 이 이름일 필요는 없지만, 알아두자.
2. <properties> 요소
<properties> 요소는 설정을 좀 더 일반화 하기 위해서 핵심 설정 파일의 외부에서 이름/값 (kye, value)쌍의
리스트를 제공해 준다.
이는 application을 배포할 때 특히 유용한데 공통 설정 부분은 모두 한곳에 두고 각 환결별로 다른 값들을
properties 파일에 독립시켜 둘 수 있기 때문이다.
사용할 properties 파일을 지정하는 방법은 두 가지가 있고 둘 다 properties 요소의 속성이다.
속성들은 다음과 같다.
- resource - 클래스 패스상에 있는 리소스(혹은 파일)
- url - Uniform Resource Locator (URL)
resource 속성을 사용하면 클래스 로더가 application의 클래스 패스에서 그 리소스를 찾으려는 시도를 하게된다.
파일을 찾기 위해 클래스 로더를 이용하기 때문에 이를 리소스(resource)라고 부른다.
JAVA문서에서는 이런 방식으로 데이터에 접근하는 것을 리소스라고 부르며 이는 비록 지역 파일 시스템의
파일일 수도 있지만 JAR파일의 한 항목일 수도 있고 심지어는 다른 컴퓨터 상에 존재할 수도 있다.
url 속성은 java.net.URL 에 의해 처리되기 때문에 java.net.URL이 이해하고 데이터를 읽어들이는 데
사용할 수 있는 어떠한 유효한 URL도 가능하다.
위에서 본 예제에서 <properties> 요소는 XML파일의 외부에서 세부적인 DB설정을 빼내서 클래스패스 상에
존재하는 db.peroperties.라는 단순한 프로퍼티 파일에 두도록 하기 위해 사용하였다. 이러한 분리는 단순성
이외에도 여러가지 유용한 점이 있다.
db.properties 파일이 다음 네가지 프로퍼티 정의픞 포한하고 있다고 생각 해보자.
driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:this:@localhost:1521:xe
user=scott
pword=tiger
위 예제에서는 다음과 같은 줄에서 properties파일을 지정한다.
이제 많은 사람들에게 익숙한 분법으로 프로퍼티의 이름을 이용하면 된다.
이 시점에서 우리는 생각하게 된다.
다른 개발을 할때와 프로퍼티를 이용하는 법이 같아 보인다는 것을....
이 요소에 속성을 추가 함으로써 값을 지정할 수 있다.
여러가지 설정들이 있으며 각각은 SQL Maps 인스턴스에 전체적으로 적용된다.
lazyLoadingEnabled (true/false, Default : true)
적재를 미루는 기술이다.
다시 말하면 절대적인 요청이 들어오기 전까지는 하는 척만 하고 있다가 절대적이 요청이 들어오면 그때서야
실질적인 처리를 하는 것이다.
예를 들자면 1000명의 고객 계좌가 각각 1000개의 주문을 가지고 있고 각 주문은 25개의 항목을 가진다고 하자.
생긴다.
적재 지연을 사용하면 요구 사항을 거의 2,500개로 줄일 수 있으며 이는 원래 개수의 일만분의 1이다.
cacheModelsEnabled (true/false, Default : true)
캐싱은 성능을 향상시키는 기법으로 최근 사용된 데이터가 미래에 다시 사용될 것이라 가정하고
메모리에 계속 저장해 두는 것이다. 이 설정은 iBatis가 캐싱을 사용할지 여부를 지정하는데 사용한다.
enhancemenEnabled (true/false, Default : true)
이 설정은 CGLIB에 최적화된 클래스를 통해 적재 지연 성능을 향상시킬지 여부를 지정하는데 사용한다.
useStatementNamespace (true/false, Default : false)
다시말해 SQL Map을 정의할 때, 적절한 Map이름을 가진 매핑 구문을 선택하는 데 사용된다는 것이다.
예를들어 'Account'라는 이름을 가진 SQL Map이 있고 이 Map은 'insert', 'update', 'delete', 'getAll'
이라는 이름의 매핑 구문을 포함하고 있다고 가정하자. 계좌(Account)하나를 추가하고자 한다면,
'Account.insert'라는 매핑 구문을 호출하면 되는것이다. 이로써 서로 다른 Map에 원하는 대로 여러 'insert'라는
매핑 구문을 작성해도 이름이 충돌하지 않게 된다.
사용하면 대규모 시스템에서 작업하는데 도움이 많이 된다.
이는 쿼리 구문들이 논리적으로 조직화 되어 있지 않은 경우, 구문을 찾는데 도움을 주기 때문이다.
모든 SQL작업을 의미한다.
즉 한번에 수행될 수 있는 Request수량이다.
maxSession (비권장, Default : 128)
Session이란 Thread차원의 메커니증으로, 관련되어 있는 트랜잭션과 요청의 묶음에 대한 정보를 추적하는데
사용한다.
즉 한번에 사용할 Session의 수량이다.
maxTransaction (비권장, Default : 32)
즉 한번에 처리할 트랜잭션의 수량이다.
[참고] 이 설정들은 히해하기 어려운 편인데 다행히도 이것들은 사용을 권장하지 않는 것들이다.
모두 다 타이핑 하고 싶어하는 사람은 없다.
사용하는 식으로 별칭(Alias)을 정의하는 일을 한다.
별칭을 만들려면 다음과 같은 요소를 작성하면 된다.
언제라도 완전한 클래스 이름이나 별칭 중 원하는 것 아무것이나 iBatis 설정 파일에 기입해도 된다.
iBatis는 개발자가 수작업으로 작성할 필요가 없도록 많은 데이터 타입의 별칭을 정의해 두었고,
다음은 이를 보여준다.
몇몇 매우 긴 클래스명을 적는 시간을 아껴줄 데이터 타입의 기본 내장 별칭 정의
별 칭 |
타 입 |
트랜잭션 매니저의 별칭 |
|
JDBC |
com.ibatis.sqlmap.engine.transaction.jdbc.JdbcTransactionConfig |
JTA |
com.ibatis.sqlmap.engine.transaction.Jta.JtaTransactionConfig |
EXTERNAL |
com.ibatis.sqlmap.engine.transaction.external.ExternalTransactionConfig |
데이터 타입 |
|
string |
java.lang.String |
byte |
java.lang.Byte |
long |
java.lang.Long |
short |
java.lang.Short |
int |
java.lang.Integer |
integer |
java.lang.Integer |
double |
java.lang.Double |
float |
java.lang.Float |
boolean |
java.lang.Boolean |
decimal |
java.math.BigDecimal |
object |
java.lang.Object |
map |
java.util.Map |
hashmap |
java.util.HashMap |
list |
java.util.List |
arraylist |
java.util.ArrayList |
collection |
java.util.collection |
iterator |
java.util.Iterator |
데이터 소스 팩토리 타입 |
|
SIMPLE |
com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory |
DBCP |
com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory |
JNDI |
com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory |
캐시 컨트롤러 타입 |
|
FIFO |
com.ibatis.sqlmap.engine.cache.fifo.FifoCacheController |
LRU |
com.ibatis.sqlmap.engine.cache.lru.LruCacheController |
MEMORY |
com.ibatis.sqlmap.engine.cache.memory.MemoryCacheController |
OSACACHE |
com.ibatis.sqlmap.engine.cache.osacache.OSCacheController |
XML 결과 타입 |
|
Dom |
com.ibatis.sqlmap.engine.type.DomTypeMarker |
domCollection |
com.ibatis.sqlmap.engine.type.DomCollectionTypeMarker |
Xml |
com.ibatis.sqlmap.engine.type.XmlTypeMarker |
XmlCollection |
com.ibatis.sqlmap.engine.type.XmlCollectionTypeMarker |
하지만 스스로 별칭을 정할때는 더 단순화 할 수 있음을 기억하자~
트랜잭션 요소의 type속성은 어떤 트랜잭션 관리자를 사용할지를 결정하는 것이다.
여러 구현체가 이미 통합된 상태로 제공된다.
이 름 | 설 명 |
JDBC | 간단한 JDBC 기반 트랜잭션 관리 기능을 제공한다. 대부분의 경우 이것으로 충분하다. |
JTA | 컨테이너에 기반한 트랜잭션 관리 기능을 application에 제공한다. |
EXTERNAL | 트랜잭션 관리자를 제공하지 않고 iBatis 대신 application이 직접 트랜잭션을 관리한다고 가정한다. |
가지며 Defualt : false이다.
이 설정은 connection을 닫기 전에 커밋(commit)이나 롤백(rollback)이 필요한 상황에서 주로 사용한다.
<property> 요소
각 트랜잭션 관리자는 서로 다른 설정 옵션을 가질 수 있다.
이 때문에 iBatis Framework는 트랜잭션 관리자의 구현체에 제한 없는 수의 옵션을 지정할 수 있도록 하기 위해
<properties> 요소를 사용한다.
<dataSource> 요소
트랜잭션 관리자의 <dataSource>요소는 iBatis가 어떤 클래스의 객체를 생성해서 데이터 소스 팩토리를
얻어올지 정하는 type속성을 가지고 있다. 이 요소의 이름은 약간 오해를 살 수 있다.
왜냐하면 실제로는 DataSourve가 아니라 DataSourveFactory의 구현체가 실제로 DAtaSource객체를 생성한다.
iBatis는 기본적으로 세가지 데이터소스팩토리 구현체를 제공하고, 각각 간단한 설명과 함께 다음에 나열해 두었다
이 름 | 설 명 |
SIMPLE | Simple DataSourceFactory는 말 그대로 단순핟. 간당한 Connection Pool을 내장한 DAtaSource를 설정하고자 할 때 이를 사용하며, iBatis Framework는 실제 JDBC드라이버만 빼고 DataSource에 필요한 모든 것을 자체 내장하고 있다. |
DBCP | DBCP DataSourceFactory는 jakarta COmmons Database Connection Pool 구현을 제공한다. |
JNDI | JNDI DataSourceFactory는 JNDI를 통해 할당된 컨테이너 기반의 DataSource를 공유하도록 사용된다 |
무제한의 속성을 설정할 수 있다.
타입 핸들러를 사용한다.
이를 통해 DB를 최대한 투명한 방식으로 사용하는 application을 작성할 수 있게 된다.
타입 핸들러는 실질적으로는 번역기라고 볼 수 있다. 이는 결과셋의 칼럼을 가져다 JavaBeans의
프로퍼티로 변환한다.
대부분의 경우 이 컴퍼넌트는 매우 단순하다.
StringTypeHandler 같은 경우는 단순히 결과셋의 getString 메소드를 호출하고 이를 String(문자열)형으로
리턴한다.
다른 경우 복잡한 변환이 필요한 경우도 있을 것이다.
예를들어 DB가 Boolean형을 가지고 있지 않다면, DB에 true 혹은 false를 나타내기 위해 'Y' 혹은 'N' 한 문자를
지정하게 하고 이를 application에 Boolean형으로 변환하여 넘겨줄 수도 있다.
대부분의 경우, 사용자 정의 타입 핸들러가 필요한 경우는 거의없다. iBatis는 99%의 경우를 다룰 수 있는
타입 핸들러를 내장하고 있다.
보통 타입 핸들러가 필요한 경우는, 대부분의 DB에서 일반적으로 사용되는 전형적인 데이터 형 매핑을
지원하지 않는 이상한 DB driver를 사용할 때 뿐이다.
가능하면 TypeHandler는 사용하지 말고 application 코드를 단순하게 유지하자.
<typeHandler> 요소를 사용해 그러한 일을 하고 jdbcType과 javaType 사이에서 무엇을 변환할지 지정한다.
추가로 typeHandler를 관리하기 위해 콜백 클래스도 필요하다.
여기서 부터 iBatis가 개발자들에게 진짜 중요한 역할을 해 주는 부분이 들어가기 시작한다.
<sqlMap> 요소는 사실 설정파일에서 가장 간단한 요소중의 하나로 오직 하나 혹은 두개의 속성만 설정하면 된다.
일반적으로 리소스 방식이 제일 쉬운데, 이 경우 파일을 JAR파일이나 WAR파일 내에 저장하고
간단히 최상위 클래스패스에 상대적인 경로로 지정하여 참조 하면 된다.
다른 경우로, 파일 위치에 관해 더 명확히 해두고 싶을 수도 있다. 그런 경우에는 url속성을 사용할 수 있다.
이 속성은 파일의 위치를 결정하는데 java.net.URL클래스를 사용한다.
그러므로 이 클래스가 인식하는 아무 URL값이나 사용하여 속성 값을 지정할 수 있다.
'FrameWork > iBatis' 카테고리의 다른 글
iBatis 왜 사용해야 하는가? (0) | 2009.05.31 |
---|---|
iBatis 그리고 JDBC 어떻게 다른가? (0) | 2009.05.28 |