본문 바로가기

카테고리 없음

[231119] 출석체크 API를 테스트하면서 발견한 버그

출석체크 API 테스트

💬 출석체크를 통해 보상을 주는 이벤트가 있기 때문에 생각하지 못한 문제가 있는지 확인하기로 했습니다. API를 여러 번 호출을 해보면서 실제 예상하는 대로 동작을 하는지 테스트를 진행했습니다.

 

✔ 발견한 문제 1

💢 Redis와 DB에 들어가는 등록 시간을 불일치하는 현상이 발견되었습니다. 이는 단순하게 몇 초차이가 나는 것이었지만 23시 59분 59초에 입력이 들어온다면 날짜별로 출석체크 하는 API에서는 문제가 될 수 있었습니다.

✅ Redis와 DB 시간을 일치시켜주기 위해 DB에 now()를 사용하지 않고 서버의 시간을 Redis와 DB에 직접 넣어주었습니다.

💢 위에서 나온 문제는 해결이 되었지만 23분 59분 59초에 넣은 데이터가 다음 날로 들어가는 현상이 발견되었습니다. 확인을 해보니 밀리세컨즈가 500이 넘어가면 반올림되기 때문에 발생하는 것이었습니다.

✅ 날짜 데이터에 밀리세컨즈 정보는 필요가 없었습니다. DB에 날짜 정보를 넣기 전에 밀리세컨즈 정보를 0으로 설정해서 반올림되지 않도록 했습니다.

 

✔ 발견한 문제 2

💢 DB에 데이터를 입력하는 로직 중에서 문제가 발생하는 경우 DB에서는 데이터가 없으나 Redis에는 데이터가 존재하는 현상을 반결했습니다. DB는 트랜잭션에 묶여 중간의 실패로 인해 롤백이 되지만 Redis는 거기에 영향을 받고 있지 못했던 것이었습니다.

✅ 해결 방안 중 하나는 Redis의 커밋 시점도 DB트랜잭션과 동일하게 가져가는 것입니다. 다른 하나는 DB 트랜잭션이 실패했을 경우 Redis의 캐시를 삭제하여 이후에 다시 DB에서 읽게 하는 것입니다. 

 

✔ 느낀점

💬 간단해 보이는 API 여도 버그는 발생할 수 있다는 것입니다. 실제 유저가 사용하기 이전에 좀 더 많은 시간을 들여 코드에 대한 테스트를 하고 안정성을 높일 필요가 있다는 것을 느꼈습니다. 추가적으로 이를 위해 테스트 코드도 작성을 하는 것 아닌가 생각했습니다.