개발자

예외처리가 더 효율적인 코드

2023년 11월 27일조회 243

유저 로그인 관련 메서드를 구현하던 중, 예외처리 방법 두가지 중 어느 것이 더 효율적(가독성, 유지보수 측면 등등..)인지 여쭤보고 싶습니다 첫번째 방법: try문에 NotFoundException을 던지고, catch문에서 instanceof를 사용해서 예외의 타입을 확인하고 처리하기 async userLogin(nickname: string, password: string) { try { const user = await this.usersRepository.findOne({ where: { nickname } }); // console.log(user) if (user && (await bcrypt.compare(password, user.password))) { return user; } else { throw new NotFoundException('아이디 또는 비밀번호가 일치하지 않습니다.'); } } catch (e) { console.error(e); if (e instanceof NotFoundException) { throw e; // NotFoundException은 그대로 던지기 } else { throw new InternalServerErrorException('알 수 없는 오류'); } } } 두번째 방법: try문에서는 일반적인 Error객체를 던진 후 catch문에서 error.message를 확인하여 예외 유형을 판단하기 async userLogin(nickname: string, password: string) { try { const user = await this.usersRepository.findOne({ where: { nickname } }); // console.log(user) if (user && (await bcrypt.compare(password, user.password))) { return user; } else { throw new Error('아이디 또는 비밀번호가 일치하지 않습니다.'); } } catch (error) { if (error.message === '아이디 또는 비밀번호가 일치하지 않습니다.') { throw new NotFoundException('아이디 또는 비밀번호가 일치하지 않습니다.'); } else { // 다른 예외 처리 throw new InternalServerErrorException('알 수 없는 오류'); } } }

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 1

김하림님의 프로필 사진

저는 1번 방법을 추천 드립니다. 2번의 경우 문자열을 기반으로 분기를 하기 때문에 사람의 실수로 (마지막에 .을 실수로 붙이지 않는다거나, 요구사항이 변경되어 메세지를 수정하다가 오타가 발생하는 등의 상황) 의도하지 않은 동작이 발생할 수 있습니다. 타입스크립트 관점에서도 1번이 좋은데, 에러 객체를 분기처리해서 처리하는 게 타입을 좁히는 효과도 있습니다. 그 외 가독성 면에서도 1번이 훨씬 좋다고 봅니다.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2023년 11월 27일

두 방법 모두 적합하나, 가독성과 유지보수 측면에서는 첫 번째 방법이 더 나을 수 있습니다. 첫 번째 방법은 명확한 에러 타입(`NotFoundException`)을 사용하여 예외를 처리합니다. 이렇게 하면 나중에 코드를 읽는 사람(또는 나중에 코드를 수정하는 당신)이 어떤 종류의 예외가 발생할 수 있는지 바로 이해할 수 있습니다. 추가로, 특정 예외를 처리하는 로직이 변경되어야 할 경우, 클래스의 구현만 변경하면 되므로 유지보수하기도 쉽습니다. 반면에 두 번째 방법에서는 `Error` 객체에 메시지를 저장하고, 이 메시지를 파싱하여 에러 타입을 결정합니다. 이것은 실수로 메시지가 변경되었을 때 예상치 못한 버그가 발생할 가능성이 있으며, 코드의 의미를 파악하기 위해 메시지 문자열까지 찾아봐야 합니다. 따라서 첫 번째 방법인 에러 타입을 확인하는 것이 일반적으로 권장되는 패턴입니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!