• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Daejeon IT Developer Conference Hibernate3
 

Daejeon IT Developer Conference Hibernate3

on

  • 1,261 views

Daejeon IT Developer Conference Hibernate3 Presentation

Daejeon IT Developer Conference Hibernate3 Presentation

Statistics

Views

Total Views
1,261
Views on SlideShare
1,244
Embed Views
17

Actions

Likes
0
Downloads
0
Comments
0

1 Embed 17

http://plusperson.com 17

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Daejeon IT Developer Conference Hibernate3 Daejeon IT Developer Conference Hibernate3 Presentation Transcript

    • 본 문서의 배포 및 변경 , 출력 및 활용에 관한 모든 권리는 작성자에 있습니다 . 본 서비스는 제 1 회 대전 IT 개발자 커뮤니티 참석자를 위해 제공됩니다 .
    • 하이버네이트 : 기초 & 객체 지향 지원에 대하여 최범균 , 다음커뮤니케이션
    • 처음 떠오르는 코드는 ? 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);
    • 처음 떠오르는 코드는 ? 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();
    • SQL 중심 객체 중심 DB 중심 객체 관계 중심 ORM
    • 이 시간의 목적
      • ORM 과 하이버네이트 이해
      • 하이버네이트에 대한 호기심 충족
      • 하이버네이트 도입 유도
      • 객체 지향 / 도메인에 대한 호기심 자극
    • 살펴볼 내용
      • ORM 과 하이버네이트
      • 하이버네이트 기초 사용법
      • 하이버네이트 객체 지향 지원
      • 하이버네이트 도입에 대하여
      • 맺음말
    • ORM 과 하이버네이트
    • 관계형 DB != 객체 지향 관계형 데이터 객체 연관 FK 를 통한 단순 연관 양방향 연관 . List, Map 등 풍부한 연관 표현 상속 지원하지 않음 상속 / 구현을 통한 다형성 제공 세밀함 Value 타입 존재하지 않음 [DBMS 에 특화 ] Value 타입 통한 세밀한 설계
    • ORM 이란 ? 객체 관계형 데이터
    • ORM 과 매퍼 솔루션들 객체 지향 지원 Hibernate JPA JDO iBATIS Torque 단순 매퍼
    • 하이버네이트인 이유
      • 쉬운 사용 방법
        • 설정 파일을 통한 매핑 관리
      • 객체 지향의 다양한 특징 지원
        • 다양한 연관 매핑 지원 (1-1, 1-n, n-1, n-m)
        • 상속 지원
      • 다양한 테이블 구조에 대한 매핑 지원
      • 객체 기반 쿼리 지원 : HQL, Criteria
      • 성능 향상 기법 제공
        • 2 차 캐시 , Lazy Loading 등
    • ORM 도구가 필요한 이유 객체지향모델링 단순 코드 반복 제거 생산성 증가 자체개발 어려움 코드품질향상 pstmt.setString(1,bean.getX()); pstmt.setString(2,bean.getY()); pstmt.setSTring(3,bean.getZ());
    • 하이버네이트 기초 사용법
    • 프로그래밍 절차 영속 클래스 작성 / 변경 매핑 설정 파일 작성 / 변경 테이블 ( 스키마 ) 생성 / 변경 하이버네이트 이용 CRUD 처리 어플리케이션 실행
    • 매핑 설정 파일 작성 <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>
    • 클래스 작성법 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 제공
    • 하입네이트 설정 파일 작성 <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 연결 설정 매핑 설정 파일 지정
    • SessionFactory 초기화 SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); Session session = sessionFactory.getCurrentSession(); // session 을 이용한 CRUD 처리
    • 기본 CRUD API: save() Order order = new Order(); order.addOrderedItem(..); order.setShppingAddress(shppingAddress); order.setOrderer(orderedUser); session.save(order) ;
    • 기본 CRUD API: get() Integer id = …; Order order = (Order) session.get(Order.class, id) ; order.getOrderedItemList(); User orderer = order.getOrderer();
    • 기본 CRUD API: update() Order order = (Order)session.get(…) order.setShppingAddress(newAddress); session.update (order);
    • 기본 CRUD API: delete() Order order = (Order)session.get(…) session.delete (order);
    • 쿼리 API
      • 객체 기반 조회 기법 제공
        • HQL : SQL 과 비슷한 쿼리를 이용한 조회
        • Criteria : API 를 이용한 조회
      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();
    • 영속성 처리의 투명함 (Transparent Persistence) tx = session.beginTransaction(); Order order = (Order)session.get(Order.class, id); order.setState(OrderState.CANCEL); tx.commit();
    • 하이버네이트의 객체 지향 지원
    • Entity vs. Value Entity 의 특징 : - 식별값을 가짐 - 자체 라이프 사이클
      • Value 의 특징 :
      • 다른 객체의 라이프 사이클을 따름
      • 식별값을 갖지 않음
      • 공유되지 않음
    • 객체 지향 지원 - 연관
    • 하이버네이트의 연관 지원
      • Value ( 컴포넌트 , 기본 데이터 타입 포함 )
        • 1-1, 1-n 연관 지원
      • Entity
        • 1-1, n-1, 1-n, n-m 연관 지원
      • Set, List, Map 을 이용 1-n, n-m 연관 지원
    • 연관 매핑 예 – 컴포넌트 매핑 <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>
    • 연관 매핑 예 - 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>
    • 연관 매핑 예 – 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>
    • 영속성 전이
    • 영속성 전이 설정 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>
    • 객체 지향 지원 - 상속 Coupon coupon = getCoupon(couponId); PaymentInfo payInfo = new PaymentInfo(); payInfo.setUsedCoupon(coupon); order.setPaymentInfo(payInfo);
    • 상속의 세 가지 구현 전략 지원
    • 다형성 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”);
    • 하이버네이트 도입하기
    • 처음부터 완벽할 순 없다 . 단순 매핑 Value , 1-1/n-1 연관 추가 1-n, n-m 연관 성능 향상 기법 적용 기본적인 사용법 습득 모델이 조금 풍부해짐 모델이 더욱 더 풍부해짐
    • 100% 하이버네이트 ? 하이버네이트 기반 Native 쿼리 SQL(JDBC) 비 하이버네이트 OLAP 대량 배치 처리 …
    • 맺음말
    • 도메인에 집중 select … insert into …
    • 오해 금지
      • 어렵다… NO! 어렵지 않다 !
      • 성능이 나쁘다… NO! 나쁘지 않다 !
    • 참고자료
      • 사이트
        • Hibernate: www.hibernate.org
        • JPA API: http://java.sun.com/javaee/technologies/persistence.jsp
      • 도서
    • 질문 있으세요 ? 나중에라도 대화가 필요하시면 [email_address] 으로 연락주세요