Search
Duplicate
📒

[Java Study] 07-x. 예외

상태
미진행
수업
Java Study
주제
4 more properties
참고

예외

추상화 수준에 맞는 예외

NOTE
메서드가 던지는 예외가 해당 메서드가 속한 인터페이스 추상화 수준과 일치해야 한다
메서드가 저수준 예외를 처리하지 않고 바깥으로 전파해버리게 되면, 내부 구현 방식을 드러내어 윗 레벨 API를 오염시킵니다.
이 문제를 피하려면 상위 계층에서는 저수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 바꿔 던져야 하며 이를 예외 번역이라 합니다.
추상화 수준은 인터페이스를 사용하는 클라이언트에게 노출되는 연산의 수준을 의미합니다.
ex) 고수준의 추상화를 제공하는 메서드는 파일 시스템이나 네트워크 통신같은 저수준 세부 사항을 숨겨야 합니다. 즉 SQLException, IOException을 직접 던지지 않아야 함을 의미합니다.
예외 반환은 저수준의 예외를 고수준에 맞춰서 변환해야 합니다.
try-catch에서 저수준 예외를 잡고, 현재 추상화 수준에 맞게 변환하여 던진다.
예외 포장은 예외 변환의 한 형태로, 발생한 예외를 더 추상적인 예외로 포장하여 던지는 기법입니다.
API 사용자는 내부 구현의 복잡성을 신경 쓰지 않고도 예외를 처리할 수 있습니다.
public class BankService { public void withdraw(String accountId, double amount) throws InsufficientFundsException { try { // 데이터베이스에서 계좌 정보 조회 및 인출 로직 // 이 과정에서 DatabaseAccessException이 발생할 수 있음 checkBalanceAndWithdraw(accountId, amount); } catch (DatabaseAccessException e) { // 저수준 예외를 고수준 예외로 변환 throw new InsufficientFundsException("잔액이 부족합니다.", e); } } private void checkBalanceAndWithdraw(String accountId, double amount) throws DatabaseAccessException { // 실제 인출 로직 구현... // 예를 들어, 데이터베이스 조회 결과 잔액이 인출 금액보다 적은 경우 DatabaseAccessException을 던짐 } } // 고수준 예외(DatabaseAccessException => InsufficientFundsException) public class InsufficientFundsException extends Exception { public InsufficientFundsException(String message, Throwable cause) { super(message, cause); } } // 저수준 예외 public class DatabaseAccessException extends Exception { public DatabaseAccessException(String message) { super(message); } }
Java
복사

예외를 무시하지 말자

NOTE
예외 처리를 설계하고 구현할 때, 발생할 수 있는 예외를 무시하거나 적절히 처리하지 않는 것은 애플리케이션의 안전성과 신뢰성을 해칠 수 있습니다.

핵심 요약

예외는 프로그램의 정상적인 흐름에서 벗어난 상황을 알리는 목적으로 설계되었습니다. 따라서 예외가 발생하면 프로그램이 제대로 실행되지 않고 있다는 신호입니다.
예외를 무시하는 것은 문제의 근본적인 원인을 해결하지 않고 두는 것으로, 이는 나중에 더 심각한 오류로 이어질 수 있습니다.
모든 예외를 로깅하고 복구와 알림 등의 조치를 시작해야 합니다. 때로는 예외를 무시하는 것이 적절할 수 있지만, 이 결정은 신중히 해야 합니다.

추가 고려 사항

예외가 제공하는 메시지나 스택 트레이스 등의 상세 정보를 활용해 문제를 해결해야 합니다.
사용자에게는 기술적인 메시지를 직접 보여주기보다는 사용자 친화적인 메시지로 전환해 보여주는 것이 좋습니다.
민감한 정보가 로그에 기록되지 않도록 주의해야 합니다.