Spring + Boot

JpaRepository / JPA로 CREATE, INSERT 해보기

devRachel 2021. 4. 7. 23:19

insert : save(entity 객체)

select : findById(키 타입), getOne(키 타입)

update : save(entity 객체)

delete : deleteById(키 타입), delete(엔티티 객체)

insert와 update작업에 사용하는 메서드가 동일하게 save()를 이용하는데 JPA의 구현체가 메모리상에서 객체를 비교하고 없다면 insert, 존재하면 update를 동작시키는 방식이기 때문입니다. 

이제 아래처럼 MemoRepository 인터페이스를 만들어 줍니다.

import org.springframework.data.jpa.repository.JpaRepository;
import org.zerock.ex2.entity.Memo;

public interface MemoRepository extends JpaRepository<Memo, Long> {
}

 

정말이지 놀랍게도 JpaRepository 인터페이스를 상속하는 것만으로 모든 작업이 끝납니다. JpaRepository를 사용할 때는 엔티티의 타입 정보(예제에서는 Memo 클래스 타입을 사용), @Id의 타입을 지정합니다. 

Spring Data JPA는 인터페이스 선언만으로도 자동으로 스프링의 bean으로 등록해준다는 사실...!(스프링이 내부적으로 인터페이스 타입에 맞는 객체를 생성해서 빈으로 등록해줍니다.) 사실 이 예제를 따라서 작성 하던 중, jpa로 테이블이 만들어 지지 않는 상황이 발생했습니다. 아니 부트는 자동으로 다 된다며! 왜 안 돼???하면서 천천히 살펴보는데 오타가 난 것도 아니라서 저자님의 카페와 깃허브를 찾아 긁어서 복붙해도 안 돼서 절망에 빠져있던 중.... 프로젝트를 다시 새로 만들고 하니까 잘만 되더라고요 ........? 인텔리제이와 부트.... JPA가 처음이라 그런건지....... ㅎ...

이제 Test할 클래스를 만들어 줍니다.

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 testClass(){
        System.out.println("__________"+memoRepository.getClass().getName());
    }

    @Test
    public void testInsertDummies(){
        IntStream.rangeClosed(1,100).forEach(i->{
            Memo memo = Memo.builder().memoText("테스트_____"+i).build();
            memoRepository.save(memo);
        });
    }
}

 

실행하면 어떤 화면이 나오느냐!

Hibernate: 
    insert 
    into
        tbl_memo
        (memo_text) 
    values
        (?)
이게 위에서 지정한 수대로 100회가 찍힙니다. 

 

잘 들어가있는 것을 확인할 수 있습니다