개발/TIL
Validation과 Exception Handling
ebang
2025. 3. 1. 00:34
Validation과 Exception Handling
validate 및 예외 처리를 수행하는 전략에 대해 생각해본 내용을 정리했다.
예외가 발생할 가능성이 낮다면, 불필요한 Validation은 피하는 것이 좋다.
- 평소에는 발생하지 않는 오류라면, 불필요한 validation은 코드의 가독성을 해칠 수 있고, 성능을 저하시킬 가능성이 있다.
- 예를 들어, count가 2 또는 3 이외의 값이 들어올 일이 거의 없는데, 불필요한 default case를 추가하여 IllegalArgumentException을 던지는 것이 꼭 필요할까?
- 만약 count 값이 비즈니스 로직 상 절대 변하지 않는 값이라면, 애초에 해당 값이 올바른 범위를 벗어나는 일이 없도록 설계하는 것이 더 낫다.
- 즉, 사전에 Enum, 상수, 제한된 데이터 구조를 활용하여 유효하지 않은 값이 들어오는 것을 차단하는 것이 더 좋은 접근법일 수 있다.
enum TmType {
TWO, THREE
}
public int getTmResult(TmType tmType, DyeTm dyeTm) {
return switch (tmType) {
case TWO -> (dyeTm.isLow() ? 0 : 1);
case THREE -> (dyeTm.isLow() ? 0 : (dyeTm.isMid() ? 1 : 2));
};
}
예외가 발생하더라도 시스템을 안정적으로 유지하는 것이 중요하다.
- 예외가 발생한다고 해서 무조건 throw 하는 것이 아니라, 프로그램의 안정성을 고려해야 한다.
- 만약 예외가 발생했을 때 어떤 대체 값을 사용할지 또는 최소한의 서비스 영향만 주도록 할지 고민해야 한다.
- 예외가 발생할 가능성이 낮은 경우, 무조건 예외를 던지기보다 기본값을 반환하거나 Fallback 로직을 추가하는 것이 더 안전할 수 있다.
public int getTmResult(int count, DyeTm dyeTm) {
return switch (count) {
case 2 -> (dyeTm.isLow() ? 0 : 1);
case 3 -> (dyeTm.isLow() ? 0 : (dyeTm.isMid() ? 1 : 2));
default -> {
System.out.println("WARN: Unexpected tmCount value: " + tmCount);
yield -1; // 예외를 던지지 않고 기본값 반환
}
};
}
Validation이 꼭 필요하다면, Exception을 던지기 전에 의미 있는 로그를 남기자.
- 개발 중에는 IllegalArgumentException을 바로 던져도 괜찮지만,운영 환경에서는 원인을 파악할 수 있도록 로그를 남기는 것이 필수적이다.
- 단순히 throw 하는 것보다, 로그와 함께 어떤 값이 문제인지, 왜 발생했는지 기록하는 것이 중요한 것 같다.
- 기본적인 부분이지만 SLF4J 같은 프레임워크를 활용하여, 예외 발생 시 문맥(Context)과 함께 상세한 로그를 기록하고, 그리고 예외 발생 시 서비스가 중단되지 않도록 적절한 대응 로직을 추가하는 것도 필수적일 것이다.
결론
- 정말 절대 발생해서는 안 되는 상황 (그대로 지나가면 더 큰 에러가 발생하는 경우 등 ) 이라면, RuntimeException을 던지는 것이 맞다. 로그도 잊지 말자. (디버깅이 중요! )
- 하지만, 그 예외가 비즈니스 로직에서 자연스럽게 해결될 수 있다면 예외보다는 기본값 제공이 나은 것 같다.
관련해서 에러를 어디서부터 방어하고 throw 할 지, 발생한 위치에서 얼마나 상위계층에서 exception을 처리할 지 등등에 대한 고민도 있었는데, 다음 글에 정리되어 있다.
애플리케이션 에러 로깅하기, 에러 핸들링 (feat. clean code)
fastapi 을 이용한 web app 을 개발하면서, 어떻게 에러처리를 할 지 고민하면서 읽은 글을 정리해보았다. 어디서 에러를 던질 것이며, 어디서 이 에러에 대한 핸들링을 할 것이냐는 클린
ebang.tistory.com
더 중요한 건 에러 핸들링도 중요하지만, 에러가 없는 설계를 위해서 노력해보자! 화이팅!