SlideShare a Scribd company logo
1 of 30
하이버네이트
기초&객체 지향 지원에 대하여
처음 떠오르는 코드는?
이 시간의 목적
* ORM과 하이버네이트 이해
* 객체 지향/ 도메인에 대한 호기심 자극
살펴볼 내용
* ORM과 하이버네이트
* 하이버네이트 기초 사용법
* 하이버네이트 객체 지향 지원
* 맺음말
ORM과 하이버네이트
관계형 DB != 객체 지향
ORM(Object-relational mapping)이란?
ORM(Object-relational mapping) 이 제공해야 하는 기능
- 객체를 table에 저장해 주고, table에 저장된 data로부터 객체를 생성
- Metadata 사용 object 와 table 사이의 mapping 정보 지정
- Class 상속, 객체 사이의 연관 등을 객체 modeling으로 지원해야 한다
- Class와 Class의 property을 사용하여 객체를 조회할 수 있어야 한다
- 객체 값 변경을 자동으로 database에 반영해야 한다
- 상황에 따라서 성능을 개선할 수 있는 방법을 제공해야 한다.
- Join 기반 조회
- Native query
- Cache
ORM 과 매퍼 솔루션들
ORM 장점 / 단점
장점 단점
- 생산성 향상
: query + 객체 생성 코드 작성 불필요 , Biz
logic에 집중
- 유지 보수 용이
: JDBC, ADO.NET API 통한 코드 축소
- 리펙토링 용이
: 특정 DBMS 에 비종속적
- DAO 패턴에 익숙한 개발자는 초기 어려움
- ORM 을 잘못 사용할 경우 성능 저하 우려
- OLAP 또는 프로시져가 많은 시스템의 경우
에는 객체 지향적인 장점 활용이 제한적
하이버네이트인 이유
= 쉬운 사용방법
- 설정 파일을 통한 매핑 관리
= 객체 지향의 다양한 특징 지원
- 다양한 연관 매핑 지원 (1:1, 1:N, N:1, N:M)
- 상속지원
= 다양한 테이블 구조에 대한 매핑 지원
= 객체 기반 쿼리 지원 : HQL Criteria
= 성능 향상 기법 제공
- 2차 캐시, Lazy loading 등
ORM 도구가 필요한 이유
하이버네이트 기초 사용법
• 프로그래밍 절차
• 매핑 설정 파일 작성
Brand.java
@OneToMany(mappedBy="brand",fetch=FetchType.EAGER)
public Set<BrandImage> getBrandImagelist() {
return brandImagelist;
}
public void setBrandImagelist(Set<BrandImage> brandImagelist) {
this.brandImagelist = brandImagelist;
}
Hibernate.cfg.xml
<mapping class="net.fashiongo.admin.common.entity.Brand"/>
<mapping class="net.fashiongo.admin.common.entity.BrandImage"/>
• 클래스 작성법
@Table(name="brand", schema="public")
public class Brand extends BaseEntity implements Serializable {
private static final long serialVersionUID = 178207897968591488L;
private Integer brandId; // PK와 매핑되는 프로퍼티 제공
private String brandName;
private String description;
~
private Set<BrandImage> brandImagelist = new HashSet<BrandImage>();
public Brand() {} // 기본 생성자 제공
@Id
@SequenceGenerator(name="pk_sequence",sequenceName="public.brand_id_seq", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence")
@Column(name = "brand_id", unique=true, nullable=false)
public Integer getBrandId() { // getter/setter 제공
return brandId;
}
public void setBrandId(Integer brandId) {
this.brandId = brandId;
}
• 하이버네이트 설정 파일 작성 (hibernate.cfg.xml)
<hibernate-configuration>
<session-factory>
<mapping class="net.fashiongo.admin.common.entity.Brand"/> //매핑 설정
<mapping class="net.fashiongo.admin.common.entity.BrandImage"/>
<mapping class="net.fashiongo.admin.common.entity.Category"/>
<mapping class="net.fashiongo.admin.common.entity.Stockist"/>
<mapping class="net.fashiongo.admin.common.entity.CityFactor"/>
<mapping class="net.fashiongo.admin.common.entity.Item"/>
<mapping class="net.fashiongo.admin.common.entity.PurchaseSource"/>
<mapping class="net.fashiongo.admin.common.entity.Store"/>
<mapping class="net.fashiongo.admin.common.entity.StoreImage"/>
<mapping class="net.fashiongo.admin.common.entity.StoreBusinesshours"/>
~
<mapping class="net.fashiongo.admin.explore.model.MapCityExplore"/>
<mapping class="net.fashiongo.admin.explore.model.Popular"/>
</session-factory>
</hibernate-configuration>
• Hibernate type
• Hibernate type
• 하이버네이트 설정 파일 작성 (application.properties)
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
jdbc.url=jdbc:postgresql://192.168.0.XXX:5432/XXX?schema=admin
jdbc.usernane=postgres
jdbc.password=XXXX
• SessionFactory API
• SessionFactory 초기화
import org.hibernate.SessionFactory;
@Repository
public class BrandDaoImpl implements BrandDao{
private SessionFactory sessionFactory;
@Autowired //초기화
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Override
public List<Brand> selectBrandList(SearchParam searchParam) {
StringBuffer brandListQueryBuffer = new StringBuffer(" SELECT brand.* from public.brand brand "+searchParam.getBrandSqlQuery());
brandListQueryBuffer.append(" ORDER BY brand.brand_id desc ");
if(StringUtils.isNotEmpty(searchParam.getCurrentPage())){
brandListQueryBuffer.append( " limit " + searchParam.getDefaultPageSize() + " offset " + searchParam.getStartRecord() );
}
return sessionFactory.getCurrentSession() //session을 이용한 CRUD 처리
.createSQLQuery(brandListQueryBuffer.toString())
.addEntity("brand",Brand.class).list();
}
• 기본 CRUD API :
Blog blog = new blog();
blog.setName(..);
blog.setImage(ImageUser);
sessionFactory.getCurrentSession().save(blog);
sessionFactory.getCurrentSession().update(blog);
sessionFactory.getCurrentSession().delete(blog);
sessionFactory.getCurrentSession().get(blog);
• 쿼리 API
하이버네이트의 객체 지향 지원
하이버네이트의 연관 지원
• Collection 매핑
연관 매핑 예 – 1:1 PK 공유
연관 매핑 예 – 1:N / N:1 연관
@Table(name="brand", schema="public")
public class Brand extends BaseEntity implements Serializable {
private static final long serialVersionUID = 178207897968591488L;
private Integer brandId;
private String brandName;
~
private Set<BrandImage> brandImagelist = new HashSet<BrandImage>();
~
@OneToMany(mappedBy="brand",fetch=FetchType.EAGER)
public Set<BrandImage> getBrandImagelist() {
return brandImagelist;
}
<li>
<a style="cursor: zoom-in;"
href="#">
<img
src="${brandImagelist.webImage}"
id="brandImageWeb_${brandImagelis
t.brandImageId}">
</a>
</li>

More Related Content

Similar to Hibernate 기초

MyBatis에서 JPA로
MyBatis에서 JPA로MyBatis에서 JPA로
MyBatis에서 JPA로Dongmin Shin
 
Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기Kyoung Up Jung
 
[2018] MyBatis에서 JPA로
[2018] MyBatis에서 JPA로[2018] MyBatis에서 JPA로
[2018] MyBatis에서 JPA로NHN FORWARD
 
좌충우돌 ORM 개발기 2012 DAUM DEVON
좌충우돌 ORM 개발기 2012 DAUM DEVON좌충우돌 ORM 개발기 2012 DAUM DEVON
좌충우돌 ORM 개발기 2012 DAUM DEVONYounghan Kim
 
알아봅시다, Polymer: Web Components & Web Animations
알아봅시다, Polymer: Web Components & Web Animations알아봅시다, Polymer: Web Components & Web Animations
알아봅시다, Polymer: Web Components & Web AnimationsChang W. Doh
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기NAVER Engineering
 
[162] jpa와 모던 자바 데이터 저장 기술
[162] jpa와 모던 자바 데이터 저장 기술[162] jpa와 모던 자바 데이터 저장 기술
[162] jpa와 모던 자바 데이터 저장 기술NAVER D2
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Choonghyun Yang
 
Software Architect day - 웹 프레임워크 종결 - metaworks3
Software Architect day - 웹 프레임워크 종결 -  metaworks3Software Architect day - 웹 프레임워크 종결 -  metaworks3
Software Architect day - 웹 프레임워크 종결 - metaworks3uEngine Solutions
 
[오픈소스컨설팅]MyBatis Basic
[오픈소스컨설팅]MyBatis Basic[오픈소스컨설팅]MyBatis Basic
[오픈소스컨설팅]MyBatis BasicJi-Woong Choi
 
Yapp a.a 2 2 sugar orm
Yapp a.a 2 2 sugar ormYapp a.a 2 2 sugar orm
Yapp a.a 2 2 sugar ormJunyoung Lee
 
First Step In Ajax Korean
First Step In Ajax KoreanFirst Step In Ajax Korean
First Step In Ajax KoreanTerry Cho
 
좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012Daum DNA
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용중선 곽
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Hyosang Hong
 
7가지 동시성 모델 람다아키텍처
7가지 동시성 모델  람다아키텍처7가지 동시성 모델  람다아키텍처
7가지 동시성 모델 람다아키텍처Sunggon Song
 
Dependency Injection 소개
Dependency Injection 소개Dependency Injection 소개
Dependency Injection 소개beom kyun choi
 

Similar to Hibernate 기초 (20)

MyBatis에서 JPA로
MyBatis에서 JPA로MyBatis에서 JPA로
MyBatis에서 JPA로
 
Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기
 
[2018] MyBatis에서 JPA로
[2018] MyBatis에서 JPA로[2018] MyBatis에서 JPA로
[2018] MyBatis에서 JPA로
 
좌충우돌 ORM 개발기 2012 DAUM DEVON
좌충우돌 ORM 개발기 2012 DAUM DEVON좌충우돌 ORM 개발기 2012 DAUM DEVON
좌충우돌 ORM 개발기 2012 DAUM DEVON
 
알아봅시다, Polymer: Web Components & Web Animations
알아봅시다, Polymer: Web Components & Web Animations알아봅시다, Polymer: Web Components & Web Animations
알아봅시다, Polymer: Web Components & Web Animations
 
3-2. selector api
3-2. selector api3-2. selector api
3-2. selector api
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
 
[162] jpa와 모던 자바 데이터 저장 기술
[162] jpa와 모던 자바 데이터 저장 기술[162] jpa와 모던 자바 데이터 저장 기술
[162] jpa와 모던 자바 데이터 저장 기술
 
Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)Spring boot 공작소(1-4장)
Spring boot 공작소(1-4장)
 
Software Architect day - 웹 프레임워크 종결 - metaworks3
Software Architect day - 웹 프레임워크 종결 -  metaworks3Software Architect day - 웹 프레임워크 종결 -  metaworks3
Software Architect day - 웹 프레임워크 종결 - metaworks3
 
Asp.net Razor
Asp.net Razor Asp.net Razor
Asp.net Razor
 
[오픈소스컨설팅]MyBatis Basic
[오픈소스컨설팅]MyBatis Basic[오픈소스컨설팅]MyBatis Basic
[오픈소스컨설팅]MyBatis Basic
 
Yapp a.a 2 2 sugar orm
Yapp a.a 2 2 sugar ormYapp a.a 2 2 sugar orm
Yapp a.a 2 2 sugar orm
 
Java JPA
Java JPAJava JPA
Java JPA
 
First Step In Ajax Korean
First Step In Ajax KoreanFirst Step In Ajax Korean
First Step In Ajax Korean
 
좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
 
Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료Jpa 쿼리 포함 자료
Jpa 쿼리 포함 자료
 
7가지 동시성 모델 람다아키텍처
7가지 동시성 모델  람다아키텍처7가지 동시성 모델  람다아키텍처
7가지 동시성 모델 람다아키텍처
 
Dependency Injection 소개
Dependency Injection 소개Dependency Injection 소개
Dependency Injection 소개
 

More from Jong Woo Rhee

More from Jong Woo Rhee (10)

Jpa 필드 와 컬럼 매핑 레퍼런스
Jpa 필드 와 컬럼 매핑 레퍼런스Jpa 필드 와 컬럼 매핑 레퍼런스
Jpa 필드 와 컬럼 매핑 레퍼런스
 
Git hub repository 관리 방안
Git hub repository 관리 방안Git hub repository 관리 방안
Git hub repository 관리 방안
 
Connection pool
Connection poolConnection pool
Connection pool
 
RabbitMQ
RabbitMQRabbitMQ
RabbitMQ
 
Postgresql stored procedure
Postgresql stored procedurePostgresql stored procedure
Postgresql stored procedure
 
Ionic project guide
Ionic project guideIonic project guide
Ionic project guide
 
Ionics구조
Ionics구조Ionics구조
Ionics구조
 
Java8 람다
Java8 람다Java8 람다
Java8 람다
 
Glances
GlancesGlances
Glances
 
Jmeter
JmeterJmeter
Jmeter
 

Hibernate 기초

  • 3.
  • 4. 이 시간의 목적 * ORM과 하이버네이트 이해 * 객체 지향/ 도메인에 대한 호기심 자극
  • 5. 살펴볼 내용 * ORM과 하이버네이트 * 하이버네이트 기초 사용법 * 하이버네이트 객체 지향 지원 * 맺음말
  • 7. 관계형 DB != 객체 지향
  • 9. ORM(Object-relational mapping) 이 제공해야 하는 기능 - 객체를 table에 저장해 주고, table에 저장된 data로부터 객체를 생성 - Metadata 사용 object 와 table 사이의 mapping 정보 지정 - Class 상속, 객체 사이의 연관 등을 객체 modeling으로 지원해야 한다 - Class와 Class의 property을 사용하여 객체를 조회할 수 있어야 한다 - 객체 값 변경을 자동으로 database에 반영해야 한다 - 상황에 따라서 성능을 개선할 수 있는 방법을 제공해야 한다. - Join 기반 조회 - Native query - Cache
  • 10. ORM 과 매퍼 솔루션들
  • 11. ORM 장점 / 단점 장점 단점 - 생산성 향상 : query + 객체 생성 코드 작성 불필요 , Biz logic에 집중 - 유지 보수 용이 : JDBC, ADO.NET API 통한 코드 축소 - 리펙토링 용이 : 특정 DBMS 에 비종속적 - DAO 패턴에 익숙한 개발자는 초기 어려움 - ORM 을 잘못 사용할 경우 성능 저하 우려 - OLAP 또는 프로시져가 많은 시스템의 경우 에는 객체 지향적인 장점 활용이 제한적
  • 12. 하이버네이트인 이유 = 쉬운 사용방법 - 설정 파일을 통한 매핑 관리 = 객체 지향의 다양한 특징 지원 - 다양한 연관 매핑 지원 (1:1, 1:N, N:1, N:M) - 상속지원 = 다양한 테이블 구조에 대한 매핑 지원 = 객체 기반 쿼리 지원 : HQL Criteria = 성능 향상 기법 제공 - 2차 캐시, Lazy loading 등
  • 16. • 매핑 설정 파일 작성 Brand.java @OneToMany(mappedBy="brand",fetch=FetchType.EAGER) public Set<BrandImage> getBrandImagelist() { return brandImagelist; } public void setBrandImagelist(Set<BrandImage> brandImagelist) { this.brandImagelist = brandImagelist; } Hibernate.cfg.xml <mapping class="net.fashiongo.admin.common.entity.Brand"/> <mapping class="net.fashiongo.admin.common.entity.BrandImage"/>
  • 17. • 클래스 작성법 @Table(name="brand", schema="public") public class Brand extends BaseEntity implements Serializable { private static final long serialVersionUID = 178207897968591488L; private Integer brandId; // PK와 매핑되는 프로퍼티 제공 private String brandName; private String description; ~ private Set<BrandImage> brandImagelist = new HashSet<BrandImage>(); public Brand() {} // 기본 생성자 제공 @Id @SequenceGenerator(name="pk_sequence",sequenceName="public.brand_id_seq", allocationSize=1) @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence") @Column(name = "brand_id", unique=true, nullable=false) public Integer getBrandId() { // getter/setter 제공 return brandId; } public void setBrandId(Integer brandId) { this.brandId = brandId; }
  • 18. • 하이버네이트 설정 파일 작성 (hibernate.cfg.xml) <hibernate-configuration> <session-factory> <mapping class="net.fashiongo.admin.common.entity.Brand"/> //매핑 설정 <mapping class="net.fashiongo.admin.common.entity.BrandImage"/> <mapping class="net.fashiongo.admin.common.entity.Category"/> <mapping class="net.fashiongo.admin.common.entity.Stockist"/> <mapping class="net.fashiongo.admin.common.entity.CityFactor"/> <mapping class="net.fashiongo.admin.common.entity.Item"/> <mapping class="net.fashiongo.admin.common.entity.PurchaseSource"/> <mapping class="net.fashiongo.admin.common.entity.Store"/> <mapping class="net.fashiongo.admin.common.entity.StoreImage"/> <mapping class="net.fashiongo.admin.common.entity.StoreBusinesshours"/> ~ <mapping class="net.fashiongo.admin.explore.model.MapCityExplore"/> <mapping class="net.fashiongo.admin.explore.model.Popular"/> </session-factory> </hibernate-configuration>
  • 21. • 하이버네이트 설정 파일 작성 (application.properties) hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect jdbc.url=jdbc:postgresql://192.168.0.XXX:5432/XXX?schema=admin jdbc.usernane=postgres jdbc.password=XXXX
  • 23. • SessionFactory 초기화 import org.hibernate.SessionFactory; @Repository public class BrandDaoImpl implements BrandDao{ private SessionFactory sessionFactory; @Autowired //초기화 public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } @Override public List<Brand> selectBrandList(SearchParam searchParam) { StringBuffer brandListQueryBuffer = new StringBuffer(" SELECT brand.* from public.brand brand "+searchParam.getBrandSqlQuery()); brandListQueryBuffer.append(" ORDER BY brand.brand_id desc "); if(StringUtils.isNotEmpty(searchParam.getCurrentPage())){ brandListQueryBuffer.append( " limit " + searchParam.getDefaultPageSize() + " offset " + searchParam.getStartRecord() ); } return sessionFactory.getCurrentSession() //session을 이용한 CRUD 처리 .createSQLQuery(brandListQueryBuffer.toString()) .addEntity("brand",Brand.class).list(); }
  • 24. • 기본 CRUD API : Blog blog = new blog(); blog.setName(..); blog.setImage(ImageUser); sessionFactory.getCurrentSession().save(blog); sessionFactory.getCurrentSession().update(blog); sessionFactory.getCurrentSession().delete(blog); sessionFactory.getCurrentSession().get(blog);
  • 29. 연관 매핑 예 – 1:1 PK 공유
  • 30. 연관 매핑 예 – 1:N / N:1 연관 @Table(name="brand", schema="public") public class Brand extends BaseEntity implements Serializable { private static final long serialVersionUID = 178207897968591488L; private Integer brandId; private String brandName; ~ private Set<BrandImage> brandImagelist = new HashSet<BrandImage>(); ~ @OneToMany(mappedBy="brand",fetch=FetchType.EAGER) public Set<BrandImage> getBrandImagelist() { return brandImagelist; } <li> <a style="cursor: zoom-in;" href="#"> <img src="${brandImagelist.webImage}" id="brandImageWeb_${brandImagelis t.brandImageId}"> </a> </li>