seong

블로그 만들기 기능 예외 처리 하기 - 커스텀 예외처리 본문

Spring/블로그 만들기

블로그 만들기 기능 예외 처리 하기 - 커스텀 예외처리

hyeonseong 2022. 9. 21. 23:03

예외를 간단하게 정리 (원래는 종류가 굉장히 많다)

Exception의 상속관계

E라인은 컴파일 Exception -> 오타나면 이것을 try catch로 감싸서 오류나면 넘겨줘

Re아래 라인은 런타임 Exception -> 실행 중 발생 하는 에러를 감싸서 넘겨줘 

Exception동작 아래 그림으로 이해하기

1. 먼저 요청이 View, Ajax각각 들어온다.

2. 예외 처리에는 Exception메서드, NullPoint 메서드가 있다고 가정한다.

3. S(Service)에서 Nullpoint 에러가 발생해서 예외처리 Handler로 이동했다. 

4. 아래 처럼 핸들러가 있다면 Nulllpoint가 발생해도 Exception이 실행된다 

왜 Exception만 실행될까?

자바의 상속과 다형성 때문이다. 

내부를 확인 해보면 Exception이 최상위 클래스이고, 자식들로 수많은 예외 처리 부분이 존재한다. 

그럼 NullPoint가 발생해도 Exception이 있다면 오버로딩 되어 부모에 가서 실행 될 것이다. 

그래서 예외 처리를 특정한 부분을 지정해 작성해주는 방법 또는 커스텀 방식을 사용해주게된다.

DS - Dispatch Servlet , C - 컨트롤러 , S - Service

커스텀 예외처리

Exception의 종류는 너무 많고,전부다 각각 무슨 에러가 발생 할 지 알고 넣으면 좋지만 쉽지 않다. 

그래서 이럴 때 두가지로 나눈다.

Ajax 에러 전담 Exception

View 요청 왔을때 처리하는 Exception

위의 두가지로 나눈다. 위의 두가지를 만들때 커스텀 Exception을 만들어주면 된다. 


실습으로 확인

해볼 것은 회원가입 , 게시글 수정하기 예외처리이다.

회원가입은 username의 길이가 20자 이상으로 가면 예외처리,

수정하기은 없는 게시글을 수정하러 갔을 경우 예외처리를 해볼것이다.  

커스텀 예외처리 전 기본 셋팅

1. 먼저 필요한 파일을 만들어 준다.

2. Handler부분에 @ControllerAdvice를 붙여준다. -> 예외처리를 관리 할 Handler 임을 뜻한다.

Handler 코드

package site.metacoding.red.handler;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import site.metacoding.red.handler.ex.MyApiException;
import site.metacoding.red.handler.ex.MyException;
import site.metacoding.red.util.Script;
import site.metacoding.red.web.dto.response.CMRespDto;

@ControllerAdvice
public class MyExeptionHandler {
	
	@ExceptionHandler(MyApiException.class)// runtime은 실행 중 오류
	public @ResponseBody CMRespDto<?> apiError(Exception e){
		return new CMRespDto<>(-1,e.getMessage(), null);// 에러가 나면 응답 해줄 데이터 
	}
	
	
	@ExceptionHandler(MyException.class)// runtime은 실행 중 오류
	public @ResponseBody String m1(Exception e){
		return Script.back(e.getMessage());// 에러가 나면 응답 해줄 데이터
        // Script.back는 미리 만들어 두었다.
	}
	

}

3. 이제 MyExpeption 2가지를 만들어 준다.

두 예외 처리 모두 메서드 실행 후 런타임시 발생 하는 예외를 처리 하기 때문에  RuntimeException을 상속한다

데이터를 리턴해줄 MyApiException 

package site.metacoding.red.handler.ex;

public class MyApiException extends RuntimeException{ // Exception은 컴파일 에런줄 착각함 Run으로 해야함.
	
	public MyApiException(String msg) {
		super(msg);
	}

}

 

View를 리턴 해줄 MyException

package site.metacoding.red.handler.ex;

public class MyException extends RuntimeException{
	
	public MyException(String msg) {
		super(msg);
	}

}

여기까지 했다면 필요한 부분에 예외처리만 작성 해주면 된다

게시글 수정하기 예외처리 하기 

먼저 100번글은 없지만 주소창에서 임의로 입력해서 수정 페이지로 이동이 가능하다.

실제로 게시글이 없다면 접근조차 할 수 없어야 하므로 예외처리를 해주어야한다. 

Service부분 작성

	public Boards 게시글수정화면데이터가져오기(Integer id) {
		Boards boards = boardsDao.findById(id);
		if(boards == null) {
			throw new MyException(id+"게시글을 찾을 수 없습니다.");
		}
		return boards;
	}

 

결과 확인

 

회원가입 예외처리 하기 

결과 확인