Spring 개념정리

[Spring] MVC : 날짜 값 변환, @PathVariable, 익셉션 처리

개발자 문문 2025. 7. 8. 16:29

안녕하세요 개발자 문문입니다.

오늘은 Spring MVC 날짜 값 변환, @PathVariable, 익셉션 처리에 대해 공부하겠습니다.

 

  • @DateTimeFormat
@DateTimeFormat(pattern = "yyyyMMddHH")
private LocalDateTime from;

- 만약 from에 "2025070815" 라는 값이 들어온다면, LocalDateTime으로 변환해줍니다. ("2025년 7월 8일 15시" 값을 갖는 LocalDateTime 객체)

 

  • 변환 처리 과정

1. 스프링 MVC는 요청 메서드DispatcherServlet 사이를 연결하는 RequestMappingHandlerAdapter 객체를 사용하는데, 이 객체는 요청 파라미터와 커맨드 객체 사이의 변환 처리를 위해 WebDataBinder를 사용합니다. 

 

2. WebDataBinder커맨드 객체를 생성하고, 커맨드 객체의 프로퍼티와 같은 이름을 갖는 요청 파라미터를 이용해 프로퍼티 값을 생성합니다.

 

3. 이때 WebDataBinder는 변환처리를 하기위해 ConversionService를 사용하는데, @EnableWebMvc를 사용하면 DefaultFormattingConversionServiceConversionService로 사용하여 변환처리를 진행합니다.

 

  • @PathVariable
@GetMapping("/member/{id}")
public String detail(@PathVariable("id") Long memId, Model model){
...
}

- {id} 같이 중괄호로 둘러 쌓인 부분을 경로 변수하고 부르는데, @PathVariable("id")를 사용하면 이 어노테이션이 적용된 memId에 {id}에 적혀있는 값이 들어값니다. ex) http://localhost:8080/member/10 , memId = 10

 

  • @ExceptionHandler
...

@GetMapping("/member/{id}")
public String detail(@PathVariable("id") Long memId, Model model) {
	...
    throw new MemberNotFoundException();
    ...
}

@ExceptionHandler(MemberNotFoundException.class)
public String handleNotFoundException() {
	return "member/noMember";
}

- 만약 익셉션 처리를 직접하고 싶다면 @ExceptionHandler가 붙은 메서드를 만들어 처리하면 됩니다.

- 위 코드에서 detail() 메서드를 처리하는중 MemberNotFoundException이 발생한다면, @ExceptionHandler(MemberNotFoundException.class)가 붙어 있는 handleNotFoundException() 메서드가 실행됩니다.

 

  • @ControllerAdvice

- 만약 여러 컨트롤러에서 동일 타입의 익셉션이 발생할 경우 모든 컨트롤러에 @ExceptionHandler를 구현하는건 굉장히 번거로운 일입니다.

- 이런 경우에는 @ControllerAdvice를 사용하여 공통 익셉션 처리를 하면 됩니다.

@ControllerAdvice("spring")
public class CommonExceptionHandler {

    @ExceptionHandler(RuntimeException.class)
    public String handleRuntimeException() {
    	return "error/commonException";
    }
}

- 위의 코드는 spring 패키지, 혹은 그 하위 패키지에서 RuntimeException이 발생할 경우 handleRuntimeException() 메서드를 수행합니다.

- 위 클래스를 사용하려면 빈으로 등록되어 있어야 합니다.

 

  • 익셉션 처리 우선순위

- 위의 두 가지가 둘 다 있다면 공통 익셉션 처리가 아닌 컨트롤러 익셉션 처리가 우선시 됩니다.