SlideShare una empresa de Scribd logo
1 de 84
Descargar para leer sin conexión
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 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);
}
}
SpringDataJPA - 스프링 캠프
Spring JdbcTemplate
Spring

Spring-Jdbc
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;
}
Spring + JPA
Spring

JPA
Spring + JPA
@Repository
public class MemberRepository {
@PersistenceContext
EntityManager em; //컨테이너 주입
public Long save(Member member) {
em.persist(member);
return member.getId();
}
...
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 count()
•기타 등등...
잠깐만요!
인터페이스를 구현한 클래스
가 없는데요?
Spring Data JPA 원리
<Interface>
MemberRepository

구현 클래스 생성

MemberRepository구현클래스
Spring Data JPA 기능
메서드 이름으로 쿼리생성
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
메서드 이름으로 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);
}
@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);
@Modifying
[수정 쿼리도 직접 정의 가능]
@Modifying(clearAutomatically = true)
@Query("update User u set u.firstname = ?1 where u.lastname = ?2")
int setFixedFirstnameFor(String firstname, String lastname);
Specification 지원
Specfication(DDD)
 
 
 
 
 

SpecificationMember
 firstNameLike
 =
 MemberSpecs.isFirstName(김);
SpecificationMember
 ageBetween
 =
 MemberSpecs.ageBetween(20,
 40);
SpecificationsMember
 specs
 =
 
Specifications.where(firstNameLike).and(ageBetween);
 
 
ListMember
 list
 =
 memberRepository.findAll(specs);
그냥 API 보세요!

http://docs.spring.io/spring-data/jpa/docs/
1.4.1.RELEASE/reference/html/jpa.repositories.html
Spring Data JPA 경험
컴퓨터가 할일은
컴퓨터가 하도록

무림 지존
요다 스님
팀 프로젝트

작은 거

중간 거

큰거
팀 주요 프레임워크
데이터 저장 레이어
SpringDataJPA
JPA
하이버네이트
Thymeleaf

스프링MVC
스프링

QueryDSL
도입시 경력별 반응

신입

2년~

10년~
장점
•코딩량
•도메인 클래스를 중요하게 다룸
•비지니스 로직 이해 쉬움
•더 많은 테스트 케이스 작성 가능
장점
•진짜 진짜 편함. 과거로 돌아가라면 ...
•너무 복잡할 땐 SQL 사용
•비지니스 로직에 집중
Spring Data JPA 주의
SpringDataJPA
무조껀 사용
만병통치약임

p
실제 사용해보면
ORM 기술
다시는 안쓴다!
Spring Data
JPA
HIBERNATE

JDBC
DB
취급 주의!
•JPA(하이버네이트) 모르면 절대 쓰지마세요.
•본인 먼저 JPA 마스터
•데이터베이스 설계 마스터
•Spring Data JPA 는 단지 거들 뿐.
•대부분의 문제는 JPA 를 모르고 사용해서 발생
JPA 학습곡선은 아주 높다.
우리팀 사례
•오픈전 성능검수
•단순한 기능인데 성능이 너무 안나옴
(30TPS)

•신입의 JPQL 막쿼리 (지못미 ㅠㅠ)
•잘못된 로딩 전략 설정

Más contenido relacionado

La actualidad más candente

Java Persistence API (JPA) Step By Step
Java Persistence API (JPA) Step By StepJava Persistence API (JPA) Step By Step
Java Persistence API (JPA) Step By StepGuo Albert
 
Dependency Injection in Apache Spark Applications
Dependency Injection in Apache Spark ApplicationsDependency Injection in Apache Spark Applications
Dependency Injection in Apache Spark ApplicationsDatabricks
 
SpringBoot with MyBatis, Flyway, QueryDSL
SpringBoot with MyBatis, Flyway, QueryDSLSpringBoot with MyBatis, Flyway, QueryDSL
SpringBoot with MyBatis, Flyway, QueryDSLSunghyouk Bae
 
Spring data presentation
Spring data presentationSpring data presentation
Spring data presentationOleksii Usyk
 
Spring Boot and REST API
Spring Boot and REST APISpring Boot and REST API
Spring Boot and REST API07.pallav
 
Spring boot - an introduction
Spring boot - an introductionSpring boot - an introduction
Spring boot - an introductionJonathan Holloway
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルなおき きしだ
 
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration수홍 이
 
Spring boot
Spring bootSpring boot
Spring bootsdeeg
 
Spring Security e Spring Boot Aula - 2018
Spring Security e Spring Boot Aula - 2018Spring Security e Spring Boot Aula - 2018
Spring Security e Spring Boot Aula - 2018André Luiz Forchesatto
 
Interceptors: Into the Core of Pedestal
Interceptors: Into the Core of PedestalInterceptors: Into the Core of Pedestal
Interceptors: Into the Core of PedestalKent Ohashi
 

La actualidad más candente (20)

Spring Boot Tutorial
Spring Boot TutorialSpring Boot Tutorial
Spring Boot Tutorial
 
Java Persistence API (JPA) Step By Step
Java Persistence API (JPA) Step By StepJava Persistence API (JPA) Step By Step
Java Persistence API (JPA) Step By Step
 
Dependency Injection in Apache Spark Applications
Dependency Injection in Apache Spark ApplicationsDependency Injection in Apache Spark Applications
Dependency Injection in Apache Spark Applications
 
SpringBoot with MyBatis, Flyway, QueryDSL
SpringBoot with MyBatis, Flyway, QueryDSLSpringBoot with MyBatis, Flyway, QueryDSL
SpringBoot with MyBatis, Flyway, QueryDSL
 
Spring data presentation
Spring data presentationSpring data presentation
Spring data presentation
 
Extensible Data Modeling
Extensible Data ModelingExtensible Data Modeling
Extensible Data Modeling
 
Spring Boot and REST API
Spring Boot and REST APISpring Boot and REST API
Spring Boot and REST API
 
Logging with log4j v1.2
Logging with log4j v1.2Logging with log4j v1.2
Logging with log4j v1.2
 
Spring boot - an introduction
Spring boot - an introductionSpring boot - an introduction
Spring boot - an introduction
 
Dropwizard
DropwizardDropwizard
Dropwizard
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイル
 
Parallel streams in java 8
Parallel streams in java 8Parallel streams in java 8
Parallel streams in java 8
 
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration
 
Spring boot
Spring bootSpring boot
Spring boot
 
Spring data jpa
Spring data jpaSpring data jpa
Spring data jpa
 
Spring Security e Spring Boot Aula - 2018
Spring Security e Spring Boot Aula - 2018Spring Security e Spring Boot Aula - 2018
Spring Security e Spring Boot Aula - 2018
 
JPA For Beginner's
JPA For Beginner'sJPA For Beginner's
JPA For Beginner's
 
Spring boot jpa
Spring boot jpaSpring boot jpa
Spring boot jpa
 
Spring annotation
Spring annotationSpring annotation
Spring annotation
 
Interceptors: Into the Core of Pedestal
Interceptors: Into the Core of PedestalInterceptors: Into the Core of Pedestal
Interceptors: Into the Core of Pedestal
 

Similar a SpringDataJPA - 스프링 캠프

Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Javajigi Jaesung
 
[162] jpa와 모던 자바 데이터 저장 기술
[162] jpa와 모던 자바 데이터 저장 기술[162] jpa와 모던 자바 데이터 저장 기술
[162] jpa와 모던 자바 데이터 저장 기술NAVER D2
 
Spring data jpa
Spring data jpaSpring data jpa
Spring data jpaTaesin Um
 
Ksug2015 jpa4 객체지향쿼리
Ksug2015 jpa4 객체지향쿼리Ksug2015 jpa4 객체지향쿼리
Ksug2015 jpa4 객체지향쿼리Younghan Kim
 
아해팀 스터디 Orm은 어떻게 객체를 매핑할까
아해팀 스터디 Orm은 어떻게 객체를 매핑할까아해팀 스터디 Orm은 어떻게 객체를 매핑할까
아해팀 스터디 Orm은 어떻게 객체를 매핑할까Sunghyun Roh
 
[JPA학원추천]spring framework&jpa활용한프로그램구현재직자향상과정_JPA학원/스프링학원/IT학원추천/재직자교육/국비지원/재...
[JPA학원추천]spring framework&jpa활용한프로그램구현재직자향상과정_JPA학원/스프링학원/IT학원추천/재직자교육/국비지원/재...[JPA학원추천]spring framework&jpa활용한프로그램구현재직자향상과정_JPA학원/스프링학원/IT학원추천/재직자교육/국비지원/재...
[JPA학원추천]spring framework&jpa활용한프로그램구현재직자향상과정_JPA학원/스프링학원/IT학원추천/재직자교육/국비지원/재...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
오픈 소스를 활용한 게임 배치 플랫폼 개선 사례
오픈 소스를 활용한 게임 배치 플랫폼 개선 사례오픈 소스를 활용한 게임 배치 플랫폼 개선 사례
오픈 소스를 활용한 게임 배치 플랫폼 개선 사례형석 김
 
Things Happend between JDBC and MySQL
Things Happend between JDBC and MySQLThings Happend between JDBC and MySQL
Things Happend between JDBC and MySQLDataya Nolja
 
자바가 디비와 사귀기 까지 벌어지는 일들
자바가 디비와 사귀기 까지 벌어지는 일들자바가 디비와 사귀기 까지 벌어지는 일들
자바가 디비와 사귀기 까지 벌어지는 일들cho hyun jong
 
Java 8 & Beyond
Java 8 & BeyondJava 8 & Beyond
Java 8 & BeyondJay Lee
 
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담Javajigi Jaesung
 
Ksug2015 jpa5 스프링과jpa
Ksug2015 jpa5 스프링과jpaKsug2015 jpa5 스프링과jpa
Ksug2015 jpa5 스프링과jpaYounghan Kim
 
MyBatis에서 JPA로
MyBatis에서 JPA로MyBatis에서 JPA로
MyBatis에서 JPA로Dongmin Shin
 
좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012Daum DNA
 
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드cranbe95
 
레일스를 이용한 애자일 웹 개발 가이드
레일스를 이용한 애자일 웹 개발 가이드레일스를 이용한 애자일 웹 개발 가이드
레일스를 이용한 애자일 웹 개발 가이드Sukjoon Kim
 
Spring batch와 함께 하는 TDD
Spring batch와 함께 하는 TDDSpring batch와 함께 하는 TDD
Spring batch와 함께 하는 TDDSanghyuk Jung
 

Similar a SpringDataJPA - 스프링 캠프 (20)

Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
Scala, Spring-Boot, JPA의 불편하면서도 즐거운 동거
 
[162] jpa와 모던 자바 데이터 저장 기술
[162] jpa와 모던 자바 데이터 저장 기술[162] jpa와 모던 자바 데이터 저장 기술
[162] jpa와 모던 자바 데이터 저장 기술
 
Spring data jpa
Spring data jpaSpring data jpa
Spring data jpa
 
Ksug2015 jpa4 객체지향쿼리
Ksug2015 jpa4 객체지향쿼리Ksug2015 jpa4 객체지향쿼리
Ksug2015 jpa4 객체지향쿼리
 
아해팀 스터디 Orm은 어떻게 객체를 매핑할까
아해팀 스터디 Orm은 어떻게 객체를 매핑할까아해팀 스터디 Orm은 어떻게 객체를 매핑할까
아해팀 스터디 Orm은 어떻게 객체를 매핑할까
 
[JPA학원추천]spring framework&jpa활용한프로그램구현재직자향상과정_JPA학원/스프링학원/IT학원추천/재직자교육/국비지원/재...
[JPA학원추천]spring framework&jpa활용한프로그램구현재직자향상과정_JPA학원/스프링학원/IT학원추천/재직자교육/국비지원/재...[JPA학원추천]spring framework&jpa활용한프로그램구현재직자향상과정_JPA학원/스프링학원/IT학원추천/재직자교육/국비지원/재...
[JPA학원추천]spring framework&jpa활용한프로그램구현재직자향상과정_JPA학원/스프링학원/IT학원추천/재직자교육/국비지원/재...
 
오픈 소스를 활용한 게임 배치 플랫폼 개선 사례
오픈 소스를 활용한 게임 배치 플랫폼 개선 사례오픈 소스를 활용한 게임 배치 플랫폼 개선 사례
오픈 소스를 활용한 게임 배치 플랫폼 개선 사례
 
Things Happend between JDBC and MySQL
Things Happend between JDBC and MySQLThings Happend between JDBC and MySQL
Things Happend between JDBC and MySQL
 
자바가 디비와 사귀기 까지 벌어지는 일들
자바가 디비와 사귀기 까지 벌어지는 일들자바가 디비와 사귀기 까지 벌어지는 일들
자바가 디비와 사귀기 까지 벌어지는 일들
 
Java JPA
Java JPAJava JPA
Java JPA
 
Java 8 & Beyond
Java 8 & BeyondJava 8 & Beyond
Java 8 & Beyond
 
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담
SLiPP 서비스를 Java에서 Scala로 전환하면서 경험담
 
Ksug2015 jpa5 스프링과jpa
Ksug2015 jpa5 스프링과jpaKsug2015 jpa5 스프링과jpa
Ksug2015 jpa5 스프링과jpa
 
MyBatis에서 JPA로
MyBatis에서 JPA로MyBatis에서 JPA로
MyBatis에서 JPA로
 
Java tutorial
Java tutorialJava tutorial
Java tutorial
 
좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012좌충우돌 ORM 개발기 | Devon 2012
좌충우돌 ORM 개발기 | Devon 2012
 
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
Ndc2011 성능 향상을_위한_데이터베이스_아키텍쳐_구축_및_개발_가이드
 
레일스를 이용한 애자일 웹 개발 가이드
레일스를 이용한 애자일 웹 개발 가이드레일스를 이용한 애자일 웹 개발 가이드
레일스를 이용한 애자일 웹 개발 가이드
 
(Spring Data JPA)게시판 리스트보기_오라클, 스프링부트,페이지나누기
(Spring Data JPA)게시판 리스트보기_오라클, 스프링부트,페이지나누기(Spring Data JPA)게시판 리스트보기_오라클, 스프링부트,페이지나누기
(Spring Data JPA)게시판 리스트보기_오라클, 스프링부트,페이지나누기
 
Spring batch와 함께 하는 TDD
Spring batch와 함께 하는 TDDSpring batch와 함께 하는 TDD
Spring batch와 함께 하는 TDD
 

SpringDataJPA - 스프링 캠프