26
Spring Data JPA + Hibernate + QueryDSL

Spring data jpa

Embed Size (px)

DESCRIPTION

Spring data jpa

Citation preview

Page 1: Spring data jpa

Spring Data JPA + Hibernate+ QueryDSL

Page 2: Spring data jpa

ORM 을 사용하는데 쉬운 방법을 제공

참고 : 좌충우돌 ORM 개발기 | Devon 2012http://www.slideshare.net/daumdna/devon-2012-b4-orm

Page 3: Spring data jpa

2012 년 8 월 국내 구글검색

Page 4: Spring data jpa

2012 년 8 월 전세계 구글검색

Page 5: Spring data jpa

Spring Data

데이터를 다루는데 필요한 , 기본 인터페이스를 정의함 .

구현체도 제공Spring Data JPA, MongoDB,

REDIS, SOLR, ElasticSerch 등

Page 6: Spring data jpa

JPA

자바에서 제정한 ,ORM 관련 표준 스펙

구현체로는

Hibernate, EclipseLINK 등

Page 7: Spring data jpa

JPA 장점

- 쿼리를 만들지 않으니 , DB 벤더에 종속적이지 않다 .

- 단순 테이블 매핑 정도라면 , 쉽게 구현 가능

- 순수한 모델 객체를 지향하는 Persis-tence 코딩 패턴을 따라갈 수 있다 .

Page 8: Spring data jpa

JPA 단점

- 10ms 튜닝이 중요한 서비스- N+1 성능 문제 . 쿼리가 100 개가

동시에 날아간다 .- 쿼리를 먼저 생각하고 , 코딩하면 어렵다 .

특히 JOIN

Page 9: Spring data jpa

일반적인 MVC-DAO 패턴

SERVICE

DAO =Interface=

DAOImpl=Implements=

Page 10: Spring data jpa

Spring DATA-JPA DAO 패턴

SERVICE

DAO =Interface=

DAOImpl=Implements=

Page 11: Spring data jpa

JPA 를 이용한 DAO 구현

* TABLE – CLASS 매핑

TV_SECTION

TABLE

TvSection

Entity Class

Page 12: Spring data jpa

JPA 를 이용한 DAO 구현

* TABLE – CLASS 매핑

@Entity@Table(name="tv_section")public class TvSection {

@Id@Column(name = "tv_program_id")private long tvProgramId;private int channel;

Page 13: Spring data jpa

JPA 를 이용한 DAO 구현

* DAO 인터페이스 만들기

@Repositorypublic interface TvSectionRepository extends PagingAndSortingReposi-tory<TvSection, Long> {}

Page 14: Spring data jpa

JPA 를 이용한 DAO 구현

* 결과 가져오기

tvSectionRepository.findAll();

Page 15: Spring data jpa

JPA 를 이용한 DAO 구현

• 원리 - 1

DAO 인터페이스만 정의하면 하위 구현은 Spring Data JPA 가 알아서 ..

컨텍스트가 로딩이 될때 , 내가 정의한 쿼리를 생성해둡니다 .

Page 16: Spring data jpa

JPA 를 이용한 DAO 구현

• 원리 - 2

대부분의 CRUD 가 해결된 구현체가 존재합니다 .

PagingAndSortingRepository – 페이징 기능CrudRepository – CRUD 기능Repository - 기본

Page 17: Spring data jpa

JPA 를 이용한 DAO 구현

• 페이징 결과 가져오기

Sort sort = new Sort(new Order(Direction.DESC, "lastmodified"));Pageable pageable = new PageRequest(0, 10, sort);

tvSectionRepository.findAll(pageable);

Page 18: Spring data jpa

JPA 를 이용한 DAO 구현

• 조건문 추가하기 -1

@Repositorypublic interface TvSectionRepository extends PagingAndSortingRepository<TvSection, Long> { TvSection findByTvProgramId(long Id);}

Page 19: Spring data jpa

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

Page 20: Spring data jpa

JPA 를 이용한 DAO 구현

• 테이블을 여러 개 조인하고 수많은 조건문이 있는 경우라면…

findByLastnameAndFirstname-OrDateBetweenChannelLike-LastnameNotInStartDate(String a, String b, Date c, …..)

Page 21: Spring data jpa

JPA 를 이용한 DAO 구현

• 조건문 추가하기 – Spec 을 지정- CriteriaBuilder 를 이용하기- QueryDSL 을 이용하기

tvSectionRepository.findAll(spec, pageable);

Page 22: Spring data jpa

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);

Page 23: Spring data jpa

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);

Page 24: Spring data jpa

JPA 를 이용한 DAO 구현

• 조건문 추가하기 – QueryDSL

QTvSection.tvSection.channel.eq(value);QTvSection.tvSection.title.like(value)

Page 25: Spring data jpa

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);

Page 26: Spring data jpa

질문해주세요… . ㄷㄷ