카테고리 없음

2일차 과제

성-민 2023. 5. 9. 15:54

DI(Dependency Injection)

객체를 클래스 내부에서 직접 생성하고 사용하는 것이 아니라, 다른 클래스에서 생성한 객체를 주입 받아 사용하는 것이다. 객체 간의 의존 관계를 느슨하게 만들어주는 디자인 패턴이다.

 

Spring DI 방법

 - 필드 주입 : 외부에서 객체 필드에 직접 접근할 수 있어 캡슐화가 깨질 위험이 있음

 - 수정자 주입(Setter) : 객체의 값이 바뀔 수 있어 캡슐화가 깨질 수 있음

 - 생성자 주입 : 불변, 단일 객체 생성 가능. 권장 되는 방법

 

DI 장점

 - 결합도 감소 : 객체간 결합도를 낮춘다.

 - 테스트 용이성 : Mock 객체 주입을 통해 테스트를 쉽게할 수 있다. 테스트 결과의 일관성과 신뢰성을 높일 수 있다.

 - 코드가독성 : 의존성이 명시적으로 선언되므로 코드의 가독성이 높아진다.

 - 유지보수성 : 의존 관계가 명확해지고, 코드 변경이나 유지 보수가 용이해 진다.

 - 재사용과 확장성 : 의존 관계를 외부에서 관리하기 때문에 다른 모듈에서 재사용하기 쉽다.

 - 중복 코드의 감소 : 의존성을 외부에서 주입 받고 한 곳에서 관리되어, 코드가 중복 되지 않는다.

Spring MVC 예외처리 기법

 

Spring MVC에서의 예외 처리 기법

1. @ExceptionHandler를 이용한 지역 예외 처리

  • 예외가 발생하면 해당 메서드가 자동으로 호출되어 예외 처리 수행
  • 해당 컨트롤러 내에서 발생하는 예외에 대해서만 처리
  • 예외 처리 메서드는 해당 예외에 대한 응답을 생성하거나, 로깅 등의 작업을 할 수 있음
  • @Controller public class ExceptionController { @ExceptionHandler(Exception.class) public ModelAndView handleException(Exception ex) { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("error"); modelAndView.addObject("errorMessage", ex.getMessage()); return modelAndView; } }

2. @ControllerAdvice를 이용한 전역 예외 처리

  • 모든 컨트롤러에서 발생하는 에외를 처리할 수 있다.
  • @ExceptionHandler 어노테이션을 사용하여 특정 예외를 처리하는 메서드를 정의하고, 해당 예외에 대한 응답을 생성하거나 작업을 수행할 수 있다.
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleException(Exception ex) {
        // 예외 처리 로직 및 응답 생성
        String errorMessage = "서버에서 오류가 발생했습니다.";
        return new ResponseEntity<>(errorMessage, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

3. HandlerExceptionResolver 인터페이스 구현 - 커스텀 예외 처리

  • 예외 발생 시 컨트롤러 이전 단계에서 예외 처리, 예외에 대한 응답을 생성하거나 작업 수행
  • resolveException() 메서드가 예외가 발생한 요청과 객체를 매개 변수로 받으며, 예외 처리 결과를 나타내는 ModelAndView 객체 반환
public class CustomExceptionHandler implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("error");
        modelAndView.addObject("errorMessage", ex.getMessage());
        return modelAndView;
    }
}

4. @ResponseStatus를이용한 응답 상태 코드 지정

  • 해당 어노테이션을 예외 클래스에 적용하고, 예외가 발생했을 때 지정한 상태 코드로 응답 반환
@ResponseStatus(HttpStatus.NOT_FOUND)
public class NotFoundException extends RuntimeException {
    // 예외 클래스의 내용
}
@RequestMapping("/users/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
    User user = userService.getUserById(id);
    if (user == null) {
        throw new NotFoundException("User not found");
    }
    return new ResponseEntity<>(user, HttpStatus.OK);
}

5. @ControllerAdvice와 @ExceptionGandler를 이용한 RESTful 예외처리

  • 예외 발생시, JSON 형태로 예외 정보를 반환하거나, 커스텀한 에러 응답을 생성할 수 있다.
@ControllerAdvice
public class RestExceptionHandler {

    @ExceptionHandler(NotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND) //담당하는 예외
    @ResponseBody
    public ErrorResponse handleNotFoundException(NotFoundException ex) {
        ErrorResponse errorResponse = new ErrorResponse();
        errorResponse.setMessage(ex.getMessage());
        return errorResponse;
    }

    @ExceptionHandler(ValidationException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST) //담당하는 예외
    @ResponseBody
    public ErrorResponse handleValidationException(ValidationException ex) {
        ErrorResponse errorResponse = new ErrorResponse();
        errorResponse.setMessage(ex.getMessage());
        errorResponse.setErrors(ex.getErrors());
        return errorResponse;
    }
}