프론트엔드 컴파일 에러(Compile Error) vs 런타임 에러(Runtime error) vs 논리 오류(Logical Error), 예시
오류의 종류를 나누는 이유
오류를 최대한 빨리 고치기 위해서.
- 어디서 오류가 났는지 알면 빠르게 대처할 수 있음. 논리 오류가 난 소스에서 구문이 잘못되었는지 볼 필요는 없다.
1. 컴파일 에러(Compile Error)
문법오류(Syntax Error) 등이 해당됨. 파싱 에러(Parsing Error)라고도 불림. 컴파일하는 동안에 발생하기 때문에 다른 스레드에는 전혀 영향 주지 않음.
- 컴파일러/인터프리터가 소스 코드를 바이트 코드로 변환하면서 발견한 오류를 출력함
- 컴파일 시에 에러 메시지로 오류의 위치를 알려주기 때문에 찾기 쉬운 에러임
- 수정되지 않으면 프로그램은 컴파일되지 않음
- 해당 오류 코드가 포함된 동일 쓰레드 상에만 오류 처리가 되고, 다른 쓰레드의 코드는 오류가 없는 것처럼 처리되어 실행됨.
예시:
- 타입 구문에 해당하지 않는 속성 이름으로 오타를 내 타입에러가 발생함
2. 런타임 에러(Runtime Error)
컴파일 후 프로그램이 실행하는 동안에 발생함. 런타임 에러라는 게 프로그램 실행 시 일어나는 에러라는 뜻이기 때문에, 큰 범위의 에러를 포함함
- 프로그램에서 수행할 수 없는 작업을 시도할 때 발생함. 프로그램 발생 시 설계 미숙으로 인한 경우가 많다고 함.
- 대부분 try-catch문을 이용해 에러를 해결할 수 있음.
- 런타임 에러에는 논리 에러, 시스템 에러 등이 있음.
- 다른 스레드가 정상적으로 실행할 수 있도록 해당 스레드에만 영향을 미침.
예시:
- 웹뷰에서 iOS로 메시지를 전달하려고 할 때, 존재하지 않는 메서드 이름으로 호출함
- 응답값으로 구매 혜택 리스트를 받아서 보여줘야 하는데, 빈 배열이 내려오는 경우를 고려하지 못함
3. 논리 오류(Logical Errors)
프로그램 실행에 아무런 문제가 발생하지 않지만 논리적으로 잘못되어 예상한 결과가 안 나오는 오류.
- 비즈니스 로직 또는 요구 사항에 따라 개발되었지만, 예상했던 응답값이 내려오지 않았을 경우 발생할 수 있음
- 어디서 꼬였는지 눈에 드러나지 않아 디버그 모드로 단계별로 실행하면서 찾음.
- 물론 내가 구현한 로직이 잘못되어서 발생하는 에러
예시:
- 주문페이지에서 신용카드결제를 선택했는데, 신용카드 결제 관련 약관이 노출되지 않음.
- 날짜가 바뀌면 오늘의 데이터로 변경되어야 하는데, 자동으로 바뀌지 않아 어제 데이터로 머물러 있음
+ 시스템 에러(System Error)
- 프로그램 동작 중에 운영체제 또는 하드웨어에 문제가 발생해 프로그램이 정상적으로 동작하지 않는 경우에 발생하는 에러