@Autowired ????
JPA
의 공식문서를 보고 Spring 환경에서 차근차근 따라하던 과정에서 아무런 생각없이 따라쓰던 애노테이션이 있었다. 그것은 바로 @Autowired
였는데, 데이터베이스와 Java
언어의 데이터 접근 패러다임이 다르다보니 많은 기업에서는 데이터 조회 쿼리를 작성하는 어려움이 있었고, JPA
라는 ORM을 이용하여 그 패러다임을 일치시켜주는 방향으로 진행하고 있다. Java
와 RDBMS
, 그리고 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);
}
}
JPA
와 mysql
을 이용한 테스트케이스 작성에는 맨 위의 두 애노테이션
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
이 두 가지를 더 추가해주어야 했다.
왜 에러가 없어졌는지는 Java
의 annotaion
, Bean
, 의존성 주입
등을 조금 더 학습을 해야 이해가 될 것 같다.
3줄요약
JPA Test 케이스 작성시에는
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)