본문 바로가기
Back-end/JAVA

[JAVA] Spring으로 REST API 구현하기 (3) - Error Controller

by 허도치 2019. 12. 5.

2019/12/05 - [Back-end/JAVA] - [JAVA] Spring으로 REST API 구현하기 (1) - 프로젝트 생성 및 실행

2019/12/05 - [Back-end/JAVA] - [JAVA] Spring으로 REST API 구현하기 (2) - Interceptor

 

 

  지난 포스트에서는 secretKey가 없거나 일치하지 않았을 때, 접근을 차단하는 Interceptor를 만들었는데 이번 포스트에서는 유효하지 않은 Request가 요청될 때 처리하는 Error Controller를 다루어 보도록하겠다.

 

 

1. Interceptor 생성.

   1-1. ErrorInterceptor.java 작성.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.dochi.prj.config.interceptors;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
 
@Controller
public class ErrorInterceptor implements ErrorController {
    
    private static final Logger logger = LoggerFactory.getLogger(ErrorInterceptor.class);
    
    static final String ERROR_PATH = "/error";
    
    @Value("${web.path.error}")
    String errorPage;
    
    @RequestMapping(value = ERROR_PATH)
    public String error(HttpServletRequest request) {
        Object errorStatusCode = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
        
        logger.info("ERROR Interceptor: {}",errorStatusCode);
        return errorPage+errorStatusCode;
    }
 
    @Override
    public String getErrorPath() {
        return ERROR_PATH;
    }
}
 
cs

         - 14 ln: ErrorController Interface를 구현.

         - 18 ln: 오류가 발생했을 때 받는 URI로 기본값으로 "/error"로 되어있으므로 그대로 작성.

         - 20~21 ln: 오류를 Catch했을 때, Redirect할 URI의 Prefix를 설정. application.yml에 "web.ath.error = err/" 추가.

         - 24~29 ln: 오류를 Catch했을 때, "err/{errorCode}"로 새로운 URI를 생성하고 Redirect. 여기서 View를 호출할 수 도 있지만, Interceptor처럼 활용하기위해서 Redirect로 처리.

 

 

2. Controller 생성.

   2-1. ErrorController.java 작성.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.dochi.prj.error;
 
import javax.servlet.http.HttpServletRequest;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.configurationprocessor.json.JSONObject;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class ErrorController {
    
    private static final Logger logger = LoggerFactory.getLogger(ErrorController.class);
 
    @RequestMapping(value="/err/{errorCode}", method={ RequestMethod.GET, RequestMethod.POST })
    @ResponseBody
    public String errMessage(@PathVariable("errorCode"String errorCode, HttpServletRequest request) throws Exception {
        logger.info("Error Handle... {}", errorCode);
        
        JSONObject jsonObj = new JSONObject();
        
        jsonObj.put("success"false);
        jsonObj.put("code", errorCode);
        
        return jsonObj.toString(4);
    }
    
}
 
cs

         - ErrorInterceptor에서 보내는 요청을 처리하는 Controller로 다른 Controller들과 똑같이 작성하면됨.

 

 

3. 마치며

   - 위와 같이 설정하면 404, 500 등 유효하지않은 Request가 들어왔을 때 처리할 수 있게 된다. errorCode별로 다른 처리를 해보려고 위와같이 구현한 것이므로 소스가 비효율적으로 보인다면 ErrorInterceptor만 구현해도 무방하다. 

   - 다음 포스트에서는 Controller에서 Exception이 발생했을 때 처리할 수 있는 ExceptionHandler를 만들어 보겠다.

댓글