30
하하하하하하 하하 & 하하 하하 하하하 하하하

Hibernate 기초

Embed Size (px)

Citation preview

Page 1: Hibernate 기초

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

Page 2: Hibernate 기초

처음 떠오르는 코드는 ?

Page 3: Hibernate 기초
Page 4: Hibernate 기초

이 시간의 목적* ORM 과 하이버네이트 이해* 객체 지향 / 도메인에 대한 호기심 자극

Page 5: Hibernate 기초

살펴볼 내용* ORM 과 하이버네이트* 하이버네이트 기초 사용법* 하이버네이트 객체 지향 지원* 맺음말

Page 6: Hibernate 기초

ORM 과 하이버네이트

Page 7: Hibernate 기초

관계형 DB != 객체 지향

Page 8: Hibernate 기초

ORM(Object-relational mapping) 이란 ?

Page 9: Hibernate 기초

ORM(Object-relational mapping) 이 제공해야 하는 기능- 객체를 table 에 저장해 주고 , table 에 저장된 data 로부터 객체를 생성- Metadata 사용 object 와 table 사이의 mapping 정보 지정- Class 상속 , 객체 사이의 연관 등을 객체 modeling 으로 지원해야 한다- Class 와 Class 의 property 을 사용하여 객체를 조회할 수 있어야 한다- 객체 값 변경을 자동으로 database 에 반영해야 한다- 상황에 따라서 성능을 개선할 수 있는 방법을 제공해야 한다 .- Join 기반 조회- Native query- Cache

Page 10: Hibernate 기초

ORM 과 매퍼 솔루션들

Page 11: Hibernate 기초

ORM 장점 / 단점장점 단점- 생산성 향상 : query + 객체 생성 코드 작성 불필요 , Biz logic 에 집중- 유지 보수 용이 : JDBC, ADO.NET API 통한 코드 축소- 리펙토링 용이 : 특정 DBMS 에 비종속적

- DAO 패턴에 익숙한 개발자는 초기 어려움 - ORM 을 잘못 사용할 경우 성능 저하 우려

- OLAP 또는 프로시져가 많은 시스템의 경우에는 객체 지향적인 장점 활용이 제한적

Page 12: Hibernate 기초

하이버네이트인 이유= 쉬운 사용방법 - 설정 파일을 통한 매핑 관리= 객체 지향의 다양한 특징 지원 - 다양한 연관 매핑 지원 (1:1, 1:N, N:1, N:M) - 상속지원= 다양한 테이블 구조에 대한 매핑 지원= 객체 기반 쿼리 지원 : HQL Criteria= 성능 향상 기법 제공 - 2 차 캐시 , Lazy loading 등

Page 13: Hibernate 기초

ORM 도구가 필요한 이유

Page 14: Hibernate 기초

하이버네이트 기초 사용법

Page 15: Hibernate 기초

• 프로그래밍 절차

Page 16: Hibernate 기초

• 매핑 설정 파일 작성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"/>

Page 17: Hibernate 기초

• 클래스 작성법@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;}

Page 18: Hibernate 기초

• 하이버네이트 설정 파일 작성 (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>

Page 19: Hibernate 기초

• Hibernate type

Page 20: Hibernate 기초

• Hibernate type

Page 21: Hibernate 기초

• 하이버네이트 설정 파일 작성 (application.properties)hibernate.dialect=org.hibernate.dialect.PostgreSQLDialectjdbc.url=jdbc:postgresql://192.168.0.XXX:5432/XXX?schema=adminjdbc.usernane=postgresjdbc.password=XXXX

Page 22: Hibernate 기초

• SessionFactory API

Page 23: Hibernate 기초

• SessionFactory 초기화import org.hibernate.SessionFactory;

@Repository public class BrandDaoImpl implements BrandDao{

private SessionFactory sessionFactory;

@Autowired // 초기화public void setSessionFactory(SessionFactory sessionFactory) {this.sessionFactory = sessionFactory;}

@Overridepublic 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();}

Page 24: Hibernate 기초

• 기본 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);

Page 25: Hibernate 기초

• 쿼리 API

Page 26: Hibernate 기초

하이버네이트의 객체 지향 지원

Page 27: Hibernate 기초

하이버네이트의 연관 지원

Page 28: Hibernate 기초

• Collection 매핑

Page 29: Hibernate 기초

연관 매핑 예 – 1:1 PK 공유

Page 30: Hibernate 기초

연관 매핑 예 – 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.webIm-age}" id="brandImageWeb_${brandImagelist.brandImageId}"></a> </li>