1. Runtime Exception
Runtime Exception은 프로그램이 실행 중일 때 발생하는 예외로, 컴파일러에서 체크하지 않기 때문에 명시적으로 처리하지 않아도 됩니다. 그러나, 이 예외를 적절히 처리하지 않으면 프로그램이 비정상 종료될 수 있습니다.
주요 특징:
- Unchecked Exception에 속하며, RuntimeException 클래스를 상속받습니다.
- 프로그램이 실행되기 전까지는 예외가 발생할지 알 수 없습니다.
- 컴파일 시점에서 체크하지 않기 때문에, 예외 처리를 강제하지 않습니다.
- 예: NullPointerException, ArrayIndexOutOfBoundsException, IllegalArgumentException 등이 있습니다.
예제:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ProcessingExceptionExample {
public static void main(String[] args) {
try {
BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
System.out.println(reader.readLine());
reader.close();
} catch (IOException e) {
System.out.println("파일을 읽는 도중 오류가 발생했습니다: " + e.getMessage());
}
}
}
2. Processing Exception
Processing Exception은 주로 프로그램의 논리적인 흐름에서 발생하는 예외이며, 개발자가 코드 내에서 특정한 상황을 처리할 때 사용할 수 있습니다. 이러한 예외들은 Checked Exception으로, 컴파일러가 반드시 예외 처리를 요구합니다. 처리하지 않으면 컴파일 자체가 되지 않습니다.
주요 특징:
- Checked Exception에 속하며, Exception 클래스를 상속받습니다.
- 컴파일 시점에서 예외가 발생할 가능성을 컴파일러가 인지하므로, 예외 처리를 강제합니다.
- 예: IOException, SQLException, ClassNotFoundException 등이 있습니다.
예제:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ProcessingExceptionExample {
public static void main(String[] args) {
try {
BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
System.out.println(reader.readLine());
reader.close();
} catch (IOException e) {
System.out.println("파일을 읽는 도중 오류가 발생했습니다: " + e.getMessage());
}
}
}
구분 | Runtime Exception | Processing Exception |
상속 클래스 | RuntimeException | Exception |
컴파일 시점 체크 | 체크하지 않음 | 체크하여 처리 강제 |
예외 처리 요구 여부 | 선택적 (처리하지 않아도 컴파일 가능) | 필수 (처리하지 않으면 컴파일 에러 발생) |
발생 예시 | NullPointerException, ArithmeticException | IOException, SQLException |
쉽게 기억하는 방법:
- Runtime Exception은 실행 중에 "예상치 못한 오류"로 인해 발생할 수 있습니다.
- Processing Exception은 "예상 가능한 오류"로, 이를 대비하여 반드시 처리 코드가 필요합니다.
둘의 차이는 예외가 발생하는 상황과 이를 처리하는 방식에 있습니다. RuntimeException은 코드에서 실수로 발생하는 예외이고, 컴파일러가 체크하지 않기 때문에 개발자의 주의가 필요합니다. 반면 Processing Exception은 코드에서 특정한 작업 중에 발생할 수 있는 예외로, 컴파일러가 강제로 처리하도록 요구합니다.
500 Internal Server Error가 발생하는 경우
다음은 500 Internal Server Error가 발생하는 주요 원인입니다:
- 서버 내부의 코드 오류:
- Null Pointer Exception이나 잘못된 배열 인덱스 참조 등 자바 코드 내에서 런타임 예외가 발생했을 때.
- 예를 들어, 데이터베이스 쿼리 실행 중 예외가 발생하거나 객체를 제대로 초기화하지 않았을 때.
- 서버 구성 오류:
- 서버 설정 파일(web.xml, application.properties 등)이 잘못된 경우.
- 의존성 문제나 잘못된 라이브러리 버전으로 인해 서버가 정상적으로 시작되지 않을 때.
- 외부 서비스 연동 오류:
- 서버에서 호출한 외부 API나 데이터베이스, 파일 시스템 등에서 오류가 발생했을 때.
- 네트워크 연결 문제로 인해 외부 서비스가 응답하지 않거나, 타임아웃이 발생한 경우.
- 자원 부족:
- 서버의 메모리 부족, 파일 디스크의 용량 부족 등 서버 자원이 충분하지 않을 때.
- 스레드 풀이 가득 차서 더 이상 요청을 처리할 수 없는 경우.
자바에서 Internal Server Error 500 처리 방법
Java에서는 Servlet이나 Spring Framework 등을 사용해 500 오류를 처리할 수 있습니다. 주로 예외 처리를 통해 이러한 상황을 제어합니다.
1) Spring Framework를 사용한 처리 예제
Spring에서는 @ExceptionHandler 또는 @ControllerAdvice를 사용하여 예외를 전역적으로 처리할 수 있습니다.
예제: @ControllerAdvice를 사용한 전역 예외 처리
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.servlet.ModelAndView;
@ControllerAdvice
public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(Exception.class)
public ModelAndView handleInternalServerError(Exception ex) {
ModelAndView mav = new ModelAndView("error");
mav.addObject("message", "서버에서 오류가 발생했습니다. 관리자에게 문의해주세요.");
mav.addObject("error", ex.getMessage());
return mav;
}
}
설명:
- @ControllerAdvice는 전역 예외 처리를 위해 사용됩니다.
- @ExceptionHandler(Exception.class)는 모든 예외를 처리하도록 설정합니다.
- 예외가 발생하면 사용자에게 500 에러 페이지와 함께 오류 메시지를 보여줄 수 있습니다.
2) Servlet을 사용한 예외 처리
Servlet 기반의 웹 애플리케이션에서는 web.xml에 예외 처리 페이지를 설정할 수 있습니다.
예제: web.xml을 통한 예외 페이지 설정
<error-page>
<error-code>500</error-code>
<location>/error-500.jsp</location>
</error-page>
설명:
- web.xml에 error-page 요소를 추가하여 500 오류가 발생할 때 사용자가 볼 수 있는 특정 페이지로 리디렉션합니다.
- location 속성에 해당하는 페이지는 서버 오류가 발생했을 때 사용자에게 보여질 페이지를 지정합니다.
3) 자바 코드에서 특정 예외 처리하기
다음과 같은 코드를 사용해 특정 예외가 발생했을 때 500 상태 코드로 응답할 수 있습니다.
예제: ResponseEntity를 사용한 예외 처리
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@GetMapping("/example")
public ResponseEntity<String> getExample() {
try {
// 예외가 발생할 가능성이 있는 코드
int result = 10 / 0; // ArithmeticException 발생
return ResponseEntity.ok("결과: " + result);
} catch (Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("서버 내부 오류가 발생했습니다: " + e.getMessage());
}
}
}
설명:
- ResponseEntity를 사용해 예외 발생 시 HTTP 상태 코드를 명시적으로 설정할 수 있습니다.
- ArithmeticException이 발생할 때 HttpStatus.INTERNAL_SERVER_ERROR를 반환해 500 오류로 처리합니다.
3. 요약
500 Internal Server Error는 서버 쪽에서 발생하는 일반적인 오류를 의미하며, 서버의 코드 오류, 구성 문제, 외부 서비스 오류, 자원 부족 등 다양한 원인으로 인해 발생할 수 있습니다. 자바에서는 Spring Framework의 @ExceptionHandler, @ControllerAdvice, ResponseEntity, 또는 web.xml을 통해 이 오류를 처리하고 사용자에게 적절한 메시지를 전달할 수 있습니다. 이를 통해 서버에서 발생한 문제를 보다 효과적으로 관리할 수 있습니다.
'캐나다 개발자' 카테고리의 다른 글
캐나다로 이민 온 개발자 저널 : 2024년 11월 12월 이야기 업데이트 (0) | 2024.12.23 |
---|---|
캐나다로 이민 온, 지금은 캐나다 개발자.. 3번째 12월 (1) | 2024.12.05 |
4. 캐나다 it 개발자 해외 취업 이민 이야기 - part 1. 내이야기 (1) | 2024.06.02 |
3. 캐나다 it 개발자 해외 취업 이민 이야기 - part 1. 내이야기 (0) | 2024.05.08 |
2. 캐나다 it 개발자 해외 취업 이민 이야기 - part 1. 내이야기 (0) | 2024.05.08 |