오늘 CodeKata는 간만에 2문제를 풀었다. 한 문제는 Priority_Queue와 Map을 활용한 비교적 난이도가 있던 문제였는데, 두 번째 문제는 DFS 혹은 BFS만 써도 풀리는 문제였다. 그런데, 두 문제 다 똑같은 난이도인 LV7인데 이 부트캠프의 난이도 분배에 의구심이 들기 시작한다.
오늘은 하루종일 테스트코드 만지작 거렸다. 처음에는 그냥 수정만하면 되는 간단한 작업이라 생각했는데, 가면 갈수록 어려운 작업이 되어버려서 튜터님께 여쭈어보기까지 했다. 일단 내가 겪고 있는 문제는 테스트용 데이터가 지워지지 않는 문제이다. 그래서 처음엔 단순하게, afterTest로 repository를 비우는 방안을 사용했다. 그런데 이 프로젝트에서는 모든 Entity가 기본적으로 softDelete를 사용해서 repository의 deleteAll은 좋은 방식이 되지 못했다.
다음에 떠올린 것은 Rollback을 하는 것이였다. 이것을 하기 위해 여기저기 검색을 하였고, 이 과정에서 SpringTestLifecycleMode를 배웠다. SpringTestLifecycleMode는 Root와 Test로 이루어졌있는데, 하나의 트랜잭션 단위이다. 이것을 사용하는 곳은 Given-when-then, Describe-context-it 방식의 BehaviourSpec 내지 DescribeSpec이다.
여기서 Root는 최상단의 각각 Given, Describe 단위이고, Test는 최하단 then, it 단위로 트랜잭션 단위를 설정한다.
이렇게 설정을 배우고 test class 위에 @Transactional annotation 을 붙이고 실행한 결과 2개의 테스트 중 하나의 테스트 만이 통과되는 것을 확인했다. 이 두개의 테스트는 @Transactional을 붙이지 않았을 때, 정상적으로 테스트를 통과를 했었는데, 하나의 테스트만이 통과되는 것을 보아 어딘가 잘못된 것이다.
혹시 몰라서 Transactional의 Propagation을 조절을 해보기도 했다, 결과적으로 Propagation의 개념을 다시 보는 계기는 되었지만, 크게 의미있는 결과를 얻지 못했다. 하나 알게 된 것이 있다면, @Transactional은 단일 스레드에서만 정상적으로 작동하기 때문에, 이번에 문제가 발생한 멀티스레드 테스트에서는 정상적으로 작동되지 않았을 수도 있다는 정보뿐이였다.
결국 전전긍긍한 끝에 튜터님께 물어보기로 하였다. 튜터님께서도 이 문제를 해결하는 별다른 방안을 제시하진 않았지만, 다른 방식을 제안을 하셨다. 내가 사용하고 있는 Test는 실제 MySQL 데이터베이스를 사용하고 있는데, 그것을 Test 용으로 H2 데이터베이스를 사용해보는 것을 추천하셨다.
데이터베이스 설정을 따로 두고, ActiveProfile이란 annotation을 사용해서 데이터베이스를 설정하는 방법을 제시하셨고, 나는 그 방법을 따른 결과, 일단은 정상적으로 본 데이터베이스에 데이터가 저장되지 않는 것을 확인했고, 테스트도 제대로 다 통과가 되었다.
spring:
config:
activate:
on-profile: test
// 테스트용 데이터베이스 설정
@ActiveProfiles("test")
@SpringBootTest
class RessulEventServiceTests @Autowired constructor()
// Profile 설정
내일은 내일 생각을 해보자
'부트캠프 일지' 카테고리의 다른 글
부트캠프 62일차 일지 (0) | 2024.02.26 |
---|---|
부트캠프 61일차 후기 (0) | 2024.02.23 |
부트캠프 58일차 후기 (0) | 2024.02.20 |
부트캠프 57일차 후기 (0) | 2024.02.19 |
부트캠프 55일차 후기 (0) | 2024.02.15 |