하이버네이트:
기초&객체 지향 지원에 대하여

    최범균, 다음커뮤니케이션
처음 떠오르는 코드는?

insert into ORDER                Order order = new Order();
  (..,ordererid,sa_zipcode,
   sa_address1,..)  ...
처음 떠오르는 코드는?

select                             Order order = orderRepository.
    orderid, ordererid,                fin...
SQL 중심         객체 중심
         ORM
 DB 중심         객체 관계 중심




                          4
이 시간의 목적

•   ORM과 하이버네이트 이해
•   하이버네이트에 대한 호기심 충족
•   하이버네이트 도입 유도
•   객체 지향/도메인에 대한 호기심 자극




                         ...
살펴볼 내용

•   ORM과 하이버네이트
•   하이버네이트 기초 사용법
•   하이버네이트 객체 지향 지원
•   하이버네이트 도입에 대하여
•   맺음말




                      6
ORM과 하이버네이트
관계형 DB != 객체 지향

      관계형 데이터            객체



연관    FK를 통한 단순 연관       양방향 연관.
                         List, Map 등 풍부한 ...
ORM 이띾?


                                객체                                                                관계형 데이터
      ...
ORM과 매퍼 솔루션들


                    Hibernate
          iBATIS     JPA
                   JDO
Torque



단순 매퍼              ...
하이버네이트인 이유

• 쉬운 사용 방법
 – 설정 파일을 통한 매핑 관리
• 객체 지향의 다양한 특징 지원
 – 다양한 연관 매핑 지원 (1-1, 1-n, n-1, n-m)
 – 상속 지원
• 다양한 테이블 구조에 대...
ORM 도구가 필요한 이유


                 객체지향모델링
           코드품질향상
                                  생산성 증가
단순 코드 반복 제거
         ...
하이버네이트 기초 사용법
프로그래밍 절차

영속 클래스
작성/변경



매핑 설정 파일      하이버네이트 이용   어플리케이션
 작성/변경          CRUD 처리     실행



테이블(스키마)
 생성/변경




         ...
매핑 설정 파일 작성

                                         <hibernate-mapping>
                                          <class...
클래스 작성법
    final class가 아님

public class Order implements Serializable {

    private Integer id;                        ...
하입네이트 설정 파일 작성

<hibernate-configuration>
 <session-factory>

  <property name=“connection.driver_class”>..</property>
  <...
SessionFactory 초기화

SessionFactory sessionFactory =
      new Configuration().configure().buildSessionFactory();




Sessi...
기본 CRUD API: save()

Order order = new Order();
order.addOrderedItem(..);
order.setShppingAddress(shppingAddress);
order.s...
기본 CRUD API: get()


Integer id = …;
Order order = (Order)session.get(Order.class, id);
order.getOrderedItemList();
User o...
기본 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과 비슷한 쿼리를 이용한 조회
    Query query = session.createQuery(“from Order where id = :id”);
...
영속성 처리의 투명함
   (Transparent Persistence)

tx = session.beginTransaction();
Order order =
      (Order)session.get(Order.cl...
하이버네이트의 객체 지향 지원
Entity vs. Value

                Order                                    AddressInfo
-id : Integer                      ...
객체 지향 지원 - 연관
                Order                                            AddressInfo
-id : Integer                  ...
하이버네이트의 연관 지원

• Value (컴포넌트, 기본 데이터 타입 포함)
  – 1-1, 1-n 연관 지원


• Entity
  – 1-1, n-1, 1-n, n-m 연관 지원


• Set, List, Map을...
연관 매핑 예 – 컴포넌트 매핑

                                         <hibernate-mapping>
                                          ...
연관 매핑 예 - 1-1 PK 공유

                       <class name=“Item” table=“ITEM”>
         Item             <id name=“id” colum...
연관 매핑 예 – 1-n/n-1 연관

                               <class name=“Item” table=“ITEM”>
                  Item
             ...
영속성 전이

            : OrderedItem   : Item




: Order




            : OrderedItem   : Item




                        ...
영속성 전이 설정
<list name=“orderedItemList” table=“ORDERED_ITEM”
       cascade=“save-updater, delete”>
   <key column=“ITEM_ID...
객체 지향 지원 - 상속

                                    Coupon
                    -id : Integer                               ...
상속의 세 가지 구현 전략 지원
                                                                                         <<table>>
     ...
다형성

Coupon coupon = (Coupon)
      session.get(Coupon.class, id);
PriceCoupon priceCoupon = (PriceCount)
      session.ge...
하이버네이트 도입하기
처음부터 완벽할 순 없다.



                           1-n, n-m 연관
         Value , 1-1/n-1
 단순 매핑                     성능 향상 기법
    ...
100% 하이버네이트?


하이버네이트 기반                 비 하이버네이트
                           OLAP
                           대량 배치 처리
    ...
맺음말
도메인에 집중



                                                                                                      select …
...
오해 금지

• 어렵다… NO! 어렵지 않다!




• 성능이 나쁘다… NO! 나쁘지 않다!




                         42
참고자료

• 사이트
 – Hibernate: www.hibernate.org
 – JPA API:
   http://java.sun.com/javaee/technologies/pers
   istence.jsp
• 도...
질문 있으세요?
나중에라도 대화가 필요하시면 madvirus@madvirus.net 으로 연락주세요




                                                 44
Upcoming SlideShare
Loading in...5
×

대전개발자컨퍼런스 하이버네이트 발표자료 최범균

6,857

Published on

1회 대전 개발자 컨퍼런스 발표 자료.

Published in: Technology

대전개발자컨퍼런스 하이버네이트 발표자료 최범균

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

×