안정성과 예외 처리 (24.05.08)

YJ·2024년 5월 8일
post-thumbnail

블로그 작성법
목표 > 공부한 내용 > 얻었고, 앞으로 이걸 해봐야지 적기

✋ 수업 목표

  • 예외에 대해 공부해보자.

🤔 공부한 내용

예외

프로그램 실행 중 나타나는 오류 (개발자가 예상하지 못한 오류)
ex. 나이에 음수를 넣는다던가, 이름에 숫자를 넣는다던가...
=> "유효성 검사"
다음 화면으로 못 넘어갈 에러들
(SQL, Null, Index, ...)

  • Checked Exception / Unchecked Exception
    실행 버튼 누르면 걸려요 / 구동 중 걸려요.
    반드시 처리 해야함 / 처리 개발자 마음
    컴파일러가 체크를 했냐 안했냐로 나뉜다.
    컴파일러가 체크 / un체크 여부

    ex. NullPointerException : Unchecked Exception
    cf. 이름이 Null Pointer인 이유: 참조 자료형, 객체 주소 가리킴

    예외처리는 프로젝트의 완성도 에 영향을 미친다.

    예외 예시


    catch 부분에서 모든 예외를 처리하기 위해, 상위 예외 클래스인
    Exception을 넣어서 처리해줄 수 있다.

    예외 클래스 종류

    Object 클래스

  • Throwable 클래스
    • Error 클래스: OutOfMemoryError, VMError
    • Exception 클래스
      1) checked: IOException, SQLEx, ClassNotFoundEx
      2) unchecked: RuntimeEx - NPE, IndexOutOfBoundEx

예외처리 방법

  1. 조건문으로 처리
String str = null;

if(str != null) {
	System.out.println(str.charAt(0));
}
  1. try - catch
try {
	// 예외가 발생할 것 같은 부분
} catch(예외클래스 e) {
	// 예외 발생시 처리 부분
}

실행순서
1) try 구문 순서 실행
2) 예외 만나면 => JVM이 예외가 터진 지점, 이유
=> 예외 객체 => catch 호출하면서 매개변수로 넣어줘요.

Exception 처리방법
1. 실행 시켜본다.
2. 예외가 발생한다. -> 예외 발생 클래스명을 컴파일러가 알려준다.
3. 예외가 발생한 코드를 try - catch로 묶어준다.
4. catch에서 예외 객체.toString으로 예외 객체를 출력해본다.
5. catch에 상세 예외 클래스 를 명시한다.

상세 예외 클래스

상세 예외 클래스를 명시하는 이유는
try 안에서 몇 개의 예외가 발생하는지 알 수 없기에, 예외를 분기하여 처리하기 위해서이다.

다음과 같은 예외들이 발생할 때는 아래와 같은 방법을 해결할 수 있다.
1. 배열의 인덱스 값이 넘어섰을 때
2. Input으로 다른 타입의 값이 입력될 때

try {
	Scanner scanner = new Scanner(System.in);
	int cardIdx = scanner.nextInt();

	int[] arr = {1,2,3,4,5,6};

	System.out.println("뽑은 카드 번호는 : ", cardIdx);
	System.out.println("뽑은 카드에 적힌 숫자는 : ", arr[cardIdx]);
} catch(ArrayIndexOutOfBoundsException e) {
	System.out.println("그거 없는 번호야");
} catch(InputMismatchException e) {
	System.out.println("숫자만 입력하라고..");
}

Throws

다음과 같은 상황에 예외를 잡는 부분을 어디로 해야할까?

public static void main(String[] args) {
	int result  = divide(10, 0);
}

public static void divide(int x, int y) {
	return x / y;
}

답은 에러가 발생하는 연산에다가 try - catch를 해줘야 한다.

public static void main(String[] args) {
	// 여기서 예외 처리하는게 아니라
    int result = divide(10, 0);
}

public static int divide(int x, int y) {
        // 이 로직에서 에러가 발생하기에
        // 여기서 에러를 처리해줘야 한다.
        
        int result = 0;
        try{
            result = x / y;
        } catch (ArithmeticException e) {
            System.out.println("0으로 나눌 수 없다.");
            System.out.println(e.toString());
        }
        return result;
    }
  • 예외 처리 면접 질문
    Q. 예외가 발생하는 메소드가 있습니다.
    예외 처리는 메소드가 호출되는 부분에서 해야하는 것이냐?
    아니면, 예외 처리는 발생시키는 메소드가 책임을 져야 하냐?

A.
예외를 발생시키는 메소드가 책임을 지는 것이 맞다고 생각함.
(이 메소드 안에서 try catch로 잡는 것)

이러한 질문으로 인해 throws가 등장하였다.

throws의 등장

throws는 날 호출한 놈이 날 책임 져야지
예외가 발생하는 연산이 포함된 메소드를 호출한 위치로 예외 처리를 전가하는 것!
throws를 통해서 발생하는 예외 객체

  • 이 메소드를 호출한 위치로 이 객체를 던진다.
  • 예외 객체를 대신 처리해줘야해요.

사용자 예외 클래스 만들기

gradle 실행 변경


여기서 intellJ로 설정하면, gradle 대신 intellJ의 현재 class 파일의 main method가 실행된다.

Entity

Entity = 객체(Object)
cf. JPA Entity

  • HttpEntity : Spring 제공 클래스
    : intelliJ 검색창 어떻게 열기?
    ctrl + n 으로 검색 가능하다.
    ctrl + shift f로도 검색 가능하다.
    Shift + shift로도 검색 가능하다.
  • HTTP Headers
  • HTTP body
  • RequestEntity extends HttpEntity
  • ResponseEntity extends HttpEntity

ResponseEntity

같은 이름의 생성자로 여러 기능을 하도록 오버로딩을 많이 사용한다.

ResponseEntity 사용 방법

Controller에서 요청에 대해 ResponseEntity 타입으로 반환할 수 있다.

HttpStatus 정리 자료
https://sirobako.co.kr/detail/166

😉 앞으로 이걸 해봐야지

프로그램의 안정성을 위해서 최대한 많은 테스트 진행과 예외처리를 진행할 것 이다. 많은 예외처리 클래스에 대해 공부해보고 이를 내 프로젝트에 적용해보자.

profile
dev

0개의 댓글