본문 바로가기
Side Projects/프로젝트 사이

7. 오류 해결 스토리 - constraint ["PUBLIC.UK_MBMCQELTY0"]

by devraphy 2022. 7. 30.

0. 문제 설명

a) 오류 소개

- Entity에 새로운 속성을 부여하기 위해서 코드 수정을 진행하고 있었다.

- 새로운 속성을 이용한 쿼리를 테스트하는 과정에서 다음 오류가 발생했다. 

 

org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint ["PUBLIC.UK_MBMCQELTY0FBRVXP1Q58DN57T_INDEX_8 ON PUBLIC.MEMBER(EMAIL) VALUES 5"; SQL statement:
insert into member (email, member_name, password, sign_up_date, visibility, member_id) values (?, ?, ?, ?, ?, ?) [23505-214]]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement

 

- 오류를 읽어보면 Constraint 관련 내용 이라는 것을 확인할 수 있다.

- 그러나 더이상 뭐가 문제인지는 모르겠다. 

 

1. 문제 원인

a) 오류 원인

- 위의 오류는 제약조건을 어기는 경우 발생하는 오류다.

- 이번 케이스의 경우, 오류의 원인은 중복에 있다.

 

- @BeforeEach를 통해서 매번 새로운 테스트 메서드를 실행할 때마다 Entity를 생성하여 DB에 입력한다.

- 매번 테스트 메서드가 실행될 때마다 기존의 입력 데이터는 삭제되고 데이터가 새로 입력된다. 

 

- 테스트가 올바로 동작하는지 확인하기 위하여 @Rollback(false)를 통해 데이터가 DB에 잔류하도록 하였다.

- 그러므로 @Rollback(false)이 걸려있는 테스트가 끝나고, 다음 테스트 메서드를 실행할 때 중복 오류가 발생한다.

 

 

b) 오류 발생의 경위

- 오류가 발생하는 과정은 다음과 같다. 

 

- @Rollback(false)가 걸려있는 테스트 메서드는 실행이 종료되어도 사용한 데이터가 DB에 잔류한다.

- 새로운 테스트 메서드가 실행될 때 @BeforeEach로 인해 데이터가 다시 DB에 입력된다.

 

- DB에 잔류한 데이터와 새롭게 입력되는 데이터는 동일한 데이터 값을 사용한다. 

- 개체 무결성을 위배하므로 오류가 발생한다. 

댓글