예외(Exception)
실무에 들어가서 놀란 것은 이 예외를 처리하는 부분이라고 볼 수 있다.
시큐어 코딩 가이드도 읽어가면서,
왜 e.printStackTrace()를 쓰면 안 되는지
예외 처리를 왜 해줘야 하는지
예외의 종류도 checked / unchecked 로 나뉘어져 있다는 것을 알게 되었다.
부끄럽지만 원래는 실무에 들어가기 전에 알고 있어야 하는 당연한 것이였다.
e.printStackTrace()를 쓰면 안 되는 이유?
e.printStackTrace()를 자세히 보면 예외 발생 스택 정보를 출력하면서
애플리케이션 내부 구조 및 메서드 호출 경로 등이 그대로 노출되게 된다.
이는 심각한 보안 취약점 이다.
또한 스택 추적 정보를 출력하는데 많은 시간과 자원을 사용합니다.
Tmi. System.out.println으로 log를 남기지 말자
public void println(String x) {
if (getClass() == PrintStream.class) {
writeln(String.valueOf(x));
} else {
synchronized (this) {
print(x);
newLine();
}
}
}
- synchronized(this)
- 출력 작업이 동기화 되어 있어, 성능 저하가 발생할 수 있다.
- 데드락 상황이 이루어질 수 있다.
- 만약 데이터를 확인하고 싶은 경우, 디버깅을 통해 해결해보도록 하자.
- 혹은 Log4j, Slf4j를 사용하자.
예외처리는 왜 해야할까?
가장 큰 이유는 !
예외는 어디서, 어떤 이유로 발생했는지 확인할 수 있어야 하고
log에 기록된다 -> 문제가 생기면 log를 보고 조치를 해야하기 때문
프로그램 내부에서 rollback하거나, 혹은 다시 수행되도록 하는 로직을 개발자가 정할 수 있다.
개발자가 잡을 수 있는 예외가 있고,
잡지 못하는 예외가 있을 수 있다.(네트워크 통신, 서버가 죽은 경우 등등)
프로그램이 다운될 만한 심각한 Exception은 Error라고 부른다.
개발자가 잡을 수 있는 예외도 두 가지로 나뉜다.
- checked Exception : Runtime Exception을 제외하고 ~ (SQLException, IOException)
- unchecked Exception : Runtime Exception과 이를 상속한 자식들
CheckedException의 경우 rollback이 되지 않고, 반드시 예외를 처리해야 한다.
만약 예외를 처리하지 않으면
- 예외를 던지거나 잡아줘~ 하는 빨간 컴파일 에러가 발생하게 된다.
반대로 RuntimeException은 예외를 처리해주지 않아도 컴파일 시 단속하지 않는다.!
이 예외에는 우리에게 익숙한 NullPointException이 포함되어 있다.
예외를 개발자가 처리하더라도, 그냥 Exception으로 잡게 된다면
어떤 문제인지 알 수가 없어진다.
참고 블로그:
try catch 구문을 상세하게 적어야 한다는 뜻이다.
예외를 상세하게 적어 처리해야 추후에 발생할 문제를 빨리 해결할 수 있게 된다.
보통 Rest API의 경우에는 공통으로 예외를 처리하는 Handler를 두어, 여러 사용자가 커스텀한 Exception(RuntimeException)에 대한 로그를 남기고 처리하게 된다.
이런 식으로 사용하지는 않는 다는 뜻이다.
try() catch() catch() catch()
과거에는 외부 API에 관련된 예외를 계속 만들다가 예외 처리 catch 구문이 200줄까지 나왔다고 한다.
그래서 그냥 Exception으로 다 처리하다가 발생한 문제점은 위에서 설명했듯이
예외가 누락되는 현상이 발생되어, 문제가 생겼던 부분을 찾기 매우 어려워 지게 된다.
예외 처리 잘 해서 보안 취약점에 걸리지 맙시다.~!
참고 사이트:
보안 취약점에 대해서 읽어보다보면, 왜 이런 처리를 해줘야 했지?
라는 의문점을 풀 수 있습니다.
2021년 Java 시큐어 코딩 가이드 / 설명이 잘 되어 있습니다.
https://www.kisa.or.kr/2060204/form?postSeq=9&page=1
'프로그래밍 언어 > 자바' 카테고리의 다른 글
Random()은 랜덤이 아니다? (0) | 2024.04.10 |
---|---|
nextInt() 사용 후 nextLine()을 입력해줘야 하는 이유 (0) | 2024.04.07 |