Springboot

[Spring Boot] JpaRepository를 이용한 CRUD 테스트 예제 공부

Jenny376 2023. 3. 21. 22:51
안녕하세요. hia의 개발 story입니다.

 

오늘은 저번에 만들었던 Sample 테이블을 이용하여 JpaRepository 테스트를 해보려고 합니다. 

JpaRepository를 이용하면 SQL 없이 CRUD 작업을 할 수 있습니다. 

개발자에게는 엄청나게 시간을 아껴주는 고마운 친구인 것이죠.

 

JpaRepository CRUD 메서드 
  • insert : save(엔티티 객체)
  • select : findById(키 타입), getOne(키 타입)
  • update : save(엔티티 객체)
  • delete : deleteById(키 타입), delete(엔티티 객체)

 

특이한 점은 insert와 update 모두 save()라는 메서드를 사용하는데 이는 JPA가 메모리상에서 객체를 비교하고 

없으면 insert, 존재하면 update를 하는 방식으로 되어있기 때문입니다.

 

repository 패키지에 SampleRepository 인터페이스 만들기

 

인터페이스를 만들고 JpaRepository<엔티티의 타입, @Id의 타입>를 상속해 줍니다. 

이러면 repository가 만들어지는겁니다. 

매우 간단하죠. 

이제 이렇게 만들어진 repository를 이용해 CURD 테스트 코드를 작성해보려고 합니다. 

package com.jenny.project.repository;

import com.jenny.project.entity.Sample;
import org.springframework.data.jpa.repository.JpaRepository;

public interface SampleRepository extends JpaRepository<Sample, Long> {
}

 

spring 테스트 코드 작성 

 

우선 SampleRepositoryTests 라는 이름의 테스트 클래스를 하나 만들어줍니다. 

이때 Test 코드는 main 폴더 말고 test -> java -> com.jenny.project에 만들어줍니다. 

@SpringBootTest 어노테이션을 붙여주고 SampleRepository를 Autowired 해주면 준비는 끝납니다. 

@Test 어노테이션을 붙여 이 sampleRepository가 어떤 정보를 가지고 있는지 출력해 봅시다. 

package com.jenny.project;

import com.jenny.project.repository.SampleRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class SampleRepositoryTests {

    @Autowired
    SampleRepository sampleRepository;

    @Test
    public void test(){
        System.out.println(sampleRepository.getClass().getName());
    }
}

아래와 같은 결과가 나옵니다. 

 

 

Insert 테스트 : save()

 

@Test
public void insertTest(){
    Sample sample = Sample.builder().value("test").useYN("Y").build();
    sampleRepository.save(sample);
}

insertTest() 함수를 작성한 후 테스트를 실행하면 콘솔에서 아래와 같은 내용을 볼 수 있습니다. 

 

 

그리고 잘 생성되었는지 확인해보면 아래와 같이 잘 생성된 것을 확인할 수 있습니다. 

 

 

Select 테스트 : findById(), getOne()

 

  • findById 

 

findById를 사용할때는 결과값이 Optional<T> 형식으로 되어있어 받은 후 isPresent()를 해주어야 합니다. 

그리고 결과값을 보면 SQL을 실행한 후 sample의 내용을 출력한 것을 볼 수 있습니다.

@Test
public void selectTest(){
    Optional<Sample> result = sampleRepository.findById(1L);

    System.out.println("################");

    if(result.isPresent()){
        Sample sample = result.get();
        System.out.println(sample);
    }
}

 

 

  • getOne

 

반면에 getOne을 사용할 때에는 반환값이 엔티티값이 됩니다.

그리고 출력결과를 보면 sample을 출력할 때 SQL문이 실행이 됩니다. 

또한 getOne을 사용할 때는 @Transactional 어노테이션이 필요합니다. 

@Transactional
@Test
public void selectTest(){
    Sample sample = sampleRepository.getOne(1L);
    System.out.println("################");
    System.out.println(sample);
}

 

 

Update 테스트 : save()

 

update를 할 때는 insert와 마찬가지로 save() 함수를 사용하면 됩니다.

출력 결과를 보면 왜 그렇게 되는지 알 수가 있습니다.

먼저 select를 해서 있는지 확인을 한 후 있으면 update를 진행합니다.

출력된 결과물의 value를 보면 upate로 바뀐 걸 볼 수가 있습니다.

@Test
public void updateTest(){
    Sample sample = Sample.builder().id(1L).value("update").build();
    System.out.println( sampleRepository.save(sample) );
}

 

Delete 테스트 : deleteById()

 

delete도 먼저 select를 한 후 데이터가 있으면 지워줍니다.

@Test
public void deleteTest(){
    sampleRepository.deleteById(1L);
}

 

 

데이터가 존재하지 않으면 아래와 같은 예외가 발생됩니다. 

 

 

이렇게 CRUD 작업을 모두 해보았습니다.

원래라면 모든 쿼리를 직접 작성해야하는데 JpaRepository를 사용하니 아주 간결한 코드가 되었습니다.