-
Mybatis 사용시 return 값을 검사하는 이유는 무엇일까글또 2022. 5. 29. 14:39
이번 글은 Mybatis 사용 중 고민되었던 코드 부분에 대해 글을 작성하겠습니다.
새로운 회사의 코드를 살펴보는 중 DDL문 사용 후 return값을 검사하여 특정 값이 아니면 Exception을 내는 코드가 존재했습니다.@Service class SampleService( private val sampleRepository: SampleRepository ) { fun register(sample: Sample){ val result = sampleRepository.insert(sample) if (result != 1L){ throw RuntimeException("예외가 발생") } } }
왜 이럴까요?
처음 제 생각은 DDL 시에 예외가 날 경우를 추려보자면 몇 가지 경우가 있을 수 있습니다.
- DB와의 연결이 문제가 있을 경우
- SQL문의 오류
- 제약조건 미충족
DDL문 실패 시 어차피 Exception이 난다.
위와 같은 문제가 있을때 SQL Exception이나 spring은 DataAccessException로 re-throwing을 하기에
if문을 통해 잡을 수 없습니다.
try catch를 통해 DDL문을 감싸서 잡을 수 있겠지만
이는 컴파일러의 최적화를 제한하기 때문에 모든 DDL문에 try catch를 배치하는 것은 좋은 선택이 되지 못합니다.fun register(sample: Sample){ try { val result = sampleRepository.insert(sample) }catch (e: DataAccessException){ throw RuntimeException("예외가 발생") } }
더블체크
그렇다면 if문을 통해 검사 시 장점은 무엇이 있고 왜 사용할까요?
정답은 더블체크를 할 수 있다는 것입니다.
Mybatis는 DDL문이 실행되고 반환 값으로 실행된 row수를 반환합니다.
이를 통해 영향을 받은 row들을 확인할 수 있습니다.
update나 delete 시 조금 더 안전하게 원하는 결과를 얻을 수 있습니다.fun update(id: Long, name: String) { val sample = Sample(id, name) val result = sampleRepository.update(sample) if (result > 1) { throw RuntimeException("특정 값 중복 존재") } else if (result < 1) { throw RuntimeException("해당 값이 없음") } }
고민
안 좋은 점은 매번 DDL문 다음에 검사하는 로직이 존재한다는 점입니다.
더블 체크의 장점이 실제로 존재하는가? SqlMapper를 믿을 수 없는가? 에 대한 의문은 있지만
기존 회사의 컨벤션을 따라 일단은 작성중입니다.
git에서 가장 많은 star를 받은 Mybatis 사용 코드에서도 if문을 통한 더블 체크는 존재하지 않습니다.
기존 컨벤션을 따라야 하는지 더 예외 상황을 조사해 설득 시켜야 하는지 고민이 되는 부분입니다.'글또' 카테고리의 다른 글
jvm 시간대 (0) 2022.07.18 디자인 패턴 적용기 (0) 2022.06.26 제목은 젠킨스 서버 분리로 하겠습니다. 근데 이제 도커를 곁들인 (0) 2022.03.13 jenkins 해킹 (0) 2022.03.06 검색 단어에 따라 에러가 발생한다고? (0) 2022.03.05