SlideShare a Scribd company logo
1 of 44
하이버네이트:
기초&객체 지향 지원에 대하여

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

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
처음 떠오르는 코드는?

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
SQL 중심         객체 중심
         ORM
 DB 중심         객체 관계 중심




                          4
이 시간의 목적

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




                           5
살펴볼 내용

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




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

      관계형 데이터            객체



연관    FK를 통한 단순 연관       양방향 연관.
                         List, Map 등 풍부한 연관 표현


상속    지원하지 않음            상속/구현을 통한 다형성 제공



세밀함   Value 타입 졲재하지 않음   Value 타입 통한 세밀한 설계
      [DBMS에 특화]




                                                 8
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
ORM과 매퍼 솔루션들


                    Hibernate
          iBATIS     JPA
                   JDO
Torque



단순 매퍼                      객체 지향 지원


                                      10
하이버네이트인 이유

• 쉬운 사용 방법
 – 설정 파일을 통한 매핑 관리
• 객체 지향의 다양한 특징 지원
 – 다양한 연관 매핑 지원 (1-1, 1-n, n-1, n-m)
 – 상속 지원
• 다양한 테이블 구조에 대한 매핑 지원
• 객체 기반 쿼리 지원: HQL, Criteria
• 성능 향상 기법 제공
 – 2차 캐시, Lazy Loading 등

                                       11
ORM 도구가 필요한 이유


                 객체지향모델링
           코드품질향상
                                  생산성 증가
단순 코드 반복 제거
                                       자체개발 어려움
pstmt.setString(1,bean.getX());
pstmt.setString(2,bean.getY());
pstmt.setSTring(3,bean.getZ());


                                                  12
하이버네이트 기초 사용법
프로그래밍 절차

영속 클래스
작성/변경



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



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




                               14
매핑 설정 파일 작성

                                         <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
클래스 작성법
    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
하입네이트 설정 파일 작성

<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
SessionFactory 초기화

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




Session session = sessionFactory.getCurrentSession();
// session을 이용한 CRUD 처리




                                                          18
기본 CRUD API: save()

Order order = new Order();
order.addOrderedItem(..);
order.setShppingAddress(shppingAddress);
order.setOrderer(orderedUser);
session.save(order);



                                           19
기본 CRUD API: get()


Integer id = …;
Order order = (Order)session.get(Order.class, id);
order.getOrderedItemList();
User orderer = order.getOrderer();




                                                20
기본 CRUD API: update()


Order order = (Order)session.get(…)
order.setShppingAddress(newAddress);
session.update(order);




                                       21
기본 CRUD API: delete()


Order order = (Order)session.get(…)
session.delete(order);




                                      22
쿼리 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
영속성 처리의 투명함
   (Transparent Persistence)

tx = session.beginTransaction();
Order order =
      (Order)session.get(Order.class, id);

order.setState(OrderState.CANCEL);

tx.commit();


                                             24
하이버네이트의 객체 지향 지원
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
객체 지향 지원 - 연관
                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
하이버네이트의 연관 지원

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


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


• Set, List, Map을 이용 1-n, n-m 연관 지원

                                      28
연관 매핑 예 – 컴포넌트 매핑

                                         <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
연관 매핑 예 - 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
연관 매핑 예 – 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
영속성 전이

            : OrderedItem   : Item




: Order




            : OrderedItem   : Item




                                     32
영속성 전이 설정
<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
객체 지향 지원 - 상속

                                    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
상속의 세 가지 구현 전략 지원
                                                                                         <<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
다형성

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
하이버네이트 도입하기
처음부터 완벽할 순 없다.



                           1-n, n-m 연관
         Value , 1-1/n-1
 단순 매핑                     성능 향상 기법
            연관 추가
                                적용



기본적인     모델이 조금            모델이 더욱 더
사용법 습득   풍부해짐              풍부해짐




                                         38
100% 하이버네이트?


하이버네이트 기반                 비 하이버네이트
                           OLAP
                           대량 배치 처리
                           …


  SQL(JDBC)   Native 쿼리




                                      39
맺음말
도메인에 집중



                                                                                                      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
오해 금지

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




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




                         42
참고자료

• 사이트
 – Hibernate: www.hibernate.org
 – JPA API:
   http://java.sun.com/javaee/technologies/pers
   istence.jsp
• 도서




                                              43
질문 있으세요?
나중에라도 대화가 필요하시면 madvirus@madvirus.net 으로 연락주세요




                                                 44

More Related Content

What's hot

Inventory Optimization
Inventory OptimizationInventory Optimization
Inventory OptimizationAdexa, Inc.
 
โปรแกรมที่มากับโปรแกรม Microsoft Windows 7
โปรแกรมที่มากับโปรแกรม Microsoft Windows 7โปรแกรมที่มากับโปรแกรม Microsoft Windows 7
โปรแกรมที่มากับโปรแกรม Microsoft Windows 7เทวัญ ภูพานทอง
 
For Your Ice Only by Reece Millidge of Damp Gnat
For Your Ice Only by Reece Millidge of Damp GnatFor Your Ice Only by Reece Millidge of Damp Gnat
For Your Ice Only by Reece Millidge of Damp Gnatmochimedia
 
Information Management Strategy from Business and IT Viewpoints
Information Management Strategy from Business and IT ViewpointsInformation Management Strategy from Business and IT Viewpoints
Information Management Strategy from Business and IT ViewpointsMarina Kerbel
 
Laminas punto flotante
Laminas punto flotanteLaminas punto flotante
Laminas punto flotanteKely Galveez
 
Stewart Jones NextGen 09
Stewart Jones NextGen 09Stewart Jones NextGen 09
Stewart Jones NextGen 09Marit Hendriks
 
Understanding Social Media’s Impact on Business
Understanding Social Media’s Impact on BusinessUnderstanding Social Media’s Impact on Business
Understanding Social Media’s Impact on BusinessJared Degnan
 
Competitive deck shortened version 3.16.12 final
Competitive deck shortened version 3.16.12   finalCompetitive deck shortened version 3.16.12   final
Competitive deck shortened version 3.16.12 finalElizabeth Morris Gerber
 

What's hot (19)

Inventory Optimization
Inventory OptimizationInventory Optimization
Inventory Optimization
 
Approccio integrato alla gestione dati in ambito clinico
Approccio integrato alla gestione dati in ambito clinicoApproccio integrato alla gestione dati in ambito clinico
Approccio integrato alla gestione dati in ambito clinico
 
Hardware Interface in Android (in tamil)
Hardware Interface in Android (in tamil)Hardware Interface in Android (in tamil)
Hardware Interface in Android (in tamil)
 
Wp1011 Citrix Apple V004
Wp1011 Citrix Apple V004Wp1011 Citrix Apple V004
Wp1011 Citrix Apple V004
 
Innovation injection
Innovation injectionInnovation injection
Innovation injection
 
Intro. to JavaScript
Intro. to JavaScriptIntro. to JavaScript
Intro. to JavaScript
 
โปรแกรมที่มากับโปรแกรม Microsoft Windows 7
โปรแกรมที่มากับโปรแกรม Microsoft Windows 7โปรแกรมที่มากับโปรแกรม Microsoft Windows 7
โปรแกรมที่มากับโปรแกรม Microsoft Windows 7
 
Minishell
MinishellMinishell
Minishell
 
For Your Ice Only by Reece Millidge of Damp Gnat
For Your Ice Only by Reece Millidge of Damp GnatFor Your Ice Only by Reece Millidge of Damp Gnat
For Your Ice Only by Reece Millidge of Damp Gnat
 
Jifty
JiftyJifty
Jifty
 
Information Management Strategy from Business and IT Viewpoints
Information Management Strategy from Business and IT ViewpointsInformation Management Strategy from Business and IT Viewpoints
Information Management Strategy from Business and IT Viewpoints
 
CSS szelektorok
CSS szelektorokCSS szelektorok
CSS szelektorok
 
Laminas punto flotante
Laminas punto flotanteLaminas punto flotante
Laminas punto flotante
 
Stewart Jones NextGen 09
Stewart Jones NextGen 09Stewart Jones NextGen 09
Stewart Jones NextGen 09
 
SEE Youth Policy Conference - Report_SEGA 2004
SEE Youth Policy Conference - Report_SEGA 2004SEE Youth Policy Conference - Report_SEGA 2004
SEE Youth Policy Conference - Report_SEGA 2004
 
Rating Bar in Android Example
Rating Bar in Android ExampleRating Bar in Android Example
Rating Bar in Android Example
 
Understanding Social Media’s Impact on Business
Understanding Social Media’s Impact on BusinessUnderstanding Social Media’s Impact on Business
Understanding Social Media’s Impact on Business
 
Competitive deck shortened version 3.16.12 final
Competitive deck shortened version 3.16.12   finalCompetitive deck shortened version 3.16.12   final
Competitive deck shortened version 3.16.12 final
 
371 Employment
371 Employment371 Employment
371 Employment
 

Viewers also liked

Daejeon IT Developer Conference Hibernate3
Daejeon IT Developer Conference Hibernate3Daejeon IT Developer Conference Hibernate3
Daejeon IT Developer Conference Hibernate3plusperson
 
JPA 프로그래밍 (1)
JPA 프로그래밍 (1)JPA 프로그래밍 (1)
JPA 프로그래밍 (1)Bryan Choi
 
객체지향 철학 그리고 5대 개념
객체지향 철학 그리고 5대 개념객체지향 철학 그리고 5대 개념
객체지향 철학 그리고 5대 개념중선 곽
 
[강의소개] 안드로이드 앱 개발 입문 캠프 4기
[강의소개] 안드로이드 앱 개발 입문 캠프 4기[강의소개] 안드로이드 앱 개발 입문 캠프 4기
[강의소개] 안드로이드 앱 개발 입문 캠프 4기FAST CAMPUS
 
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30Donghan Kim
 
Ksug2015 - JPA1, JPA 소개
Ksug2015 - JPA1, JPA 소개Ksug2015 - JPA1, JPA 소개
Ksug2015 - JPA1, JPA 소개Younghan Kim
 
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프Younghan Kim
 
Beyond Java: 자바 8을 중심으로 본 자바의 혁신
Beyond Java: 자바 8을 중심으로 본 자바의 혁신Beyond Java: 자바 8을 중심으로 본 자바의 혁신
Beyond Java: 자바 8을 중심으로 본 자바의 혁신Sungchul Park
 
자바 네트워크 소녀 Netty 리뷰
자바 네트워크 소녀 Netty 리뷰자바 네트워크 소녀 Netty 리뷰
자바 네트워크 소녀 Netty 리뷰Woojin Joe
 
객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)Seung-June Lee
 
SpringMVC 전체 흐름 알아보기
SpringMVC 전체 흐름 알아보기SpringMVC 전체 흐름 알아보기
SpringMVC 전체 흐름 알아보기Myung Woon Oh
 
[강의] OOP 개요
[강의] OOP 개요[강의] OOP 개요
[강의] OOP 개요Nohyun Kee
 

Viewers also liked (14)

Daejeon IT Developer Conference Hibernate3
Daejeon IT Developer Conference Hibernate3Daejeon IT Developer Conference Hibernate3
Daejeon IT Developer Conference Hibernate3
 
JPA 프로그래밍 (1)
JPA 프로그래밍 (1)JPA 프로그래밍 (1)
JPA 프로그래밍 (1)
 
객체지향 철학 그리고 5대 개념
객체지향 철학 그리고 5대 개념객체지향 철학 그리고 5대 개념
객체지향 철학 그리고 5대 개념
 
[강의소개] 안드로이드 앱 개발 입문 캠프 4기
[강의소개] 안드로이드 앱 개발 입문 캠프 4기[강의소개] 안드로이드 앱 개발 입문 캠프 4기
[강의소개] 안드로이드 앱 개발 입문 캠프 4기
 
Team Janel
Team JanelTeam Janel
Team Janel
 
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
제2회 사내기술세미나-no sql(배표용)-d-hankim-2013-4-30
 
Java JPA
Java JPAJava JPA
Java JPA
 
Ksug2015 - JPA1, JPA 소개
Ksug2015 - JPA1, JPA 소개Ksug2015 - JPA1, JPA 소개
Ksug2015 - JPA1, JPA 소개
 
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
 
Beyond Java: 자바 8을 중심으로 본 자바의 혁신
Beyond Java: 자바 8을 중심으로 본 자바의 혁신Beyond Java: 자바 8을 중심으로 본 자바의 혁신
Beyond Java: 자바 8을 중심으로 본 자바의 혁신
 
자바 네트워크 소녀 Netty 리뷰
자바 네트워크 소녀 Netty 리뷰자바 네트워크 소녀 Netty 리뷰
자바 네트워크 소녀 Netty 리뷰
 
객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)
 
SpringMVC 전체 흐름 알아보기
SpringMVC 전체 흐름 알아보기SpringMVC 전체 흐름 알아보기
SpringMVC 전체 흐름 알아보기
 
[강의] OOP 개요
[강의] OOP 개요[강의] OOP 개요
[강의] OOP 개요
 

More from beom kyun choi

옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개beom kyun choi
 
DDD로 복잡함 다루기
DDD로 복잡함 다루기DDD로 복잡함 다루기
DDD로 복잡함 다루기beom kyun choi
 
TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나beom kyun choi
 
keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)beom kyun choi
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀beom kyun choi
 
Ddd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugDdd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugbeom kyun choi
 
파이썬 언어 기초
파이썬 언어 기초파이썬 언어 기초
파이썬 언어 기초beom kyun choi
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128beom kyun choi
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유beom kyun choi
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰beom kyun choi
 
ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료beom kyun choi
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)beom kyun choi
 
리뷰의 기술 소개
리뷰의 기술 소개리뷰의 기술 소개
리뷰의 기술 소개beom kyun choi
 
스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해beom kyun choi
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개beom kyun choi
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개beom kyun choi
 

More from beom kyun choi (20)

옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
 
DDD로 복잡함 다루기
DDD로 복잡함 다루기DDD로 복잡함 다루기
DDD로 복잡함 다루기
 
TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나
 
keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)
 
DDD 준비 서문래
DDD 준비 서문래DDD 준비 서문래
DDD 준비 서문래
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀
 
Ddd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugDdd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksug
 
MVP 패턴 소개
MVP 패턴 소개MVP 패턴 소개
MVP 패턴 소개
 
파이썬 언어 기초
파이썬 언어 기초파이썬 언어 기초
파이썬 언어 기초
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유
 
Spring Boot 소개
Spring Boot 소개Spring Boot 소개
Spring Boot 소개
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰
 
ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
 
리뷰의 기술 소개
리뷰의 기술 소개리뷰의 기술 소개
리뷰의 기술 소개
 
스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개
 
Zookeeper 소개
Zookeeper 소개Zookeeper 소개
Zookeeper 소개
 

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

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