문제 상황
유효성 검사 리팩토링 예시를 위해 사용자가 이메일을 수정할 때, 여러 가지 조건을 체크해야 하는 상황을 가정하였다. 조건은 다음과 같다. 이메일이 기존 이메일과 같으면 안 되고, 공백으로 제출되면 안 되며, 이메일 형식이 잘못되었거나 이미 다른 사용자에 의해 사용 중일 경우에는 예외가 발생해야 한다. 기존 코드에서는 각 조건마다 BusinessException을 중복해서 던지고 있다. 각 조건마다 동일한 예외 처리 구문이 반복되는데, 이를 when 구문으로 개선할 수 있다. 이로 인해 코드의 중복을 줄이고, 유지보수성을 높일 수 있다.
리팩토링 전 코드
private fun validateUpdateEmail(req: EmailUpdateDto) {
val userDto = userDomainQueryBus.getById(req.id)
val newEmail = req.email
// 1. 동일한 이메일 입력
if (newEmail == userDto.email) {
throw BusinessException("기존 이메일과 동일합니다.")
}
// 2. 이메일 미입력
if (newEmail == null) {
throw BusinessException("이메일을 입력해 주세요.")
}
// 3. 이메일 형식 오류
if (!isValidEmailFormat(newEmail)) {
throw BusinessException("유효한 이메일 형식이 아닙니다.")
}
// 4. 이메일 중복
if (!userDomainQueryBus.checkEmailDuplicate(newEmail)) {
throw BusinessException("이미 사용중인 이메일입니다.")
}
}
리팩토링 후 코드
private fun validateUpdateEmail(req: EmailUpdateDto) {
val userDto = userDomainQueryBus.getById(req.id)
val newEmail = req.email
val exceptionMessage =
when {
// 1. 동일한 이메일 입력
newEmail == userDto.email ->
"기존 이메일과 동일합니다."
// 2. 이메일 미입력
newEmail == null ->
"이메일을 입력해 주세요."
// 3. 이메일 형식 오류
!isValidEmailFormat(newEmail) ->
"유효한 이메일 형식이 아닙니다."
// 4. 이메일 중복
!userDomainQueryBus.checkEmailDuplicate(newEmail) ->
"이미 사용중인 이메일입니다."
else -> null
}
exceptionMessage?.let { throw BusinessException(it) }
}
주요 변경 사항 및 장점
- 중복 제거: 기존 코드에서는 조건마다 예외를 던졌으나, 리팩토링 후에는 when 구문으로 모든 조건을 통합하였다. 이를 통해 코드가 간결해졌으며, 유지보수가 용이해졌다.
- 코드 가독성 향상: 여러 조건을 처리하는 코드가 when 구문으로 간단하게 표현되어 , 코드가 더 직관적이고 읽기 쉽게 되었다.
- 유연성: 새로운 조건을 추가하거나 기존 조건을 변경하는 것이 쉬워졌다. 예를 들어, 이메일 주소가 특정 도메인만 허용하는 등의 조건을 추가하려면 when 구문에 새로운 조건을 추가하기만 하면 된다.
'Kotlin' 카테고리의 다른 글
Kotlin의 @ModelAttribute와 Custom Validation 어노테이션 적용 문제 해결 사례 (0) | 2025.01.11 |
---|---|
코틀린의 스코프 함수(scope functions) (1) | 2024.10.26 |