트랜잭션이 동작하지 않는다.

팀장님으로부터 어떤 업무를 처리할 서버앱을 데모형태로 먼저 개발해달란 요청이 들어왔고, 여느때와 다름없이 springboot를 이용하여 빠르게 구축하였다.

프로젝트에서 사용될 핵심 의존성은 대충 아래와 같았다.

의존성
querydsl
web
spring-data-jpa
mariadb

문제는 데이터 레이어 개발을 끝내고 테스트 진행중에 발생하였다……ㅠㅠ

이슈 발견

Test를 위해 스프링부트에서 지원하는 DataJpaTest 어노테이션을 이용하여 슬라이싱 테스트를 진행하였고 몇번의 시행착오를 겪으며 테스트를 통과시킨 후 데이터베이스를 확인해봤는데, 롤백됬어야 될 데이터들이 차곡차곡 쌓이고 있엇다..

원래라면 DataJpaTest 어노테이션을 이용하여 테스트를 진행할경우 Transaction 옵션이 자동으로 활성화되며 JUnit Test에서 Transaction 옵션이 활성화 될 경우에 단위 테스트가 종료될 때마다 테스트 도중에 변경되었던 데이터는 자동으로 Rollback처리 되어야한다. 이게 기본 옵션이다.

어떤 이슈?

그럼에도 불구하고 데이터베이스에는 단위테스트에서 생성되고 있던 데이터가 차곡차곡 쌓이고 있었다. 여기에서 나는 트랜잭션이 정상적으로 동작하고 있지 않다고 판단했다.

문제가 없는데?

이상해서 다시 테스트를 돌리며 로그를 자세히 확인해봤지만, 로그상으로는 전혀 문제가 없었다. 평소와 다름없이 트랜잭션이 열리고, 롤백처리되는 것 까지 전부 정상적인 로그뿐이였다. 여기서부터 멘붕이 오기 시작했다…

이유가 뭘까?????

데모 프로젝트는 아래처럼 멀티 프로젝트 구조를 가지고 있었다.

root
└ module-a (core, root에 의존)
└ module-b (core, root에 의존)
└ module-core (root에 의존)
module-demo (root에 의존)

제일 먼저 module-core에서도 DataJpaTest 어노테이션을 이용하여 테스트를 진행 했었기 때문에, 혹시몰라서 테스트코드에 트랜잭션 롤백처리 테스트 코드도 추가를 하고 테스트를 진행 하였지만 아무 문제가 없었다.

module-demo는 다른 node 수준의 프로젝트와는 무관한 프로젝트라고 생각하고 시작했지만, 막상 테스트도중 아무 문제가 없는거 같은데, 아니 없어야 되는데 이슈가 터지다보니 제정신이 아니였나보다… 여기서 내 자신을 의심하기 시작했다 ㅋㅋㅋㅋㅋㅋ

혹시나 module-a와 module-demo에서 사용중인 restdoc플러그인 때문에??? 아니면 module-core와 module-demo에서 사용중인 querydsl플러그인 때문에??? 부끄럽다.. 진짜 의심할 수 있는 모든것을 의심하며 3일을 소비했다…

원인을 찾았고 해결했다.

결론부터 말하면 데이터베이스 저장소 엔진이 문제였다. 지식이 부족했음

MariaDB를 사용중이였는데, MySQL계열 데이터베이스에는 대표적인 StorageEngine으로 MyISAM 엔진과 InnoDB엔진이 있다고 한다. 여기서 MyISAM엔진은 트랜잭션을 지원하지 않는 엔진인데 데모앱에서 액세스한 테이블만 MyISAM엔진으로 설정이 되있었다… (나머지는 다 InnoDB엔진 아니……. 왜? ㅋㅋㅋㅋㅋㅋㅋㅋ 그래서 다른 엔티티로 트랜잭션 테스트를 할땐 잘됬던……….)

물론 데이터베이스 설정자체를 의심하지 않은것은 아니였다. 의심을 하긴 했지만, Global설정만 확인하여 문제점을 빠르게 찾지 못했던것 같았다. 테이블별로 저장소 엔진 설정이 가능하다는 점을 알았어야 됬는데…

어쩐지 프로젝트 구조 똑같이 새로만들어서 H2 DB 임베디드해서 테스트하니까 잘되더라 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

태그:

Back to Top ↑

댓글남기기