📝느낀 점
이번 작업을 통해 배우고 경험할 수 있었습니다. 특히, 실제 개발 환경에서 발생하는 예외 상황을 해결하면서 기술적으로나
논리적으로나 성장할 수 있는 좋은 기회가 되었습니다. 그중에서도 예외 처리 경험에 대해 작성하려고 합니다.
NonUniqueResultException과 같은 예외는 데이터베이스 쿼리에서 단일 결과를 기대할 때 발생할 수 있는 흔한 문제라고 생각합니다. (하지만 처음에는 에러가 발생해 당황했던것 같습니다.) 이런 예외가 발생할 수 있는 상황을 미리 고려하여 코드에 반영하는 것이 중요하다는 것을 느꼈던것 같습니다. 예외를 사전에 처리함으로써 애플리케이션의 안정성을 높일 수 있었다고 생각합니다. 그리고 이번 문제를 해결하면서 Optional을 사용하여 데이터베이스 쿼리 결과를 안전하게 처리하는 방법을 배웠습니다. Optional을 사용하면 null 처리를 안전하게 할 수 있음을 느꼈습니다. 문제의 원인을 파악하고 해결하는 과정에서 디버깅 능력이 올랐다고 생각 했습니다. 로그를 분석하고, 코드를 검토하고, 문제를 재현하면서 문제의 근본 원인을 찾는 과정에 좋았습니다. 이 경험을 통해 향후 발생할 수 있는 다양한 문제를 보다 효과적으로 해결할 수 있을 것 같습니다.
어떻게 했기에 문제 상황을 마주하게 되었는지
Spring Boot 애플리케이션에서 사용자의 이메일과 이름을 확인한 후 임시 비밀번호를 이메일로 발송하는 기능을 구현하고 있었습니다. 이메일과 이름을 확인하는 과정에서 userEmailCheck 메소드가 단일 결과를 반환해야 했지만, 다중 결과가 반환되어 NonUniqueResultException이 발생했습니다.
이게 왜 문제인지
NonUniqueResultException은 단일 결과가 예상되는 쿼리에서 다중 결과가 반환될 때 발생하는 예외입니다.
이는 비즈니스 로직에서 심각한 문제를 일으킬 수 있으며, 예상치 못한 동작을 발생할 수 있다고 생각합니다.
문제를 어떻게 감지했는지
애플리케이션 로그에서 밑에 처럼 예외 메시지를 확인했습니다.
javax.persistence.NonUniqueResultException: query did not return a unique result: 2
이는 userEmailCheck 메소드에서 memberRepository.findByEmail 호출 시 발생한 예외였습니다.
어떻게 해결했는지
Optional을 사용하여 결과를 처리 하였습니다.
Optional<Member> findByEmail(String email);
그리고 userEmailCheck 메소드에서는 다음과 같이 사용했습니다
Optional<Member> optionalMember = memberRepository.findByEmail(userEmail);
if (optionalMember.isPresent() && optionalMember.get().getName().equals(userName)) {
return true;
}
return false;
여러 결과를 처리했습니다.
List<Member> members = memberRepository.findByEmail(userEmail);
if (!members.isEmpty()) {
// 여러 결과에 대한 처리 로직 추가
}
비밀번호 업데이트 메소드 수정 했습니다.
public void updatePassword(String str, String userEmail) {
String pw = EncryptionUtils.encryptMD5(str);
Optional<Member> memberOptional = memberRepository.findByEmail(userEmail);
if (memberOptional.isPresent()) {
Long id = memberOptional.get().getId();
memberRepository.updatePasswordById(id, pw);
} else {
// 이메일에 해당하는 회원이 없는 경우에 대한 처리
}
}
그렇게 하면 왜 해결되는지
- Optional 사용: Optional을 사용하여 단일 결과를 안전하게 처리할 수 있었습니다.
결과가 존재하지 않을 경우와 다중 결과가 반환될 경우를 구분하여 처리할 수 있었습니다. - 여러 결과 처리: 다중 결과가 반환될 수 있는 상황에서 이를 명확하게 처리함으로써 예외를 방지할 수 있었습니다.
- JavaScript 리디렉션 조정: 비밀번호 발송 후 리디렉션을 적절히 조정하여 비밀번호 발송이 완료된 후에만 리디렉션이 이루어지도록 합니다.
결과
문제를 해결한 후, 이메일 확인 및 비밀번호 발송 기능이 정상적으로 작동했습니다.
예외가 발생하지 않고, 클라이언트 쪽으로 개선이 되었습니다.
배우는 것은 무엇인지?
- 데이터베이스 쿼리에서 단일 결과가 반환되지 않을 수 있는 상황을 항상 고려해야 된다고 생각합니다.
- Optional을 사용하여 결과를 안전하게 처리하는 방법을 배웠습니다.
- 클라이언트 측 스크립트에서 비동기 작업을 적절히 처리하는 방법을 배웠습니다.
무엇을 얻을 것인지?
- 예외가 발생하지 않는 안정적인 코드 작성법을 알게 되었습니다.
- 클라이언트와 서버 간의 비동기 작업 처리 지식을 알게 되었습니다.
이 방법이 최선이었는지?
주어진 상황에서는 Optional을 사용하여 단일 결과를 안전하게 처리하는 방법이 현재 저에겐 최선이었던것 같습니다.
또한, 클라이언트 측에서 비동기 작업을 적절히 처리하는 방법을 통해 사용자에게 개선된 점을 보여드렸습니다.
다른 방법은 없었는지?
다른 방법으로는 쿼리 결과를 직접 리스트로 받아서 처리하거나,
쿼리 자체를 수정하여 다중 결과가 반환되지 않도록 하는 방법도 생각해볼 수 있습니다.
그러나 Optional을 사용하여 단일 결과를 처리하는 것이 더 간단하고 명확한 해결책이라고 생각했습니다.
'프로젝트(project)' 카테고리의 다른 글
비밀번호 검증 및 데이터 무결성 유지 (0) | 2024.07.25 |
---|---|
비밀번호 해싱과 Security로 보안 높이기 (0) | 2024.07.25 |
트랜잭션 및 외래키 제약 조건 문제 (0) | 2024.07.24 |
비밀번호 찾기 및 재설정과 임시 비밀번호 문제 (0) | 2024.07.24 |
MySQL과 S3를 활용한 효율적인 설계 (0) | 2024.07.23 |