250x250
반응형
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

재 현

Spring Test id 값 증가 본문

Java/Spring

Spring Test id 값 증가

본명은이점례 2023. 10. 16. 17:52
728x90

일반적으로, 데이터베이스 테이블에서 ID 값은 고유한 값으로, 새로운 레코드를 추가할 때마다 자동으로 1씩 증가하는 경우가 많다. 이것은 보통 데이터베이스 시스템의 "auto_increment" 또는 유사한 기능을 통해 구현된다. 이런 동작 방식은 실제 운영 환경에서는 문제가 없지만, 데이터베이스 테스트 환경에서는 예기치 않은 결과를 초래할 수 있다.

 

 

뭐가 문제였을까?

예를 들어, 나는 Repository Test를 위해 여러 개의 Test code를 작성했다. 그리고 Test들을 실행시켰더니 에러가 발생했다.

문제가 되는 부분을 보니, Member 객체를 저장한 후 member의 id로 찾으려니 null이 떴다. 저장했던 member의 id를 출력해보니 내가 설정한 1이 아니었다. 테스트를 실행할 때마다 id값이 올라간 것이다. DataJpaTEST는 인메모리라고 들었는데 왜?? 

 

 

ID 값의 증가 문제 이유

  1. 테스트는 각각 독립적으로 실행되지만, 데이터베이스는 공유된다. 이것은 모든 테스트가 같은 데이터베이스에 접근하고, 데이터를 추가하고 수정할 수 있다는 것을 의미한다.
  2. ID 값은 데이터베이스에서 자동으로 증가하므로, 이전 테스트에서 생성된 레코드의 ID 값과 현재 테스트에서 생성하려는 레코드의 ID 값이 충돌할 수 있다.
  3. 이로 인해 한 테스트에서 생성한 레코드가 다른 테스트에서 참조하려고 할 때 ID 값이 증가되어, 처음에 1로 주었던 id가 아니여서 문제가 발생하게 된다다.

 

 

 

인메모리 초기화 시점은 다음과 같다.

 

테스트 모두 종료 후, 테스트 환경에 맞는 database, h2나 mysql db등의 테이블이 리셋(drop)된다. 그리고 테스트를 실행하면 테이블이 생성되는 동시에 모든 테이블들의 id값이 1로 초기화 된다.

 

 

 

해결 방법

  1. 테스트 시작 시 데이터베이스 초기화: 각 테스트가 시작될 때 데이터베이스를 초기화하여 ID 값의 충돌을 방지한다.
  2. 테스트 데이터 정리: 각 테스트가 종료될 때, 생성한 데이터를 삭제하고 ID 값 초기화를 수행합니다.
  3. saveMember의 return 값을 사용한다. (이전에는 member.getId()를 사용했다.)

 

728x90