태그 : 아이바티스
위 책의 필요한 사전 배경지식: Java, JDBC(매핑+), SQL, XML
외부 링크 : 아이바티스 커뮤니티(http://ibatis.apache.org)
SVN : Subversion Source Control
JIRA: for 이슈 트래킹(아틀라시안)
Confluence : wiki 문서 작성
소스 코드 : 매닝 출판사 웹 사이트(www.manning.com/begin)
위키북스 오픈소스 & 웹 시리즈 에디터 일래스틱 온라인(http://web2.0business.or.kr/)
머리말
퍼시스턴스 계층에 적용할 프레임워크
iBATIS : 더 빠른 JDBC 코딩을 위한 일반화된 프레임워크
특징
성능 - 구조적 강점(데이터 접근 속도 높여주는 JOIN매핑)
관심사의 분리 - 설계를 향상(차후 유지보수성 위해)
작업의 분배 - 팀을 세분화하는 것을 도움
이식성 - 어떤 프로그래밍언어로도 구현 가능
언제 사용하지 말아야 하나?
개발자가 모든 것에 대해 영원한 결정권 소유
완전히 동적인 SQL을 요구시
비 관계형 데이터베이스 사용
(주로)관계형 데이터베이스를 위해 설계
배포판 얻기
바이너리 배포판: 가장 빠르고 쉬운 방법
소스로부터 빌드하기
배포판의 구조
/doc
/lib
/src
애플리케이션에 iBATIS 붙이기
클래스패스 추가(iBATIS 파일 경로 컴파일시, 실행시)
단독 실행 애플리케이션
클래스패스 옵션 추가
웹 애플리케이션
JRE 공유 디렉토리(lib/ext 디렉토리)에 올려서 사용가능하지만 가급적 피할 것
SQL Maps 설정 파일
<SqlMapConfig.xml>
<properties> 요소 - 외부에서 이름/값 쌍의 리스트를 제공
속성
resource - 클래스 패스상에 있는 리소스(or 파일)
소스(db.properties)
<setting> 요소
<typeAlias> 요소 - FQCN(완전한 형태의 클래스 이름, Fully Qualified Class Name) 대신 별칭을 붙임
예)
기본 내장 별칭들
트랜잭션 매니저의 별칭
데이터 타입
데이터 소스 팩토리 타입
캐시 컨트롤러 타입
XML 결과 타입
<transactionManager> 요소
type - 어떤 트랜잭션 관리자르 사용할지 결정
type 속성 - 어떤 클래스의 객체를 생성해서 데이터 소스 팩토리를 얻어올지를 정하는 속성
<typeHandler>
<sqlMap> 요소
SQL Map API
SqlMapClient 인터페이스
queryForObject() - 데이터베이스로부터 한 개의 레코드를 가져다가 자바 객체에 저장
Object queryForObject(String id, Object parameter) throws SQLException;
Object queryForObject(String id, Object parameter, Object result) throws SQLException;
queryForList() - 한 개 이상의 레코드를 가져와서 자바 객체의 List를 만드는 데 사용
List queryForList(String id, Object parameter) throws SQLException;
List queryForList(String id, Object parameter, int skip, int max) throws SQLException;
queryForMap() - 데이터베이스로부터 한 개 혹은 그 이상의 레코드를 가져올 때 자바 객체의 Map을 반환
Map queryForMap(String id, Object parameter, String key) throws SQLException;
key : 결과 객체를 가리키는 키, -> 지정된 프로퍼티의 값
Map queryForMap(String id, Object parameter, String key, String value) throws SQLException;
결과값 객체 -> value 파라미터에 지정된 프로퍼티 값이 됨
non-query 구문
데이터 갱신
insert 메소드
Object inser(String id, Object parameterObject) throws SQLException;
update 메소드
int update(String id, Object parameterObject) throws SQLException;
delete 메소드
int delete(String id, Object parameterObject) throws SQLException;
매핑 구문
<insert> | id, parameterClass, parameterMap
<sql> | id
<include> | refid
iBATIS에서 XML 사용
XML 파라미터
XML로 결과 생성
비지니스 객체 모델(도메인 클래스) : 처리할 도메인을 객체 지향적으로 묘사
프리젠테이션 계층 : 출력(애플리케이션의 데이터/제어화면)하는 역할
웹 애플리케이션
단점: 높은 수준의 사용자 제어 방식, 복잡한 데이터 처리 어려움
리치 클라이언트 방식
복합적 리치 클라이언트(웹 애플리케이션 + 리치 클라이언트 방식)
단점: 애플리케이션의 개발과 배치에 더 많은 소프트웨어 필요
비지니스 로직 계층(서비스 클래스) - 애플리케이션이 제공하는 포괄적인 서비스들을 표현
퍼시스턴스 계층 - 객체에 저장된 데이터(저장소, 객체 가져오기)
내부 계층
추상 계층 : 퍼스스턴스 계층에 일관성 있고 의미 있는 인터페이스 제공
퍼시스턴스 프레임워크 : 드라이버(or 인터페이스)와 소통하는 책임
표준API - 반복적이고 부차적인 코드가 필요
드라이버 / 인터페이스
관계형 데이터베이스의 사용 이유? - 무결성, 성능, 보안
무결성 - 데이터의 일관성, 신뢰, 값의 정확성 보장
성능 - 설계, 소프트웨어 튜닝, 하드웨어
데이터베이스 형태(4가지)
애플리케이션 데이터베이스 - 작고 단순한 형태, 외부 영향 적음
기업용 데이터베이스 - 큰 규모, 외부의 영향 큼
레거시 데이터베이스 - 오래된 데이터베이스(보잡성, 뒤죽박죽 설계, 의존성. age)
iBATIS - 데이터 매퍼
매퍼계층: 객체와 데이터베이스 그리고 매퍼 자체를 독립적으로 유지 + 객체와 데이터베이스 간에 데이터를 이동
매핑방법
SQL 구문 - 입력과 출력으로 구분
예) 입력 first_name, last_name / 출력 1234
XML 서술 파일 : SQL 구문의 입력과 출력을 매핑
위 코드를 수행하는 자바 코드
위 코드를 수행하는 C# 코드
JDBC, ADO.NET 코드 작성 대신
예) JDBC vs iBATIS
JDBC
iBATIS
실행 코드
자바빈즈를 PreparedStatement 파라미터와 ResultSet으로 맵핑시켜주는 기능을 담당
디미터 법칙(Law of Demeter) "각 계층은 다른 계층에 대해 오직 제한된 정보만을 가질 수 있다: 오직 현재 계층에 인접한 계층에 대해서만."
왜 iBATIS대신에 Spring을 사용할까?
iBATIS DAO 계층
DAO 패턴을 사용: 결함도가 낮아짐(decoupling) -> 테스트하기 쉽다
효율적인 DAO 계층
구현체에서 인터페이스 분리
이유
IDE : 분리 과정 쉽게 처리 가능
인터페이스를 만들 때 구현 클래스를 어떤 다른 데잍터베이스를 다루는 툴에 종속적인 부분에 노출 가능성 높음
노출: DAO가 아닌 데이터 접근 구현체에 애플리케이션을 묶어버림
예) 'Fast Lane Reader'패턴을 사용하는 웹 애플리케이션 - JDBC 코드가 뷰 계층과 직접 소통 (테스트 어려워짐)
SQL Maps API를 직접 사용하는 애플리케이션 -> 캡슐화된 API
예) sqlMapClient 객체의 queryForList() 메소드를 호출하는 클래스 - > 작성한 DAO 클래스를 호출하게 리팩토링, 클래스의 메소드에서는 List 객체를 반환
외부에서 설정된 팩토리(factory)를 사용하여 구현체의 결합도 낮추기
인터페이스와 구현체 둘 다 DAO를 사용하는 클래스에 노출(인터페이스에 대한 의존성을 DAO를 사용하는 클래스에 추가한 셈)시키면 안됨
[구현체]-[DAO]-[interface]-> 구현체를 어떻게 사용할 수 있을 것인가?
DAO factory
public인테피이스는 getInstance()와 getDao() 두개의 메소드로 이루어져 있음
"dao.factory.config",
defaultConfigLocation
);
스프링: 데이터 매퍼의 두 가지 버전(1.3, 2.0)을 지원
버전 2.0 : SqlMapClientXxx (SqlMapClientTemplate 클래스 사용: 내부적으로 iBATIS의 SqlMapClient 사용)
SqlMapClient를 스프링 빈으로 설정 : SqlMapClientFactoryBean 클래스 이용
<bean id="sqlMapClinet" class="org.springframework.orm.ibatis.SqlMapClinetFactoryBean"
sqlMapConfig.xml
GuestBook.xml
<typeAlias alias="Message" type="kame.spring.questbook.service.Message" />
<parameterMap id="messageParamMap" class="Message">
[출처] iBATIS in Action|작성자 날개
# by | 2008/10/24 17:32 | JAVA | 트랙백 | 덧글(0)
◀ 이전 페이지 다음 페이지 ▶