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