660 likes | 891 Views
Hitting the database. 백기선 whiteship2000@gmail.com http://whiteship.tistory.com. Persistence Layer. JDBC Hibernate JPA iBatis. DAO Pattern. 왜 ? 단일 책인 원칙 결과 유지 보수 및 요구 사항 변경에 기민하게 Agile 반응 할 수 있다 . Loosely Coupling. 스프링의 Data Access 철학. 예외를 꼭 잡아야 하는가 ?
E N D
www.springframework.co.kr Hitting the database 백기선 whiteship2000@gmail.com http://whiteship.tistory.com
www.springframework.co.kr Persistence Layer JDBC Hibernate JPA iBatis
www.springframework.co.kr DAO Pattern • 왜? • 단일 책인 원칙 • 결과 • 유지 보수 및 요구 사항 변경에 기민하게Agile 반응 할 수 있다. • Loosely Coupling
www.springframework.co.kr 스프링의 Data Access 철학 • 예외를 꼭 잡아야 하는가? • Checked Exception VS Unchecked Exception • Data Access Exception 계층 구조 제공. • 지겹도록 반복해서 나타나는 코드 • Template Pattern • Dao Template 클래스 제공. • 좀 더 간결하게, 중복을 제거하자. • Dao Support 클래스 제공.
www.springframework.co.kr 예외를 꼭 잡아야 하는가?
www.springframework.co.kr java.sql.SQLException이 발생하는 원인 • DB에 연결할 수 없을 때. • 질의문query에 문법적 오류가 있을 때. • 질의하고 있는 테이블이나 컬럼이 존재하지 않을 때. • CRUD 작업이 DB의 제약 사항을 위반할 때.
www.springframework.co.kr 그럼 이런 예외를 잡아서 하는 일은? • 로그 남기기. • 에러 메시지 출력.
www.springframework.co.kr 굳이 로그와 에러 출력 때문에 에러를 잡아야 하겠는가?? • 잡을 수 밖에 없습니다. 안 잡으면 컴파일 에러 입니다. • 왜? Checked Exception
www.springframework.co.kr 그래서 스프링은 • SQLException을 DataAccessException으로 맵핑해 줍니다. • DataAccessException • Unchecked Exception. • 여러 밴더들의 예외를 추상화한 다양한 계층 구조 제공.
www.springframework.co.kr DataAccessException Unchecked Exception
www.springframework.co.kr DataAccessException의 장점 • 개발자에게 예외 처리를 강요하지 않습니다. • 애플리케이션이 좀 더 유연해 집니다. • 추상화된 예외 계층을 제공하기 때문에 Persistence Layer 프레임워크변경이 자유롭습니다. • 좀 더 구체적인 예외 정보 제공
www.springframework.co.kr SQLException VS DataAccessException Lose Win
www.springframework.co.kr 지겹도록 반복해서 나타나는 코드
www.springframework.co.kr 매우 간단한 작업을 하는JDBC를 사용한 DAO 코딩 순서. • Define connection parameters • Open the connection • Specify the statement • Prepare and execute the statement • Set up the loop to iterate through the results (if any) • Do the work for each iteration • Process any exception • Handle transactions • Close the connection
www.springframework.co.kr 변하는 것과 그렇지 않은 것을 분리하라. • Template Pattern 고정적인 것 유동적인 것
www.springframework.co.kr Template Pattern 적용의 장점 • 반복되는 코드 작성이 제거 됩니다. • 더 빠르게 개발할 수 있습니다. • 소스 코드 가독성이 좋아집니다. • 코드 라인 수가 줄어듭니다. • 실수할 가능성을 줄여 줍니다.
www.springframework.co.kr Spring이 제공하는 Template 클래스 다양한 Persistent Layer 프레임워크 지원.
www.springframework.co.kr 좀 더 간결하게,중복을 제거하자.
www.springframework.co.kr Dao Support 클래스 사용시 문제점 • DAO 구현체 마다 각각 Template 클래스를 사용할 것입니다.
www.springframework.co.kr 중복이 발생합니다.
www.springframework.co.kr 중복을 제거 하는 방법 • Extract Super Class 리팩터링
www.springframework.co.kr Dao Support 클래스 사용의 장/단점 • 장점 • 중복제거 • 스프링 설정 파일의 크기가 줄어듭니다. • Template 클래스를 명시적으로 등록할 필요가 없기 때문입니다. • Support 클래스가 data source를 가지고 내부적으로 Template 객체를 생성하여 사용합니다. • 단점 • 스프링 소스코드에 종속성이 생깁니다.
www.springframework.co.kr Spring이 제공하는 Dao Support 클래스
www.springframework.co.kr 퀴즈 1 1. 기존 JDBC 코딩의 단점은?
www.springframework.co.kr 퀴즈 2 2. 그러한 단점을 극복하기 위해 스프링이 제공하는 주요 기능 3개는?
www.springframework.co.kr 퀴즈 3 3. O/X 퀴즈 • DataAccessException은 Checked Exception이다. • JdbcDaoSupport 클래스를 사용하면 JdbcTemplate 클래스를 빈으로 등록하지 않아도 된다. • 이제 쉬는 시간일까?
www.springframework.co.kr 이론은 다 살펴보았습니다.이제는 코딩을 해야 할 시간입니다. • Data Source 얻어오기. • JNDI로부터 가져오기. • Pool에서 건져오기. • JDBC 드라이버 기반 생성. • DAO 코드 작성하기. • JDBC • Hibernate • JPA • iBatis • Caching 사용하기. • Spring Module Project
www.springframework.co.kr Data Source 얻어오기.
www.springframework.co.kr JNDI로부터 가져오기. • Java Naming and Directory Interface
www.springframework.co.kr JNDI로부터 가져오기. • Spring 2.0 이전 • JndiObjectFactoryBean 사용 <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean” scope="singleton"> <property name="jndiName" value="/jdbc/RantzDatasource" /> <property name="resourceRef" value="true" /> </bean>
www.springframework.co.kr JNDI로부터 가져오기. • Spring 2.0 이후 • jee 네임스페이스 사용하기. <jee:jndi-lookup id="dataSource" jndi-name="/jdbc/RantzDatasource” resource-ref="true" />
www.springframework.co.kr Pool에서 건져오기.
www.springframework.co.kr Pool에서 건져오기. • Jakarta Commons Database Connection Pools (DBCP) 사용하기 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="org.hsqldb.jdbcDriver" /> <property name="url" value="jdbc:hsqldb:hsql://localhost/roadrantz/roadrantz" /> <property name="username" value="sa" /> <property name="password" value="" /> <property name="initialSize" value="5" /> <property name="maxActive" value="10" /> </bean>
www.springframework.co.kr Pool 설정하기
www.springframework.co.kr JDBC 드라이버에서 생성하기. • DriverManagerDataSource • SingleConnectionDataSource <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName” value="org.hsqldb.jdbcDriver" /> <property name="url” value="jdbc:hsqldb:hsql://localhost/roadrantz/roadrantz" /> <property name="username" value="sa" /> <property name="password" value="" /> </bean>
www.springframework.co.kr JDBC 드라이버에서 생성하기. • DriverManagerDataSource • DB 연결을 요청할 때 마다 새로운 객체를 생성하여 전달합니다. • 멀티스레드 사용 가능. • 매번 요청이 올 때 마다 객체를 생성해야 하는 비용이 발생합니다. • SingleConnectionDataSource • 오직 하나의 DB 연결 객체를 생성해두고 요청할 때 그 객체를 전달합니다. • 멀티스레드에서 사용하지 못합니다. • 둘 이상의 스레드가 하나의 자원에 접근하기 때문에 Thread Safe 하지 않습니다.
www.springframework.co.kr DAO 코드 작성하기.
www.springframework.co.kr JDBC • DataSource 직접 사용하기. • JdbcTemplate 사용하기. • JdbcDaoSupport 사용하기.
www.springframework.co.kr DataSource 직접 사용하기.
www.springframework.co.kr JdbcTemplate 사용하기 • JdbcTemplate • NamedParameterJdbcTemplate • SimpleJdbcTemplate
www.springframework.co.kr JdbcDaoSupport 사용하기
www.springframework.co.kr 다시 한 번 • JdbcDaoSupport 클래스를 사용하는 이유는? • 새로운 DAO 구현체가 추가 되었을 때 상속을 사용하여 중복되는 코드 제거.
www.springframework.co.kr JDBC 사용한 DAO 소스 코드 보기
www.springframework.co.kr DAO 프레임워크와 연동하기 • Spring + Hibernate • Spring + JPA • Spring + iBatis • 왜 DAO 프레임워크를 사용할까? • JDBC를 직접 다루는 것 보다 간단하게 DAO를 구현할 수 있습니다. • Lazy Loading, Eager Fetching, Cascading을 설정으로 처리할 수 있습니다.
www.springframework.co.kr Spring + Hibernate JDBC 사용시 기본 클래스 관계 Hibernate 사용시 기본 클래스 관계
www.springframework.co.kr Spring + Hibernate • 지금 가장 중요한 질문은 다음 중 무엇일까요? • Session 객체는 어떻게 생성할까? • Session 객체를 어떻게 사용할까? • SessionFactory는 어떻게 설정할까? • SessionFactory 객체는 무슨 일을 하는 걸까? • SessionFactory는 무엇인가?
www.springframework.co.kr SessionFactory는 어떻게 설정할까? • SessionFactoryBean • LocalSessionFactoryBean • AnnotationSessionFactoryBean
www.springframework.co.kr HibernateTemplate 사용하기 • org.springframework.orm.hibernate3.HibernateTemplate 빈으로 등록하기
www.springframework.co.kr Hibernate Dao Support 사용하기
www.springframework.co.kr Hibernate 사용한 DAO 코드 보기