본문 바로가기

nerv-team.co.kr

[Hibernate] Spring + Hibernate Mapping

자, 본격적으로 Hibernate 와 Spring 을 Mapping 시켜 봅시다.

선수작업!!!!!!!!!!!! ^-^
이 블로그를 먼저 보신분은 http://joke00.tistory.com/116 의 middlegen 을 이용하여 hibernate의 hbm.xml 을 만드시거나 손수 손으로 hbm.xml 을 작성하시고 보시길 바랍니다!! 꼬~~~~옥!!!!!!!
 
그러기 위해서 첫번째로 해야 할 사항. 일단 내가 써야할 프레임 워크의 라이브 러리를 집어 넣는 것이 첫번째 사항이라고 생각됩니다. (라이브 러리만 잘 맞춰 주어도 불필요한 에러는 안 볼 수 있죠~ -ㅅ-;;; 이번에 필요한것만 간단간단하게 넣어보자 하고 몇개 빼 먹었더니... 다양한 에러를 감상해 보았습니다.. ^^ 뭐, 에러를 보고 파악하는 것도 개발자의 중요한 사항이라고 생각되지만... 이제 삽질은 그만~ 야근 없는 세상에서 살기 위해서는 삽질은 그만 해야 하겠쬬?! ^^)

hibernate 의 라이브 러리는 이곳 에서 다운받으면 될 것같은데..... 사이트가 많이 바뀌어 다운 받는 곳을 모르겠숨다 ;;; ㄷㄷㄷㄷ;; 그럴수도 있죠.. 정작 급하게 되면 어떻게든 알아낼텐데.. 전 급하지가 않습니다 -_-;;;
그래서 여기에 필요한 라이브러리를 첨부하도록 할께요~ ^^

하이버네이트 라이브 러리  hibernate-distribution-3.3.2.GA-dist.zip  을 받아서 풀게도면 lib 폴더 안에 required 폴더가 있습니다. 여기에 속해있는 jar 파일 모두와, hibernate3.jar 를 lib 에 추가해 주면 됩니다.
또 한가지 라이브 러리! commons-lang.jar 또한 필요합니다! why?  앞에서 middlegen 으로 만든 Item.jar 파일의 toString() 메소드를 보면 ToStringBuilder 가 있는데 이 클래스를 commons-lang.jar 에서 찾게 됩니다 ^^. ToStringBuilder  에 대한 에러가 날 경우에는 commons-lang.jar  를 추가해 주면 말끔하게 없어진답니다! ^-^ 후훗-
 slf4j-log4j12-1.5.10.jar 파일도 필요합니다 ^^
더, 자세한 내용은 http://antop.tistory.com/53 를 참조하시기 바랍니다 ^^

자, 이제 라이브 러리 셋팅이 끝났으니 본격적으로 개발을 해보도록 하겠습니다.

1. applicationContext.xml 파일 수정

* applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC
    "-//SPRING//DTD BEAN//EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
 <!-- DataSource  데이터 소스를 설정 합니다~ -->
 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
  <property name="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property>
  <property name="url"><value>jdbc:oracle:thin:@nerv-team.co.kr:1521:XE</value></property>
  <property name="username"><value>아이디</value></property>
  <property name="password"><value>패스워드</value></property>
 </bean>

<!-- Hibernate Session Factory 설정 -->
 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource"><ref bean="dataSource"/></property>
  <property name="mappingResources">
   <value>logic/Item.hbm.xml</value>
  </property>
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
    <prop key="hibernate.show_sql">false</prop>
   </props>
  </property>
 </bean>

<!-- hibernate 에 맞는 Dao 설정 -->
<bean id="itemDao" class="dao.impl.ItemDaoImpl">
  <property name="sessionFactory"> <ref bean="sessionFactory" /></property>
 </bean>
<!-- ItemCatalog 서비스 호출부분~-->
 <bean id="itemCatalog" class="service.impl.ItemCatalogImpl">
  <property name="itemDao"><ref bean="itemDao" /></property>
 </bean>

</benas>



* dataSource : 설정파일에서의 dataSource 를 참조
 * mappingResources :
기존에 hibernate.cfg.xml 에서 설정하여 사용했던 
                         <mapping resource="logic/Item.hbm.xml" /> 부분 입니다. hibernate 와 xml 을  mapping 해주던부분....

* hibernateProperties : hibernate 설정 하는 부분. dialect 에는 oracle 을 쓰기 때문에 Orcal10gDialect 를 써준것이고, 해당 db에 따라 설정 value 값이 틀려집니다. 맞게끔 써 주시면 된답니다~ ^^
hibernate.dialect        :  사용하는 데이터베이스의 dialect
hibernate.show_sql    : Hibernate 가 실행하는 sql 표시의 유무

************ 참고 ! *******************
<property name="mappingResources">
   <value>logic/Item.hbm.xml</value>
</property>

hbm.xml (매핑파일)이 여러개일 경우에는   2가지 방법이 있습니다.
1. 콤마로 구분
<value>logic/Item.hbm.xml , logic/test.hbm.xml ,.... hbm.xml </value>
2. xml 의  <list><value></value><value></value></list> 형태로 표현


그리고는 hibernate 를 쓸 Dao 의 bean 에 대해서 ref (참조할 bean 에 대한 이름을 명시해 주면 됩니다

2. Dao Implements 의 java  파일 코딩을 시작합니다.

* ItemDaoImpl.java
 
일단 알아보기 쉽게 기존 소스 코드를 모두 지우고 시작합시다~ ^^ 이제 JdbcDaoSupport 는 안쓸꺼니깐요! ^^
 JdbcDaoSupport 상속받아 썻었던 부분을 hibernate 를 쓰기 위해서는 HibernateDaoSupport 를 상속받을 껍니다.
package dao.impl;
import java.util.List;
import logic.Item;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import dao.ItemDao;

public class ItemDaoImpl extends HibernateDaoSupport implements ItemDao {
 public List<Item> findAll()   {
           List<Item> item = getHibernateTemplate().find( "from logic.Item" ); //HQL
for (Item it : item) {
System.out.println("나타나세요~ :: "+it.getItemId());

              } //system log 이건 뭐 데이터값이 제대로 나오는지 확인하기 위한것 입니다 ^^
return item;
 }

 public Item findByPrimaryKey(Integer itemId) {
           // TODO Auto-generated method stub
return null;
}
}


getHibernateTemplate() 메소드를 이용하여 HQL 쿼리를 날릴겁니다.
참고로 HQL 쿼리의 hbm.xml 에 정의한 name 값으로 properties 명을 작성 안하면 에러 뿜습니다~



이렇게 name 이 logic.Item 이었기 때문에 from 테이블명이 logic.Item 이렇게 쓴 것 이랍니다.

* HQL ?
O/R 맵핑 툴의 하나인 Hibernate 는 HQL 에 의한 질의를 합니다. HQL 이란 Hibernate Query Language 의 약어로 하이버네이트를 통해 데이터베이스를 검샐할 경우에 이용하는 쿼리입니다. HQL 을 하이버네이트가 어떤 데이터베이스를 이용하고 있는지 살펴보고 알아서 그에 맞는 SQL 로 변환하여 준다는 장점이 있습니다. HQL 은 SQL 에 비슷하지만 클래스의 프로퍼티를 쓴다는 점이 특징입니다!!! ^^ 중요중요 클래스의 프로퍼티!!!를 씁니다!!!



테스트 완성!!!!! ^-^ 용자님께서의 실행 ㄱㄱㄱㄱ


자, 이제 모든 과정이 끝났습니다. 실행 고고고곡ㄱㄱㄱㄱㄱ
에러를 뿜지 않고, 잘 화면이 떳으면 짝짝짝!!! ^^
http://localhost:포트번호/Shop/index.do


리스트 단만 부르는 것으로 했으니,
당연히 상품명을 클릭하면 에러를 뿜겠죠?~ ^^

차후에 HQL  쿼리문에 대해서 간단히 sumerry 해 두겠습니다. ^^