subin9804 / starducks

KOSTA 268기 최종 프로젝트 2팀 starducks ERP
5 stars 2 forks source link

[참고] 예외처리 방법 중 하나 #66

Open subin9804 opened 9 months ago

subin9804 commented 9 months ago

example

이런 예외 처리를 원하신다면 코드 참고하세요!

여러번 사용할 예외가 아니거나 간단하게 구현하고 싶을 때

  1. 예외를 일으키고 싶은 부분에 CommonException을 throw하면 됩니다. ex)

    /** 새 부서 등록 */
    @PostMapping("/add")
    public String addDept(Department department) {
        if(repository.existsByDeptId(department.getDeptId())) {
            throw new CommonException("표시하고 싶은 메세지");
        }
    
        repository.saveAndFlush(department);
    
        return "redirect:/hr/dept";
    }

예외에 이름을 붙이고 싶거나 여러 번 사용할 예외일 때

  1. CommonException을 extend한 클래스를 생성합니다. ex)
    
    public class AlreadyExistDeptException(예시) extends CommonException {
    public AlreadyExistDeptException(String message) {
        super(bundleError.getString(message), HttpStatus.BAD_REQUEST);
    }

}

2. 이 때 super 내부의 첫 번째 파라미터를 bundleError.getString(message)로 설정하시면 errors.propertise의 코드를 사용할 수 있습니다. 일반 문자열만 쓰고 싶으시다면 bundleError.getString(message) 대신에 그냥 message로 쓰시면 됩니다.

3. 예를 들어 errors.propertise에 이런 코드가 있다고 칩시다.
`dept.error.alreadyExists="이미 해당 번호의 부서가 존재합니다."`

4. 일반 문자열일 경우에는 그냥 써주시면 되고 코드를 적어주셔도 잘 나옵니다.
/** 새 부서 등록 */
@PostMapping("/add")
public String addDept(Department department) {
    if(repository.existsByDeptId(department.getDeptId())) {
        throw new AlreadyExistDeptException("dept.error.alreadyExists");
    }

    repository.saveAndFlush(department);

    return "redirect:/hr/dept";
}


5. 만일 매칭되는 코드가 없는 문자열은 bundleError.getString(message)이더라도 그대로 출력되니 편한대로 사용하세용

6. 참고로 이건 @ExceptionHandler라는 애노테이션을 사용했습니다. 원래는 하나의 컨트롤러에 설정된 예외에만 작용하는 메서드 입니다. 저는 CommonException에만 적용해두었으니 CommonException을 상속받지 않거나 CommonException이 아닌 예외에는 handler가 작동하지 않습니다. 그리고 @ControllerAdvice로 전역의 컨트롤러에 적용되게 했습니다. 따라서 제가 만든 예외처리를 사용하고 싶지 않으시다면 CommonExcption만 상속받지 않으면 됩니다!
혹은 다른 예외처리를 만들고 싶으시다면 범위만 다르게 지정해주시면 될 것 같습니다!
errorHandler()는 commons패키지의 GlobalException에 있습니다. 그리고 이 핸들러는 templates - commons - execute_script.html에 Model로 script를 전달하는 방식입니다.
lhg0529 commented 9 months ago

와 역시 수빈님 짱