Your SlideShare is downloading. ×
Daejeon IT Developer Conference Hibernate3
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Daejeon IT Developer Conference Hibernate3

1,224
views

Published on

Daejeon IT Developer Conference Hibernate3 Print

Daejeon IT Developer Conference Hibernate3 Print

Published in: Technology

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,224
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • 저는 NHN 에 근무하고 있는 이동국입니다 . iBATIS 관련 문서를 번역해서 아마 제 이름이 익숙하신 분들도 꽤 되시리라 생각됩니다 . ^^ 오늘 오신 분들이 모두 원하는 바가 다르기 때문에 일반적인 수준에서 공통적으로 사용하는 부분에 대해 한번 살펴보고 주로 사용하셨던 분들은 한번 다시 되새겨보는 시간이 되었으면 합니다 .
  • Transcript

    • 1. 본 문서의 배포 및 변경 , 출력 및 활용에 관한 모든 권리는 작성자에 있습니다 . 본 서비스는 제 1 회 대전 IT 개발자 커뮤니티 참석자를 위해 제공됩니다 .
    • 2. 하이버네이트 프로그래밍 기초 & 객체 지향 지원 최범균 다음커뮤니케이션 September 28 th , 2008
    • 3. 목차
      • 강의 목적
      • ORM 과 하이버네이트
      • 하이버네이트 기초 사용법
      • 객체 지향과 하이버네이트
      • 하이버네이트 도입절차
      • 맺음말
      • 참고자료
    • 4. 강의 목적
      • ORM 에 대한 이해와 하이버네이트 소개
      • 하이버네이트 기초 사용법 설명
      • 하이버네이트의 객체 지향 지원 기능 소개
      • 하이버네이트 도입 절차 안내
      강의 목적
    • 5.
      • 대다수 웹 프로그래밍은 영속 데이터를 필요로 함
      • 회원 정보 , 게시판 , 사진함 등 전체 또는 일부 데이터는 영속성을 가짐
      • 데이터의 영속성을 위해 많이 사용되는 것 – 관계형 데이터베이스 (RDBS)
      • 서버측 개발자 작업 중 높은 비중을 차지하는 것
      • 데이터 관리를 위한 SQL 작성
      • SELECT 쿼리를 실행하고 , 실행 결과를 자바 객체에 저장
      • INSERT, UPDATE 쿼리 실행 시 필요한 값 자바 객체에 저장
      • 테이블과 객체의 매핑 필요성
      • 쿼리 결과를 자바 객체로 변환해주는 코드를 작성하는 것은 성가심
      • 자바 객체의 값을 쿼리에 바인딩 시키는 코드를 작성하는 것은 성가심
      • 두 과정을 간단한 코드 / 설정 만으로 처리해주는 기능의 필요성
      테이블과 객체 매핑의 필요성 ORM 과 하이버네이트
    • 6.
      • 상속과 다형성의 불일치
      • 객체 지향에서는 상위 타입을 이용해서 해당 계층에 포함된 객체들의 공통 데이터를 표현할 수 있지만 , 테이블은 상위 테이블 / 하위 테이블 같은 개념을 지원하지 않는다 .
      • 연관의 불일치
      • RDBMS 의 참조키는 단방향인데 반해 , 객체는 양방향 연관이 가능하다 .
      • 자바와 같은 객체 지향 언어는 Set, List 와 같은 컬렉션 타입을 지원하지는 RDBMS 는 참조키를 사용할 뿐이다 .
      • 세밀함의 불일치
      • RDBMS 에서는 테이블을 기준으로 표현 단위가 결정되면 , 객체 지향에서는 객체 단위로 표현 단위가 결정된다 . 1 개의 테이블에 저장된 데이터를 1 개 이상의 클래스를 이용해서 표현할 수 있다 .
      관계형 데이터베이스와 객체의 불일치 ORM 과 하이버네이트
    • 7.
      • DB 처리를 위한 코드가 객체 모델링에 제약을 가져옴
      • 객체 지향을 지원하는 ORM 도구를 직접 만들기는 쉽지 않음
      • 단순 코드의 반복 제거
      • some.setMaxAge(rs.getInt()), pstmt.setString(3, some.getTitle()) 등 객체와 테이블 사이의 매핑을 처리하기 위한 코드의 감소
      • 코드 품질의 향상
      • 비지니스 로직에 집중하게 됨으로써 코드 품질 향상
      ORM 도구의 필요성 ORM 과 하이버네이트
    • 8.
      • 메타 데이터를 통한 매핑 설정이 가능해야 함
      • 설정 파일이나 어노테이션을 이용한 매핑 설정이 가능해야 함
      • 다양한 연관의 지원
      • 1-1, 1-N, N-M 연관 , 양방향 연관의 지원
      • 컬렉션 테이블 ( 또는 조인 테이블 ) 을 이용한 연관 매핑 지원
      • Set, List, Map 등 컬렉션 타입 지원
      • 상속 및 다형성 지원
      • 클래스 상속 계층에 대한 매핑 지원
      • 타입을 이용한 조회 지원
      • 객체 프로퍼티에 기반한 쿼리 지원
      • 객체의 프로퍼티를 이용한 쿼리 지원
      ORM 도구의 필수 조건 ORM 과 하이버네이트
    • 9.
      • 풍부한 객체 지향 특징 지원
      • 자바의 컬렉션 타입을 이용한 연관 지원
      • 다양한 상속 매핑 방식 지원
      • POJO 지원
      • ORM 을 위한 별도의 인터페이스나 클래스를 구현 / 상속할 필요가 없다 .
      • 자동 영속성 관리
      • 객체의 프로퍼티 변경을 자동으로 반영해준다 .
      • 영속성 전이를 통해 연관된 객체 간의 영속성을 관리해준다 .
      • 성능 향상 방법 제공
      • 늦은 로딩 , 조인 기반 조회 , 네이티브 쿼리 , 캐시 등 성능 개선 방법 제공
      하이버네이트인 이유 ORM 과 하이버네이트
    • 10.
      • 하이버네이트를 이용한 프로그래밍 절차
      • 1. 영속 클래스 작성
      • 2. 데이터베이스 스키마 생성
      • 3. 클래스와 테이블의 매핑 파일 작성
      • 4. 하이버네이트 설정 파일 작성
      • 5. SessionFactory 설정
      • 6. 하이버네이트를 이용한 CRUD 작성
      프로그램 절차 하이버네이트 기초 사용법
    • 11.
      • 기본 생성자를 제공해야 함 ( 필수 )
      • 데이터베이스 식별자 컬럼과 매핑될 필드 제공 ( 추천 )
      • 영속 클래스를 final 로 지정하지 않음 ( 추천 )
      • 클래스 필드를 위한 Set/Get 메소드를 제공 ( 추천 )
      • equals() 메소드와 hashCode() 메소드 제공 ( 선택 )
      영속 클래스 작성법 하이버네이트 기초 사용법
    • 12.
      • <hibernate-mapping>
      • <class name=&quot;Product&quot; table=&quot;PRODUCT&quot;>
      • <id name=&quot;id&quot; column=&quot;PRODUCT_ID&quot;>
      • <generator name=&quot;identity&quot; />
      • </id>
      • <property name=&quot;name&quot; column=&quot;NAME&quot; type=&quot;string&quot; />
      • ....
      • </class>
      • </hibernate-mapping>
      • <class> - 클래스와 테이블의 매핑 설정
        • name – 클래스 이름 , table – 테이블 이름
      • <id> - 테이블의 PK 와 매핑될 ( 식별 ) 프로퍼티 매핑 설정
        • name – 프로퍼티 이름 , column – 매핑될 컬럼 이름
        • type – 하이버네이트 매핑 타입
      • <generator> - 객체 저장 시 식별 프로퍼티의 값 생성기 설정
      • <property> - 객체 프로퍼티와 테이블 컬럼 사이의 매핑 설정
        • name – 프로퍼티 이름 , column – 매핑될 컬럼 이름
        • type – 하이버네이트 매핑 타입
      클래스와 테이블 매핑 설정 파일 작성 하이버네이트 기초 사용법
    • 13. DB 연결 Dialect 설정 매핑파일 설정 <hibernate-configuration> <session-factory> <property name=&quot;hibernate.connection.driver_class&quot;> … </property> <property name=&quot;hibernate.connection.url&quot;>…</property> … <property name=&quot;hibernate.dialect&quot;> org.hibernate.dialect.OracleDialect </property> <mapping resource=&quot;Product.hbm.xml&quot; /> … </session-factory> </hibernate-configuration> 하이버네이트 설정 하이버네이트 기초 사용법
    • 14.
      • SessionFactory 생성
      • SessionFactory sessionFactory =
      • new Configuration().configure().buildSessionFactory();
      • SessionFactory 를 이용하여 Session 참조
      • Session session = sessionFactory.getCurrentSession();
      • Session 을 사용하여 DB 관련 작업 실행
      • session.save(someObject);
      하이버네이트를 이용한 DB 처리 1 – 세션 초기화 하이버네이트 기초 사용법
    • 15.
      • Sesstion 이 제공하는 CRUD 관련 메소드
      하이버네이트를 이용한 DB 처리 2 – CRUD 처리 하이버네이트 기초 사용법 메서드 설명 Serializable save(Object) 객체를 저장한다 . 저장 시 사용될 키 값을 리턴한다 . void persist(Object) 객체를 저장한다 . Object get(Class, Serializable) 해당 타입의 지정한 키 값을 갖는 객체를 리턴한다 . 존재하지 않을 경우 null 을 리턴 한다 . Object load(Class,Serizliable) 해당 타입의 지정한 키 값에 대한 프록시 객체를 리턴한다 . 프록시 객체는 객체가 실제로 사용될 때 DB 에서 값을 가져온다 . 실세 사용시 DB 에 매핑되는 데이터가 존재하지 않으면 예외를 발생시킨다 . delete(Object) 객체와 매핑되는 테이블의 행을 삭제한다 . update(Object) 객체의 변경된 값을 DB 에 반영한다 .
    • 16.
      • 객체 저장
      • Product product = new Product();
      • ...
      • Integer newId = (Integer) session.save(product);
      • 객체 로딩
      • Integer id = new Integer(20);
      • Product product = (Product) sesstion.get(Product.class), id);
      • if (product != null) {
      • ...
      • }
      • ...
      • 객체 삭제
      • sesstion.delete(abuseArticle);
      CRUD 관련 사용 예 하이버네이트 기초 사용법
    • 17. 세션에서 로딩한 객체의 프로퍼티가 변경될 경우 , 트랜잭션 커밋 시 자동으로 변경된 내역이 DB 에 반영
      • 세션 범위 내에서 변경된 객체의 값은 자동으로 DB 에 반영된다 .
      • 코드에서 변경된 값을 반영하기 위해 별도의 코드를 작성할 필요 없음
      • tx = session.beginTransaction();
      • Order order = (Order)session.get(Order.class, orderId);
      • order.setState(OrderState.CANCEL);
      • tx.commit();
      영속성 처리의 투명함 (Transparent Persistence) 하이버네이트 기초 사용법
    • 18.
      • 객체 (Entity) 타입
      • 고유의 식별값을 갖는다 .
      • 부모 객체가 삭제된다고 해서 반드시 삭제되는 것은 아니다 .
      • 여러 객체에 의해 공유될 수 있다 .
      • 값 (Value) 타입
      • 고유의 식별값을 갖지 않는다 .
      • 부모 객체가 삭제되면 함께 삭제된다 .
      • 여러 객체에 공유되지 않는다 .
      • 예 ) 우편번호 , 주소정보를 담는 Address 클래스
      객체 (Entity) 타입과 값 (Value) 타입 객체 지향과 하이버네이트
    • 19.
      • 값 타입에 대한 매핑 지원
      • <component> 태그를 이용하여 값 타입에 대한 매핑 지원
      • 엔티티 간 매핑 지원
      • 1-1, 1-N, N-1, N-M 연관 지원 컬렉션 API 를 통한 1-N, 연관 지원 – Set, List, Map
      • 컬렉션 테이블을 이용한 1-N, N-1, N-M 연관 지원
      객체간 연관 매핑 지원 객체 지향과 하이버네이트
    • 20.
      • <component> 태그를 이용한 컴포넌트 타입 매핑 설정
      • <class name=&quot;Employee&quot; table=&quot;EMPLOYEE&quot;>
      • <component name=&quot;koreanName&quot; class=&quot;Name&quot;>
      • <property name=&quot;surname&quot; column=&quot;KOR_SURNAME&quot; />
      • <property name=&quot;name&quot; column=&quot;KOR_NAME&quot; />
      • </compoent>
      • </class>
      korName 값 타입 매핑 객체 지향과 하이버네이트
    • 21.
      • <one-to-one> 태그를 이용하여 상호간의 1-1 연관 설정
      • <class name=&quot;Employee&quot; table=&quot;EMPLOYEE&quot;>
      • < one-to-one name=&quot;detail&quot; class=&quot;EmployeeDetail&quot; … />
      • </class>
      • <class name=&quot;EmployeeDetail&quot; table=&quot;EMPLOYEE_DETAIL&quot;>
      • <id name=&quot;id&quot; column=&quot;RESUME_ID&quot;>
      • <generator class=&quot; foreign &quot;>
      • <param name=&quot;property&quot;>employee</param>
      • </generator>
      • </id>
      • < one-to-one name=&quot;employee&quot; class=&quot;Employee“ constrained =&quot;true&quot; />
      • </class>
      1-1 연관 : 동일한 키 값 공유 방식 객체 지향과 하이버네이트
    • 22.
      • <many-to-one> 태그를 이용하여 매핑 설정
      • <class name=&quot;Comment&quot; table=&quot;COMMENT&quot;>
      • <id name=&quot;id&quot; column=&quot;ID&quot;>
      • <generator class=&quot;identity&quot; />
      • </id>
      • < many-to-one name=&quot;article&quot; class=&quot;Article“ column=&quot;ARTICLE_ID&quot; />
      • </class>
      • <class name=&quot;Article&quot; table=&quot;ARTICLE&quot;>
      • </class>
      N-1 연관 객체 지향과 하이버네이트
    • 23.
      • <one-to-one> 과 <many-to-one> 태그를 이용하여 매핑 설정
      • <class name=&quot;User&quot; table=&quot;USER&quot;>
      • ...
      • <one-to-one name=&quot;resume&quot; class=&quot;Resume&quot; property-ref =&quot;user&quot; … />
      • ...
      • </class>
      • <class name=&quot;Resume&quot; table=&quot;RESUME&quot;>
      • ...
      • < many-to-one name=&quot;user&quot; class=&quot;User&quot; column=&quot;USER_ID&quot; unique =&quot;true&quot; />
      • </class>
      1-1 연관 : 참조키를 이용한 방식 객체 지향과 하이버네이트
    • 24.
      • 컬렉션 API 를 이용하여 1-N 연관 지원
      • Collection(Bag), Set, List, Map 콜렉션 지원
      • <bag>, <set>, <list>, <map> 태그를 이용하여 콜렉션 타입 설정
      • <element>, <composite-element>, <one-to-many> 를 이용하여 엘리먼트 , 컴포넌트 , 엔티티에 대한 1-n 관계 설정
      • <set> 을 이용한 매핑 설정 예
      • <class name=&quot;Item&quot; table=&quot;ITEM&quot;>
      • < set name=&quot;bids&quot; table=&quot;BID&quot; >
      • <key column=&quot;ITEM_ID&quot; />
      • < one-to-many class=&quot;Bid&quot; />
      • </set>
      • </class>
      • <class name=&quot;Bid&quot; table=&quot;BID&quot;>...</class>
      컬렉션 프로퍼티를 이용한 1-N 연관 객체 지향과 하이버네이트
    • 25.
      • 기본적으로 영속성 상태의 변화는 연관된 객체에 전파되지 않는다 .
      • Order order = new Order();
      • order.addOrderLine(orderLine1);
      • session.save(order); // Order 만 저장되고 OrderLine 은 저장되지 않음
      • cascade 속성을 사용하여 연관된 객체에 영속성 변화를 전파한다 .
      • <class name=&quot;Order&quot; table=&quot;ORDER&quot;>
      • <set name=&quot;orderLines&quot; cascade=&quot;save-update&quot; >
      • <key column=&quot;ORDER_ID&quot; />
      • <one-to-many class=&quot;OrderLine&quot; />
      • </set>
      • </class>
      • <class name=&quot;OrderLine&quot; table=&quot;ORDER_LINE&quot;>…</class>
      엔티티 간 영속성 전이 객체 지향과 하이버네이트
    • 26.
      • 세 가지 방식을 통한 상속 매핑 구현
      • 1. 클래스 계층당 1 개의 테이블 매핑
      • 매핑이 쉽고 , 성능이 좋다 .
      • 하위 클래스 프로퍼티와 매핑되는 컬럼의 경우 NOT NULL 로 설정할 수 없다 .
      • 하위 클래스가 추가시 테이블 변경이 필요하다 .
      • 2. 클래스 당 1 개의 테이블 매핑
      • 데이터가 정규화 된다 .
      • 계층도가 복잡해지면 성능이 나빠진다 .
      • 3. 인스턴스 생성 가능한 클래스 당 1 개의 테이블 매핑
      • 하위 타입 조회시 조인이 불필요하다 .
      • 생성기 등 키 값 사용에 제약이 있다 .
      • 비정규화 되어 있다 .
      상속 매핑 지원 객체 지향과 하이버네이트
    • 27.
      • HQL 을 이용한 객체 기반 조회 가능
      • Query query = session.createQuery(
      • &quot;from Product p where p.price > :minPrice&quot;);
      • query.setInt(&quot;minPrice&quot;, minValue);
      • query.setMaxResults(pageSize);
      • List productList = query.list();
      • Criteria 를 이용하여 API 를 이용한 객체 기반 조회 가능
      • Criteria crit = session.createCriteria(Product.class);
      • crit.add(Restrictions.gt(&quot;price&quot;, minValue));
      • crit.setMaxResults(pageSize);
      • List productList = crit.list();
      객체에 기반한 쿼리 객체 지향과 하이버네이트
    • 28.
      • 처음부터 하이버네이트의 모든 것을 적용해보려는 욕심은 금물
      • 시작은 단순 매핑부터 해야 함
      • 예 ) 단순 매핑 방법과 HQL 사용법 습득 후 빠른 개발이 가능했음
      • 재사용한 가능한 값 타입을 추가함으로써 모델 정교화
      • 하이버네이트 API 가 익숙해지면 아래의 매핑에 대해 적용
      • 값 타입에 대한 1-N
      • 엔티티 타입에 대한 1-1, N-1 연관
      • 이후 엔티티 간 1-N, N-M 연관을 적용
      하이버네이트 도입 절차 도입 방법 및 맺음말
    • 29.
      • 하이버네이트는 객체 지향 기반 도메인 설계를 도와준다 .
      • 1. 비즈니스 도메인에 집중할 수 있도록 도와줌
      • 퍼시스턴스 영역은 간단한 설정으로 완료
      • 2. 모델이 풍부해짐
      • 3. 코드의 품질 향상 , 전체 코드 수 감소
      • 가독성 향상 , 유지보수 용이성 증가
      • 하이버네이트에 대한 오해
      • 1. 어렵다 .
      • 객체 기반의 설계가 어려운 것이지 , 하이버네이트가 어려운 것이 아니다 .
      • 2. 성능이 나쁘다 .
      • 성능이 문제가 되는 부분은 전체 코드의 5~10% 에 해당되며 , 1 차 캐시 /2 차 캐시를 통한 성능 향상이 가능
      • 전체적인 개발 속도를 향상시키고 , 성능 이슈가 발생하는 곳만 집중하여 해소 가능
      • 예 ) 일부 코드는 네이티브 SQL 을 이용하여 쿼리 직접 실행
      맺음말 도입 방법 및 맺음말
    • 30.
      • 관련 사이트
      • 하이버네이트 - http://www.hibernate.org
      • 레퍼런스 - http://www.hibernate.org/hib_docs/v3/reference/en/html_single
      • 위키 - http://www.hibernate.org/37.html
      • 관련 서적
      • 하이버네이트 3 프로그래밍 ( 최범균 , 가메출판사 )
      • Java Persistence API with Hibernate (Christian Bauer 와 Gavin King, Manning)
      • Pro EJB 3 Java Persistence API (Mike Keith 와 Merrick Schincariol, APress)
      • Domain Driven Design (Eric Evans, Addison-Wesley)
      • POJOs in Action (Chris Richardson, Manning)
      참고 자료 참고자료
    • 31. 감사합니다 .

    ×