Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Spring Data JPA
발표자 소개
• 이름 : 김영한
• 소속 : SK Planet
목차
•이야기
•Spring Data 빨리 소개
•Spring Data JPA 소개
•사용 경험
•주의 사항
옛날 옛적에...
자바당 정파의 무술
Enterprise Java Beans
EJB 참 쉽죠잉~

낚시 전문 나영업
EJB 지옥
EJB 지옥
스프링
•현재 EJB 컨테이너 대체
•단순함의 승리
하이버네이트
•EJB 엔티티빈 기술을
대체

•JPA(Java Persistence
API)라는 새로운 표준 정
의
하이버네이트

EJB 엔티티빈

등장

JPA

표준정의
표준 인터페이스
JPA

하이버네이트

EclipseLink

JPA 구현체들

OpenJPA
통계
잠깐만요!
제 주위에는 하이버네이트
안쓰는데요?
ZEROTURNAROUND
통계
•JRebel 만든 곳
•서버를 중단하지 않고 클래스 파일 대체, 프
레임워크에 따라 수정이 많음

•전 세계 자바 사용자들이 어떤 프레임워크를
사용하는지 가장 민감한 회사
2011
2012
2012
De facto
사실상 표준

Spring
JPA
Hibernate
Spring Data
관계형 데이터베이스 세상
신흥 세력의 등장
Spring Data
Spring Data
단순한 통합 그 이상
•CRUD + 쿼리
•동일한 인터페이스
•페이징 처리
•메서드 이름으로 쿼리 생성
•스프링 MVC 에서 id 값만 넘겨도 도메인 클
래스로 바인딩
잠깐만요!
Spring Data 만 알면 다 된
다는 이야기?
이거면 다 되나요?

•이건 자바를 모르고 스프링을 사용하는 것과
같음

•해당 기술을 아는 사람이 편하게 사용하려고
쓰는 것
Spring Data JPA
오늘의 주제
혹시 JPA 처음이신 분을
위해
순수 JDBC
public Long save(Connection conn, Member member) {
PreparedStatement pstmt = null;
String sql = "INSERT INTO MEMBE...
Spring JdbcTemplate
Spring

Spring-Jdbc
Spring JdbcTemplate
public Member findOne(Long id) {
String sql = "select MEMBER_ID as id, USERNAME, PHONE_NUMBER from MEM...
Spring + JPA
Spring

JPA
Spring + JPA
@Repository
public class MemberRepository {
@PersistenceContext
EntityManager em; //컨테이너 주입
public Long save(...
Spring + JPA
Spring

JPA
Spring Data JPA
Spring

Spring Data
JPA

JPA
Spring Data JPA
public interface MemberRepository extends JpaRepository<Member,Long>
{

//실제 아무것도 없음.

}
JpaRepository 인터페이스

•<S extends T> S save(S entity)
•void delete(ID id)
•T findOne(ID id)
•Iterable<T> findAll()
•long co...
잠깐만요!
인터페이스를 구현한 클래스
가 없는데요?
Spring Data JPA 원리
<Interface>
MemberRepository

구현 클래스 생성

MemberRepository구현클래스
Spring Data JPA 기능
메서드 이름으로 쿼리생성
public interface MemberRepository extends Repository<Member, Long> {
List<User> findByEmailAndName(String em...
메서드 이름으로 NamedQuery 호출
[XML에 작성한 NamedQuery]
<named-query name="User.findByLastname">
<query>select u from User u where u....
@Query
[인터페이스에 쿼리작성 가능]
public interface UserRepository extends JpaRepository<User, Long> {
@Query("select u from User u w...
@Modifying
[수정 쿼리도 직접 정의 가능]
@Modifying(clearAutomatically = true)
@Query("update User u set u.firstname = ?1 where u.last...
Specification 지원
Specfication(DDD)
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
SpringDataJPA - 스프링 캠프
Upcoming SlideShare
Loading in …5
×

SpringDataJPA - 스프링 캠프

15,757 views

Published on

스프링 캠프 발표자료 - SpringDataJPA

SpringDataJPA - 스프링 캠프

  1. 1. Spring Data JPA
  2. 2. 발표자 소개 • 이름 : 김영한 • 소속 : SK Planet
  3. 3. 목차 •이야기 •Spring Data 빨리 소개 •Spring Data JPA 소개 •사용 경험 •주의 사항
  4. 4. 옛날 옛적에...
  5. 5. 자바당 정파의 무술 Enterprise Java Beans
  6. 6. EJB 참 쉽죠잉~ 낚시 전문 나영업
  7. 7. EJB 지옥
  8. 8. EJB 지옥
  9. 9. 스프링 •현재 EJB 컨테이너 대체 •단순함의 승리
  10. 10. 하이버네이트 •EJB 엔티티빈 기술을 대체 •JPA(Java Persistence API)라는 새로운 표준 정 의
  11. 11. 하이버네이트 EJB 엔티티빈 등장 JPA 표준정의
  12. 12. 표준 인터페이스 JPA 하이버네이트 EclipseLink JPA 구현체들 OpenJPA
  13. 13. 통계
  14. 14. 잠깐만요! 제 주위에는 하이버네이트 안쓰는데요?
  15. 15. ZEROTURNAROUND 통계 •JRebel 만든 곳 •서버를 중단하지 않고 클래스 파일 대체, 프 레임워크에 따라 수정이 많음 •전 세계 자바 사용자들이 어떤 프레임워크를 사용하는지 가장 민감한 회사
  16. 16. 2011
  17. 17. 2012
  18. 18. 2012
  19. 19. De facto 사실상 표준 Spring JPA Hibernate
  20. 20. Spring Data
  21. 21. 관계형 데이터베이스 세상
  22. 22. 신흥 세력의 등장
  23. 23. Spring Data
  24. 24. Spring Data
  25. 25. 단순한 통합 그 이상 •CRUD + 쿼리 •동일한 인터페이스 •페이징 처리 •메서드 이름으로 쿼리 생성 •스프링 MVC 에서 id 값만 넘겨도 도메인 클 래스로 바인딩
  26. 26. 잠깐만요! Spring Data 만 알면 다 된 다는 이야기?
  27. 27. 이거면 다 되나요? •이건 자바를 모르고 스프링을 사용하는 것과 같음 •해당 기술을 아는 사람이 편하게 사용하려고 쓰는 것
  28. 28. Spring Data JPA 오늘의 주제
  29. 29. 혹시 JPA 처음이신 분을 위해
  30. 30. 순수 JDBC public Long save(Connection conn, Member member) { PreparedStatement pstmt = null; String sql = "INSERT INTO MEMBER(USERNAME, PHONE_NUMBER) VALUES (?, ?)"; try { pstmt = conn.prepareStatement(sql); pstmt.setString(1, member.getUsername()); pstmt.setString(2, member.getPhoneNumber()); pstmt.executeUpdate(); ResultSet generatedKeys = pstmt.getGeneratedKeys(); if (generatedKeys.next()) { long memberId = generatedKeys.getLong(1); return memberId; } return null; } catch (Exception e) { throw new RuntimeException(e); } finally { close(pstmt); } }
  31. 31. Spring JdbcTemplate Spring Spring-Jdbc
  32. 32. Spring JdbcTemplate public Member findOne(Long id) { String sql = "select MEMBER_ID as id, USERNAME, PHONE_NUMBER from MEMBER where id = ?"; Member member = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<Member>(), id); return member; }
  33. 33. Spring + JPA Spring JPA
  34. 34. Spring + JPA @Repository public class MemberRepository { @PersistenceContext EntityManager em; //컨테이너 주입 public Long save(Member member) { em.persist(member); return member.getId(); } ...
  35. 35. Spring + JPA Spring JPA
  36. 36. Spring Data JPA Spring Spring Data JPA JPA
  37. 37. Spring Data JPA public interface MemberRepository extends JpaRepository<Member,Long> { //실제 아무것도 없음. }
  38. 38. JpaRepository 인터페이스 •<S extends T> S save(S entity) •void delete(ID id) •T findOne(ID id) •Iterable<T> findAll() •long count() •기타 등등...
  39. 39. 잠깐만요! 인터페이스를 구현한 클래스 가 없는데요?
  40. 40. Spring Data JPA 원리 <Interface> MemberRepository 구현 클래스 생성 MemberRepository구현클래스
  41. 41. Spring Data JPA 기능
  42. 42. 메서드 이름으로 쿼리생성 public interface MemberRepository extends Repository<Member, Long> { List<User> findByEmailAndName(String email, String name); } [생성된 JPQL] select m from Member m where m.email = ?1 and m.name = ?2
  43. 43. 메서드 이름으로 NamedQuery 호출 [XML에 작성한 NamedQuery] <named-query name="User.findByLastname"> <query>select u from User u where u.lastname = ?1</query> </named-query> [어노테이션으로 작성한 NamedQuery] @Entity @NamedQuery(name = "User.findByEmailAddress", query = "select u from User u where u.emailAddress = ?1") public class User { } public interface UserRepository extends JpaRepository<User, Long> { List<User> findByLastname(String lastname); User findByEmailAddress(String emailAddress); }
  44. 44. @Query [인터페이스에 쿼리작성 가능] public interface UserRepository extends JpaRepository<User, Long> { @Query("select u from User u where u.emailAddress = ?1") User findByEmailAddress(String emailAddress); } [JPA 네이티브 쿼리 지원] public interface UserRepository extends JpaRepository<User, Long> { } @Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?0", nativeQuery = true) User findByEmailAddress(String emailAddress);
  45. 45. @Modifying [수정 쿼리도 직접 정의 가능] @Modifying(clearAutomatically = true) @Query("update User u set u.firstname = ?1 where u.lastname = ?2") int setFixedFirstnameFor(String firstname, String lastname);
  46. 46. Specification 지원
  47. 47. Specfication(DDD)

×