Spring + JPA + mysql 테스트 코드 작성 시 유의점

도준혁·2022년 4월 22일
0

업로드중..

@Autowired ????

JPA의 공식문서를 보고 Spring 환경에서 차근차근 따라하던 과정에서 아무런 생각없이 따라쓰던 애노테이션이 있었다. 그것은 바로 @Autowired 였는데, 데이터베이스와 Java 언어의 데이터 접근 패러다임이 다르다보니 많은 기업에서는 데이터 조회 쿼리를 작성하는 어려움이 있었고, JPA라는 ORM을 이용하여 그 패러다임을 일치시켜주는 방향으로 진행하고 있다. JavaRDBMS, 그리고 JPA에 관한 관계는 조금 더 개념이 정립된 후에 글을 쓰려고 한다.

우선 오늘 할 이야기는 @Autowired 이녀석이다. JPA 공식문서에 따르면 Java와 데이터베이스의 데이터 패러다임을 연결시켜주기 위해서 DTO라고 하는 Repository를 중간에 생성하여 ORM에서 쿼리를 대신 날려주는 방법으로 개발자에게 편의를 제공한다. 이 과정에서 Repository를 컨트롤러에서 사용할 때 repository를 불러오면서 @Autowired 태그를 달아주게 되는데 처음에는 아무 버그가 일어나지 않아서 아무생각없이 따르고 있었다.

하지만 테스트 케이스를 작성하는 과정에서 버그가 일어나기 시작했다.

Null Point Exception

Controller에서 쓰던 것과 똑같은 방식으로 테스트 케이스에서 테스트 데이터를 JPA를 통해 DB에 날려주는 쿼리를 쓰고 있었다. 그런데 갑자기 날라온 Null Point Exception 오류를 만나게 되었다.

오류 해결을 위해 찬찬히 this.tb_userRepository를 찍어보니 null 이란 결과가 나왔고 이것이 바로 문제였던것 같다. mysql, jpa, test code 와 관련된 키워드로 검색을 해보니 두 가지 애노테이션을 더 추가해주면 오류가 해결된다는 답을 얻게 되었다.

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class transactionTest {

    @Autowired
    private Tb_userRepository tb_userRepository;

    @Test
    void dbSaveTest() {
        //given
        HashMap<String, String> testData = new HashMap<>();
        testData.put("username", "userA");
        testData.put("birthday", "950911");
        testData.put("phonenumber", "01023234141");
        testData.put("email", "userA@gmail.com");
        testData.put("password", "bbbaaaaee");

        Tb_user testUser = new Tb_user();

        testUser.setUsername(testData.get("username"));
        testUser.setBirthday(testData.get("birthday"));
        testUser.setPhonenumber(testData.get("phonenumber"));
        testUser.setEmail(testData.get("email"));
        testUser.setPassword(testData.get("password"));

        //when
        tb_userRepository.save(testUser);

        //then
        assertThat(tb_userRepository.findTopByOrderByIdDesc()).isEqualTo(testUser);
    }
}

JPAmysql을 이용한 테스트케이스 작성에는 맨 위의 두 애노테이션

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)

이 두 가지를 더 추가해주어야 했다.

왜 에러가 없어졌는지는 Javaannotaion, Bean, 의존성 주입 등을 조금 더 학습을 해야 이해가 될 것 같다.

3줄요약

JPA Test 케이스 작성시에는
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)

profile
ML Ops 와 백엔드를 개발하고 있는 도준혁입니다

0개의 댓글