Daejeon IT Developer Conference Hibernate3

1,164 views

Published on

Daejeon IT Developer Conference Hibernate3 Presentation

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,164
On SlideShare
0
From Embeds
0
Number of Embeds
22
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Daejeon IT Developer Conference Hibernate3

  1. 1. 본 문서의 배포 및 변경 , 출력 및 활용에 관한 모든 권리는 작성자에 있습니다 . 본 서비스는 제 1 회 대전 IT 개발자 커뮤니티 참석자를 위해 제공됩니다 .
  2. 2. 하이버네이트 : 기초 & 객체 지향 지원에 대하여 최범균 , 다음커뮤니케이션
  3. 3. 처음 떠오르는 코드는 ? insert into ORDER (..,ordererid,sa_zipcode, sa_address1,..) values (?,?,?..); insert into ORDERED_ITEM (..,itemid,quantity,price..) values (?,?,?...); Order order = new Order(); AddressInfo shippingAddress = orderRequest. getShippingAddress(); order.setShippingAddress( shippingAddress); Item item = getItem(itemId); order.addOrderedItem( createOrderedItem(price, item)); saveOrder(order);
  4. 4. 처음 떠오르는 코드는 ? select orderid, ordererid, sa_zipcode, sa_address1, .., u.name from ORDER o, USER u, where o.ordererid = u.userid .. select * from ORDERED_ITEM where orderid = ? .. Order order = orderRepository. findOrder(orderId); User orderer = order.getOrderer(); ShippingAddress address = order.getShppingAddress(); List<OrderedItem> itemList = order.getOrderedItemList(); PaymentInfo paymentInfo = order.getPaymentInfo();
  5. 5. SQL 중심 객체 중심 DB 중심 객체 관계 중심 ORM
  6. 6. 이 시간의 목적 <ul><li>ORM 과 하이버네이트 이해 </li></ul><ul><li>하이버네이트에 대한 호기심 충족 </li></ul><ul><li>하이버네이트 도입 유도 </li></ul><ul><li>객체 지향 / 도메인에 대한 호기심 자극 </li></ul>
  7. 7. 살펴볼 내용 <ul><li>ORM 과 하이버네이트 </li></ul><ul><li>하이버네이트 기초 사용법 </li></ul><ul><li>하이버네이트 객체 지향 지원 </li></ul><ul><li>하이버네이트 도입에 대하여 </li></ul><ul><li>맺음말 </li></ul>
  8. 8. ORM 과 하이버네이트
  9. 9. 관계형 DB != 객체 지향 관계형 데이터 객체 연관 FK 를 통한 단순 연관 양방향 연관 . List, Map 등 풍부한 연관 표현 상속 지원하지 않음 상속 / 구현을 통한 다형성 제공 세밀함 Value 타입 존재하지 않음 [DBMS 에 특화 ] Value 타입 통한 세밀한 설계
  10. 10. ORM 이란 ? 객체 관계형 데이터
  11. 11. ORM 과 매퍼 솔루션들 객체 지향 지원 Hibernate JPA JDO iBATIS Torque 단순 매퍼
  12. 12. 하이버네이트인 이유 <ul><li>쉬운 사용 방법 </li></ul><ul><ul><li>설정 파일을 통한 매핑 관리 </li></ul></ul><ul><li>객체 지향의 다양한 특징 지원 </li></ul><ul><ul><li>다양한 연관 매핑 지원 (1-1, 1-n, n-1, n-m) </li></ul></ul><ul><ul><li>상속 지원 </li></ul></ul><ul><li>다양한 테이블 구조에 대한 매핑 지원 </li></ul><ul><li>객체 기반 쿼리 지원 : HQL, Criteria </li></ul><ul><li>성능 향상 기법 제공 </li></ul><ul><ul><li>2 차 캐시 , Lazy Loading 등 </li></ul></ul>
  13. 13. ORM 도구가 필요한 이유 객체지향모델링 단순 코드 반복 제거 생산성 증가 자체개발 어려움 코드품질향상 pstmt.setString(1,bean.getX()); pstmt.setString(2,bean.getY()); pstmt.setSTring(3,bean.getZ());
  14. 14. 하이버네이트 기초 사용법
  15. 15. 프로그래밍 절차 영속 클래스 작성 / 변경 매핑 설정 파일 작성 / 변경 테이블 ( 스키마 ) 생성 / 변경 하이버네이트 이용 CRUD 처리 어플리케이션 실행
  16. 16. 매핑 설정 파일 작성 <hibernate-mapping> <class name=“Order” table=“ORDER”> <id name=“id” column=“ORDER_ID”> <generator name=“identity” /> </id> <property name=“registerDate” column=“REGDATE” type=“date” /> <component name=“shppingAddress” class=“AddressInfo”> <property name=“zipCode” column=“SA_ZIPCODE” /> </component> </class> </hibernate-mapping>
  17. 17. 클래스 작성법 public class Order implements Serializable { private Integer id; private Date registerDate; public Order() { } public Date getRegisterDate() { … } public void setRegisterDate() { … } public boolean equals(Object o) { … } public int hashcode() { … } } final class 가 아님 PK 와 매핑되는 프로퍼티 제공 기본 생성자 제공 getter/setter 제공
  18. 18. 하입네이트 설정 파일 작성 <hibernate-configuration> <session-factory> <property name=“connection.driver_class”>..</property> <property name=“connection.url”>jdbc:mysql:…</property> <property name=“hibernate.c3p0.min_size”>5</property> … <mapping resource=“Order.hbm.xml” /> <mapping resource=“Item.hbm.xml” /> </session-factory> </hibernate-configuration> DB 연결 설정 매핑 설정 파일 지정
  19. 19. SessionFactory 초기화 SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); Session session = sessionFactory.getCurrentSession(); // session 을 이용한 CRUD 처리
  20. 20. 기본 CRUD API: save() Order order = new Order(); order.addOrderedItem(..); order.setShppingAddress(shppingAddress); order.setOrderer(orderedUser); session.save(order) ;
  21. 21. 기본 CRUD API: get() Integer id = …; Order order = (Order) session.get(Order.class, id) ; order.getOrderedItemList(); User orderer = order.getOrderer();
  22. 22. 기본 CRUD API: update() Order order = (Order)session.get(…) order.setShppingAddress(newAddress); session.update (order);
  23. 23. 기본 CRUD API: delete() Order order = (Order)session.get(…) session.delete (order);
  24. 24. 쿼리 API <ul><li>객체 기반 조회 기법 제공 </li></ul><ul><ul><li>HQL : SQL 과 비슷한 쿼리를 이용한 조회 </li></ul></ul><ul><ul><li>Criteria : API 를 이용한 조회 </li></ul></ul>Query query = session.createQuery(“from Order where id = :id”); query.setInteger(“id”, id); List orderList = query.list(); Criteria crit = session.createCriteria(Order.class); crit.add(Restrictions.eq(“id”, id)); List orderList = crit.list();
  25. 25. 영속성 처리의 투명함 (Transparent Persistence) tx = session.beginTransaction(); Order order = (Order)session.get(Order.class, id); order.setState(OrderState.CANCEL); tx.commit();
  26. 26. 하이버네이트의 객체 지향 지원
  27. 27. Entity vs. Value Entity 의 특징 : - 식별값을 가짐 - 자체 라이프 사이클 <ul><li>Value 의 특징 : </li></ul><ul><li>다른 객체의 라이프 사이클을 따름 </li></ul><ul><li>식별값을 갖지 않음 </li></ul><ul><li>공유되지 않음 </li></ul>
  28. 28. 객체 지향 지원 - 연관
  29. 29. 하이버네이트의 연관 지원 <ul><li>Value ( 컴포넌트 , 기본 데이터 타입 포함 ) </li></ul><ul><ul><li>1-1, 1-n 연관 지원 </li></ul></ul><ul><li>Entity </li></ul><ul><ul><li>1-1, n-1, 1-n, n-m 연관 지원 </li></ul></ul><ul><li>Set, List, Map 을 이용 1-n, n-m 연관 지원 </li></ul>
  30. 30. 연관 매핑 예 – 컴포넌트 매핑 <hibernate-mapping> <class name=“Order” table=“ORDER”> <id name=“id” column=“ORDER_ID”> <generator name=“identity” /> </id> <property name=“registerDate” column=“REGDATE” type=“date” /> <component name=“shppingAddress” class=“AddressInfo”> <property name=“zipCode” column=“SA_ZIPCODE” /> </component> </class> </hibernate-mapping>
  31. 31. 연관 매핑 예 - 1-1 PK 공유 <class name=“Item” table=“ITEM”> <id name=“id” column=“ITEM_ID”> </id> <one-to-one name=“detail” class=“ItemDetail” cascade=“save-update” /> </class> <class name=“ItemDetail” table=“ITEM_DETAIL”> <id name=“id” column=“ITEM_ID”> <generator class=“foreign”> <param name=“property”> item</param> <generator> </id> <one-to-one name=“item” class=“Item” constrained=“true” /> </class>
  32. 32. 연관 매핑 예 – 1-n/n-1 연관 <class name=“Item” table=“ITEM”> <id name=“id” column=“ITEM_ID”> </id> <set name=“comments” table=“ITEM_COMMENT”> <key column=“ITEM_ID” /> <one-to-many class=“ItemComment” /> </set> </class> <class name=“ItemComment” table=“ITEM_COMMENT”> <id name=“id” column=“COMMENT_ID”> </id> <many-to-one name=“item” class=“Item” /> </class>
  33. 33. 영속성 전이
  34. 34. 영속성 전이 설정 Order order = createOrder(); order.addOrderedItem(orderedItem1); order.addOrderedItem(orderedItem2); order.setOrderer(currentUser); order.setPaymentInfo(paymentInfo); session.save(order); <list name=“orderedItemList” table=“ORDERED_ITEM” cascade=“save-updater, delete” > <key column=“ITEM_ID” /> <one-to-many class=“OrderedItem” /> </list>
  35. 35. 객체 지향 지원 - 상속 Coupon coupon = getCoupon(couponId); PaymentInfo payInfo = new PaymentInfo(); payInfo.setUsedCoupon(coupon); order.setPaymentInfo(payInfo);
  36. 36. 상속의 세 가지 구현 전략 지원
  37. 37. 다형성 Coupon coupon = (Coupon) session.get(Coupon.class, id); PriceCoupon priceCoupon = (PriceCount) session.get(PriceCoupon.class, id) session.createQuery( “ from Coupon c “+ “ where c.expirationDate >= :date”);
  38. 38. 하이버네이트 도입하기
  39. 39. 처음부터 완벽할 순 없다 . 단순 매핑 Value , 1-1/n-1 연관 추가 1-n, n-m 연관 성능 향상 기법 적용 기본적인 사용법 습득 모델이 조금 풍부해짐 모델이 더욱 더 풍부해짐
  40. 40. 100% 하이버네이트 ? 하이버네이트 기반 Native 쿼리 SQL(JDBC) 비 하이버네이트 OLAP 대량 배치 처리 …
  41. 41. 맺음말
  42. 42. 도메인에 집중 select … insert into …
  43. 43. 오해 금지 <ul><li>어렵다… NO! 어렵지 않다 ! </li></ul><ul><li>성능이 나쁘다… NO! 나쁘지 않다 ! </li></ul>
  44. 44. 참고자료 <ul><li>사이트 </li></ul><ul><ul><li>Hibernate: www.hibernate.org </li></ul></ul><ul><ul><li>JPA API: http://java.sun.com/javaee/technologies/persistence.jsp </li></ul></ul><ul><li>도서 </li></ul>
  45. 45. 질문 있으세요 ? 나중에라도 대화가 필요하시면 [email_address] 으로 연락주세요

×