에러Error란 시스템 레벨에서 문제가 발생해 대처가 불가능한 오류를 의미한다. 에러는 아래의 3가지 종류로 나눌 수 있다.
컴파일 에러
컴파일 시에 발생하는 에러이다. 문법을 잘못 작성했을 때 컴파일 에러가 발생한다. 주로 IDE에서 빨간 줄이 그어지는 것으로 컴파일 에러를 확인할 수 있다.

즉 해당 코드로는 프로그램을 컴파일할 수 없는 상태이며, 컴파일을 하기 위해서는 코드를 수정해야 한다는 의미이다. 괄호, 쌍반점(;) 등이 빠지거나 변수형 문제, 초기화되지 않은 변수의 사용 등이 있다.
자바에서의 컴파일 에러는 파일을 컴파일하는 과정에서 JVM이 던지게 된다.
런타임 에러
프로그램 실행 시에 발생하는 에러이다. 컴파일은 가능하지만 해당 코드를 수행할 수 없어 발생한다. 0으로 나누거나, 무한 루프에 빠지는 등의 이유로 발생한다.

intelliJ에서 코드 자체에 빨간 줄이 그어지지는 않지만, main 메서드를 실행하면 ‘/ by zero’라는 에러 메시지를 확인할 수 있다.
논리적 에러
위의 두 에러처럼 에러 메시지가 나타나지는 않지만, 의도했던 대로 코드가 작동하지 않는 경우를 의미한다. 알고리즘 문제를 풀 때 코드상 오류는 없지만 오답이 나오는 경우도 논리적 에러에 해당한다.
예외Exception란 잘못된 사용/코딩으로 인한 에러를 말한다. 자바에서 모든 예외는 런타임 시간에 발생한다.
자바에서 예외는 다음 두 가지가 있다.
체크 예외
컴파일 시간에 감지되고 런타임 시간에 발생하는 예외를 말한다. 즉 해당 예외가 존재한다면 프로그램이 실행되는 것 자체가 불가능하며, 예외 처리 코드를 항상 같이 작성해야 한다. RuntimeException 클래스를 상속받지 않는다. IOException, SQLException 등이 있다.
체크 예외는 컴파일 시간에 감지할 수 있다(발생은 런타임 시간에 한다).
언체크 예외
프로그램 실행 시에 발생하는 예외를 말한다. RuntimeException을 상속받으며 컴파일 시에는 무시된다. 자주 사용되는 IllegalArgumentException, NullPointerException 등이 해당한다.
기본적으로 스프링에서의 @Transactional 안에서 발생하는 예외 중 체크 예외는 롤백이 되지 않고, 언체크 예외만 롤백된다. 설정을 통해 옵션을 변경할 수 있다.
아무런 처리를 하지 않았을 때 둘 다 프로그램이 종료되지만, 예외는 예외 처리를 통해 프로그램 실행 상태를 유지할 수 있다는 점이 다르다.
또한 발생한 에러에 대해 애플리케이션 코드에서 대처할 방법이 없다.이 때 대처한다는 것은 해당 에러가 발생했을 때 그것에 대처할 수 있는 처리법을 구현해 두고 프로그램이 계속 동작하도록 한다는 의미이다. 개발자가 코드 자체를 수정해 오류를 해결(fix)한다는 의미가 아니다.
처음에 에러에 대처하지 못한다는 게 무슨 의미인지 헷갈렸는데, 개발자가 코드 문법을 수정하는 것과 try-catch로 예외를 잡는 것은 다르다. 예를 들어 구문 오류로 컴파일 에러가 발생했을 때 그 코드를 정상적으로 수정하는 것은 에러를 처리해주는 게 아닌 것이다.
위 내용을 정리하자면 다음과 같다.
| 에러 | 예외 | |
|---|---|---|
| 의미 | 런타임 시간에 처리할 수 없는 에러 | 런타임 시간에 처리 가능한 예외 |
| 발생 | 시스템 이상에 의해 발생 | 애플리케이션 코드로 인해 발생 |
| 회복 | 회복 불가능 | 주로 try-catch문으로 회복 가능 |
| 구조(자바) | Error 클래스 상속 | Exception 클래스 상속 |
| 예시 | OutOfMemoryError, StackOverflowError | IOException, NullPointerException |
https://www.geeksforgeeks.org/difference-between-compile-time-errors-and-runtime-errors/
https://www.scaler.com/topics/java/error-vs-exception-in-java/