Loading presentation...

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in our knowledge base article

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

Make your likes visible on Facebook?

Connect your Facebook account to Prezi and let your likes appear on your timeline.
You can change this under Settings & Account at any time.

No, thanks

JPA (Java Persistent API)

No description
by

Byeongkuk Kim

on 14 December 2015

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of JPA (Java Persistent API)

JPA
(Java Persistent API)
2015.12
IT개발부 학습회
JPA?
JAVA 진영의 ORM 표준 기술
표준 인터페이스
구현체
ORM
객체와 RDB 사이에 매핑을 정의한 메타데이터를 이용하여
기존
Full ORM
Partial ORM
Bussiness
Logic
SQL
Java
Mapping
ORM
JDBC
DB Column-Java Class
Mapping
Bussiness
Logic
SQL Map
Database
Java Persistent 기술의 역사
EJB 엔티티빈
하이버네이트
JDO
JPA
EJB 3.0 등장으로
JPA 장단점
장점
단점
얼마나 사용?
쿼리를 만들지 않으므로 DB벤더에 종속적이지 않음
SQL 중심적인 개발에서 객체 중심으로 개발
생산성이 높음
비지니스 로직 이해가 쉬움
너무 복잡할 때는 구현하기 어려움
학습곡선이 높음 - Persistent Context, JPQL 등등..
JPA를 이용한 CRUD 구현 (1)
@Entity(name = "
tbl_user
")
public class
Use
r
{
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Integer userId;
private String username;
private String nickName;
private String address;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)

private
}
@Entity(name = "
tbl_order
")
public class
Order
{
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Integer orderId;
private String orderName;
private String note;
private int price;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")

private
}
tbl_order
address
user_id
FK
order_id
PK
order_name
note
price
N
JPA를 이용한 CRUD 구현 (2)
- EntityManager : Entity의 Lifecycle과 persistence context,
transaction을 관리
User updateUser = entityManager. (User.class, user.getUserId());
updateUser.setNickName("TestNickname");
entityManager. (updateUser);
(getter, setter 생략)
- EntityManagerFactory : EntityManager를 생성하기 위한 클래스
User getUser = entityManager. (User.class, user.getUserId());
entityManager. (getUser);
user = new User(); user.setUsername("UserName"); user.setNickName("Nickname"); user.setAddress("Seoul");
List<Order> orders = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Order order = new Order("order" + i, "note" + i, i + 10, user);
entityManager. (order); orders.add(order);
}
user.setOrders(orders);
// relationship
entityManager. (user);
UPDATE
DELETE
INSERT
JDBC, MyBatis, JPA - SELECT 비교 (1)
// Connection
String selectQuery = "select user_id, userName, nick_name, address
from tbl_user where user_id = " + user.getUserId()";

ResultSet rs = stmt.excuteQuery(selectQuery);

user.setUserId(rs.getInt("userId"));
user.setUserName(rs.getString("userName"));
user.setNickName(rs.getString("nick_name"));
user.setAddress(rs.getString("address"));
// Close
JDBC
<select id="select" parameterType="java.lang.Integer" resultType=" ">
select user_id, userName, nick_name, address from tbl_user where user_id =
</select>
EntityManager em = entityManagerFactory.createEntityManager();
user = em. (User.class, user.getUserId());
JDBC, MyBatis, JPA - SELECT 비교 (2)
MyBatis
Persistent Context - 쓰기 지연(1)
제대로 사용하지 않으면 성능저하, 데이터 손실이 있을 수 있음
Database
member1
SQL 저장소
1차 캐시 영역
// Connection
String selectQuery = "select user_id, userName, nick_name, address,
from tbl_user where user_id = " + user.getUserId()";
ResultSet rs = stmt.excuteQuery(selectQuery);
user.setUserId(rs.getInt("userId"));
user.setUserName(rs.getString("userName"));
user.setNickName(rs.getString("nick_name"));
user.setAddress(rs.getString("address"));

// Close
JDBC
<select id="select" parameterType="java.lang.Integer" resultType="User">
select user_id, userName, nick_name, address,
from tbl_user where user_id = #{userId}
</select>
MyBatis
JPA
EntityManager em = entityManagerFactory.createEntityManager();
User user = em.find(User.class, user.getUserId());
요구사항 변경 : 고객 포인트를 추가해주세요
Query 생성, 실행, 데이터 매핑 반복
Connection, close 코드 반복
Connection, close 위임
Parameter 매핑, 데이터 매핑 위임
여전히 Query 작성 반복
nick_name
username
user_id
PK
tbl_user
1
ID
Entity
Snapshot
개념
(Object Relational Mapping)
자바 Application 내의 객체를 RDB 의 테이블로 자동으로 투명하게 영속화(persistence)
애플리케이션의 데이터가 애플리케이션의 프로세스보다 더 오래 지속하게끔 하려는 것
대안기술 등장
JPQL
SQL을 객체 지향 관점으로 설계
(JPA Query Language)
플랫폼에 독립적인 객체지향 쿼리 언어
관계DB에 저장된 개체에 대한 쿼리 작성시 사용
public List<Author> getAuthorsByLastName(String lastName) {
String queryString = "select from Author a " +
"where a.lastName = :lastName";
Query query = getEntityManager(). (queryString);

query.setParameter("lastName", lastName);
return query.getResultList();
}
JPQL 묵시적 조인
select o.member.team
from
Order o
where
o.product.name
= 'productA'
and
o.address.city
= 'JINJU'
select t.*
from
Order o
inner join

Member m
on o.member_id = m.id
inner join

Team t
on m.team = t.id
inner join

Product p
on o.product_id = p.id
where p.name = 'productA' and o.city = 'JINJU'
JPQL
실행된
SQL
member_id
PK
order
product_id
PK
id
PK
member
team
FK
id
PK
id
PK
team
product
city
name
주의! 허술한 추상화의 법칙
Spring Data JPA
JPA
Hibernate
JDBC
DB
transaction.begin();
트랜잭션을 커밋할때 까지 INSERT SQL을 모음
INSERT
JDBC BATCH 기능을 사용하여 한번에 SQL 전송
member2
em.persist(member1);
em.persist(member2);
transaction.commit();
3. DB에
쿼리 반영
1. INSERT
쿼리 생성
1
member1
2
member2
2. 1차 캐시
영역에 저장
Persistent Context - 쓰기 지연(2)
Database
member1'
SQL 저장소
1차 캐시 영역
ID
Entity
Snapshot
transaction.begin();
UPDATE, DELETE로 인한 로우 Lock 최소화
UPDATE
트랜잭션 커밋이 UPDATE, DELETE SQL 실행 후 바로 커밋
member2
changeMember(member1);
deleteMember(member2);
transaction.commit();
3. DB에
쿼리 반영
1
member1'
2
member2
DELTEE
member1
member2
1. Entity와
Snapshot 비교
2. Delete, Update
쿼리 생성
1. 1차 캐시영역
Entity삭제
do_business_logic();
그럼 우리는?
상황에 따라 적용 프레임워크의 효율성이 달라짐
JPA와 SQL Mapper에 대해서는 국내에서는 아직도 논쟁 중임
개발자 선호, 프로젝트 컨셉 등에 따라 선택
다만, 기존에 JDBC, SQL Mapper 등으로 구현된 프로젝트의 경우
사용하고 있는 DB 설계가 ORM에 적합하지 않을 수도 있음
별도 기술로 분리
JDBC, MyBatis, JPA - SELECT 비교 (3)
JPA
Connection, close 위임
쿼리 자동 생성, 실행
JDBC, MyBatis, JPA - SELECT 비교 (4)
List<Order> orders;
User user;
find
find
merge
remove
persist
persist
#{userId}
User
find
User
score
user.setScore(rs.getInt("score"));
score
a
createQuery
신규 프로젝트의 경우 충분히 고려해볼만함
변경 없음
JPA와 다른 기술과의 비교
JPA에서 알아야 할 개념들
(CRUD)
(JPQL, Persistent Context)
Full transcript