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;
}
}