JpaRepository 2

nananjadive·2022년 11월 17일
0

MemoReposiory

package org.zerock.ex2.repository;
import org.springframework.data.jpa.repository.DpaRepository; import org.zerock.ex2.entity.Memo;
public interface MemoRepository extends JpaRepository<Memo, Long> { }

JpaRepository를 사용할 때는 엔티티의 타입 정보(Memo 클래스 타입)와 @Id의 타입을 지정하게 됩니다. 이처럼 Spring Data jPA는 인터페이스 선언만으로도 자동으로 스프링(bean)으로 등록됩니다

테스트코드를통한 CRUD 연습

• insert 작업: save(엔티티 객체)
• select 작업 : findByld(키 타입), getOne(키 타입)
• update 작업: save(엔티티 객체)
• delete 작업: deleteByld(키 타입), delete(엔티티 객체)

MemoRepositoryTests

package org.zerock.ex2.repository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class MemoRepositoryTests {
@Autowired
MemoRepository memoRepository; @Test
public void testClass(){System.out.printin(memoRepository.getClass().getName());}}

스프링이 내 부적으로 해당 클래스를 자동으로 생성(AOP기능)
coin.sun.proxy.$ProxyXX와 같이 작성한 적이 없는 클래 스의 이름이 출력되는 것을 확인할 수 있습니다(동적 프록시라는 방식으로 만들어집 니다).

package org.zerock.ex2.repository;
import org.junit.jupiter•api.Test;
import org.springframework.beans•factory.annotation•Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.zerock.ex2.entity.Memo;
import java.util.stream.IntStream;
@SpringBootTest
public class MemoRepositoryTests {
@Autowired
MemoRepository memoRepository;
@Test
public void testInsertDummies(){ 
IntStream.rangeClosed(lj100).forEach(i -> {
Memo memo = Memo.builder().memoText("Sample..."+i).build(); memoRepository.save(memo);
})}

-TestInsertDummies()의 내용은 K)0개의 새로운 Memo 객체를 생성하고 MemoRepository 를 이용해서 이를 insert
-Memo의 memoText는 Not Null 조건이므로 반드시 데이터를 넣어주고 테스트를
진행테스트가 실행되는 과정에는 JPA의 구현


-Hibernate가 발생하는 insert 구문을 확인

조회작업테스트
findById()나getOne()을 이용해서 엔티티 객체를조회

실행되는 결과를 보면 findById()를 실행한 순간에 이미 SQL은 처리가 되었고,'====’ 부분은 SQL 처리 이후에 실행된 것을 볼 수 있습니다. getOne()의 경우는 조금 다른 방 식으로 동작하는데 @Transactional 어노테이션이 추가로 필요


getOne()을 호출한 후에 '===' 부분이 먼저 실행되고 System.out.println()이 실행되면서 실제 객체를 사용하는 순간에 SQL이 동작

수정작업 테스트

@Id값이 일치하는지를 확인해서 insert 혹은 update 작업을 처리함

@Test

public void testUpdate() {
Memo memo = Memo.builder().mno(100L)ㅣ.memoText("Update Text").build(); System.out.printin(memoRepos丄tory.save(memo));
}
100번의 Memo 객체를 만들고,save()를 호출, elect 쿼리로 해당 번호의 Memo 객체를 확인하고,이를 update

-@Id를 가진 엔티티 객체가 있다면 update, 그렇지 않다면 insert를 실행

삭제 작업 테스트

@Test
public void testDelete() {
Long mno = 100L; memoRepository.deleteByld(mno);
}

Hibernate: select
memo0.mno as mnol_0_0__,
memo0一.memo_text as memo一tex2_0_0
from
memo memo0 where
memo0
.mno=? Hibernate:
delete from
memo where
mno=?
slect 이후에 delete구문이 실행되는방식

profile
개발 메모창고

0개의 댓글