카테고리 없음
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;
}
}