spring data jpa
Post on 19-Jun-2015
2.555 Views
Preview:
DESCRIPTION
TRANSCRIPT
Spring Data JPA + Hibernate+ QueryDSL
ORM 을 사용하는데 쉬운 방법을 제공
참고 : 좌충우돌 ORM 개발기 | Devon 2012http://www.slideshare.net/daumdna/devon-2012-b4-orm
2012 년 8 월 국내 구글검색
2012 년 8 월 전세계 구글검색
Spring Data
데이터를 다루는데 필요한 , 기본 인터페이스를 정의함 .
구현체도 제공Spring Data JPA, MongoDB,
REDIS, SOLR, ElasticSerch 등
JPA
자바에서 제정한 ,ORM 관련 표준 스펙
구현체로는
Hibernate, EclipseLINK 등
JPA 장점
- 쿼리를 만들지 않으니 , DB 벤더에 종속적이지 않다 .
- 단순 테이블 매핑 정도라면 , 쉽게 구현 가능
- 순수한 모델 객체를 지향하는 Persis-tence 코딩 패턴을 따라갈 수 있다 .
JPA 단점
- 10ms 튜닝이 중요한 서비스- N+1 성능 문제 . 쿼리가 100 개가
동시에 날아간다 .- 쿼리를 먼저 생각하고 , 코딩하면 어렵다 .
특히 JOIN
일반적인 MVC-DAO 패턴
SERVICE
DAO =Interface=
DAOImpl=Implements=
Spring DATA-JPA DAO 패턴
SERVICE
DAO =Interface=
DAOImpl=Implements=
JPA 를 이용한 DAO 구현
* TABLE – CLASS 매핑
TV_SECTION
TABLE
TvSection
Entity Class
JPA 를 이용한 DAO 구현
* TABLE – CLASS 매핑
@Entity@Table(name="tv_section")public class TvSection {
@Id@Column(name = "tv_program_id")private long tvProgramId;private int channel;
JPA 를 이용한 DAO 구현
* DAO 인터페이스 만들기
@Repositorypublic interface TvSectionRepository extends PagingAndSortingReposi-tory<TvSection, Long> {}
JPA 를 이용한 DAO 구현
* 결과 가져오기
tvSectionRepository.findAll();
JPA 를 이용한 DAO 구현
• 원리 - 1
DAO 인터페이스만 정의하면 하위 구현은 Spring Data JPA 가 알아서 ..
컨텍스트가 로딩이 될때 , 내가 정의한 쿼리를 생성해둡니다 .
JPA 를 이용한 DAO 구현
• 원리 - 2
대부분의 CRUD 가 해결된 구현체가 존재합니다 .
PagingAndSortingRepository – 페이징 기능CrudRepository – CRUD 기능Repository - 기본
JPA 를 이용한 DAO 구현
• 페이징 결과 가져오기
Sort sort = new Sort(new Order(Direction.DESC, "lastmodified"));Pageable pageable = new PageRequest(0, 10, sort);
tvSectionRepository.findAll(pageable);
JPA 를 이용한 DAO 구현
• 조건문 추가하기 -1
@Repositorypublic interface TvSectionRepository extends PagingAndSortingRepository<TvSection, Long> { TvSection findByTvProgramId(long Id);}
JPA 를 이용한 DAO 구현
• 조건문 추가하기 – Method 이름을 사용
AndfindByLastnameAndFirstname… where x.lastname = ?1 and x.firstname = ?2Or findByLastnameOrFirstname… where x.lastname = ?1 or x.firstname = ?2Between findByStartDateBetween… where x.startDate between 1? and ?2Like findByFirstnameLike… where x.firstname like ?1
JPA 를 이용한 DAO 구현
• 테이블을 여러 개 조인하고 수많은 조건문이 있는 경우라면…
findByLastnameAndFirstname-OrDateBetweenChannelLike-LastnameNotInStartDate(String a, String b, Date c, …..)
JPA 를 이용한 DAO 구현
• 조건문 추가하기 – Spec 을 지정- CriteriaBuilder 를 이용하기- QueryDSL 을 이용하기
tvSectionRepository.findAll(spec, pageable);
JPA 를 이용한 DAO 구현
• 조건문 추가하기 – CriteriaBuilder
CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Order> cq = cb.createQuery(Order.class); SetJoin<Order, Item> itemNode = cq.from(Order.class).join(Order_.items); cq.where( cb.equal(itemNode.get(Item_.id), 5 ) ) .distinct(true);
JPA 를 이용한 DAO 구현
• 조건문 추가하기 – CriteriaBuilder
CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Order> cq = cb.createQuery(Order.class); SetJoin<Order, Item> itemNode = cq.from(Order.class).join(Order_.items); cq.where( cb.equal(itemNode.get(Item_.id), 5 ) ) .distinct(true);
JPA 를 이용한 DAO 구현
• 조건문 추가하기 – QueryDSL
QTvSection.tvSection.channel.eq(value);QTvSection.tvSection.title.like(value)
JPA 를 이용한 DAO 구현
• 조건문 추가하기 – QueryDSL
BooleanBuilder builder = new BooleanBuilder();builder.and( QTvSection.tvSection.channel.eq(value) );builder.and( QTvSection.tvSection.titleKo.like(value) );builder.and( QTvSection.tvSection.titleKo.isNotNull() );
repository.findAll(builder.getValue(), pageable);
질문해주세요… . ㄷㄷ
top related