Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

SimpleJpaRepository분석 본문

JPA

SimpleJpaRepository분석

Seung__ 2021. 5. 24. 21:27

실제 구현체 코드를 뜯어보자!

 

1. update query


user1명 저장 --> id가 1인 entity를 가져와서 email수정후 다시 저장해보자.

 @Test
 void crud(){//create, read, update, delete

userRepository.save(new User("david", "david@fast.com"));//insser query동작

User user = userRepository.findById(1L).orElseThrow(RuntimeException::new);
user.setEmail("sdfsdf-updated@naver.com");

userRepository.save(user);

}

save:insert query-> findbyId: select query

-> save:select query : 해당 entity가 존재하는지 먼저 확인 -> save:update query

Hibernate: 
    call next value for hibernate_sequence
Hibernate: 
    insert 
    into
        user
        (created_at, email, name, updated_at, id) 
    values
        (?, ?, ?, ?, ?)
Hibernate: 
    select
        user0_.id as id1_0_0_,
        user0_.created_at as created_2_0_0_,
        user0_.email as email3_0_0_,
        user0_.name as name4_0_0_,
        user0_.updated_at as updated_5_0_0_ 
    from
        user user0_ 
    where
        user0_.id=?
Hibernate: 
    select
        user0_.id as id1_0_0_,
        user0_.created_at as created_2_0_0_,
        user0_.email as email3_0_0_,
        user0_.name as name4_0_0_,
        user0_.updated_at as updated_5_0_0_ 
    from
        user user0_ 
    where
        user0_.id=?
Hibernate: 
    update
        user 
    set
        created_at=?,
        email=?,
        name=?,
        updated_at=? 
    where
        id=?

 

2. Save method 뜯어보기


save method가 언제 insert query를 만들고 언제 update query를 만드는지 확인해보자.

 

SimpleJpaRepository를 찾아보자.

 

SimpleJpaRepository는 JpaRepositoryImplementation interface를 구현하고있다.

 

JpaRepositoryImplementation는 JpaRepository를 상속받고 있다.

 

지금까지 사용한  JpaRepository에서 사용한 기능은 SimpleJpaRepository에서 구현체를 제공하고 있다.

@Transactional
@Override
public <S extends T> S save(S entity) {

//null check
Assert.notNull(entity, "Entity must not be null.");

  if (entityInformation.isNew(entity)) {
  em.persist(entity);
  return entity;
  } else {
  return em.merge(entity);
  }
}

만약 @Transactional이 없으면 save method에서 자체적인 transaction을 생성해서 실행됨.

em = entity manaer

만약 entityInformation이 새롭게 들어오는거면 entity manger에서 insert를 실행함(persist)

즉 새로운 entity가 들어오면 insert가 실행된다.

즉! isNew(entity)에 따라 insert / update query가 결정된다.

isNew(entity) : Returns whether the given entity is considered to be new. 
public boolean isNew() {
return null == getId();
}
 주어진 entity가 new인지 확인하는데, getId(entity)가 null일 경우 true를 return하여 new로 본다.

 

transaction : 데이터 베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위.
예를들어 A가 B에게 100만원을 송금한다 할 때. 논리적인 기능은 송금.
송금을 위한 작업은 "A인출+A잔액 업데이트 +B입금+B잔액 업데이트"
즉 어떤 논리적 기능을 위해 query를 connection으로  묶어서 DB에 전달, 에러 발생 시 원래대로 돌려놓는 기능.

@Transactoinal:
 spring에서 제공하는 선언적 transaction이다. annotaion을 붙이면 해당 method나 class에 transaction이 적용 가능.

 

3. saveAndflush()


save를 한 번 실행하고 이어서 flush() 실행.

@Transactional
@Override
public <S extends T> S saveAndFlush(S entity) {

S result = save(entity);
flush();

return result;
}

 

4. saveAll()


각각의 entity에 대해 for문 돌면서 insert query가 실행됨.

@Transactional
@Override
public <S extends T> List<S> saveAll(Iterable<S> entities) {

Assert.notNull(entities, "Entities must not be null!");

List<S> result = new ArrayList<S>();

for (S entity : entities) {
result.add(save(entity));
}

return result;
}

 

5. deleteAll()


findAll을 한번 실행하고 각각의 entity에 대해 for문 돌면서 delete query 실행됨.

@Transactional
@Override
public void deleteAll() {

  for (T element : findAll()) {
  delete(element);
  }
}

 

6. deleteAllInBatch()


위의 deleteAll()과 작동 방식이 다르다.

em(Entity Manager)에서 전부 지우는 query를 string을 통해 생성하고 한 번 실행시킨다.

@Transactional
@Override
public void deleteAllInBatch() {
em.createQuery(getDeleteAllQueryString()).executeUpdate();
}

앞으로 진행하면서 궁금한 내용 있으면 공부하고 여기다가 추가할 예정!

'JPA' 카테고리의 다른 글

Query Method 활용2  (0) 2021.05.26
Query Method 활용1  (0) 2021.05.26
Page , Query By Example(QBE)  (0) 2021.05.23
Repository 제공 기능 2  (0) 2021.05.23
Repository에서 제공하는 기능 예시  (0) 2021.05.23
Comments