Upload
jong-woo-rhee
View
754
Download
0
Embed Size (px)
Citation preview
하이버네이트기초 & 객체 지향 지원에 대하여
처음 떠오르는 코드는 ?
이 시간의 목적* 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.PostgreSQLDialectjdbc.url=jdbc:postgresql://192.168.0.XXX:5432/XXX?schema=adminjdbc.usernane=postgresjdbc.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;}
@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();}
• 기본 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.webIm-age}" id="brandImageWeb_${brandImagelist.brandImageId}"></a> </li>