학습(구)/Spring 요약

날짜 값 변환, @PathVariable, 익셉션 처리

잉아당 2020. 11. 29. 01:05
728x90

날짜 값 변환

가입일자를 기준으로 select하는 회원 검색 기능은 DB관련 MemberDao에서 selectByRegdate()메소드를 작성합니다.

from,to를 매개변수로 받아 해당 날짜 사이의 데이터를 select하고 결과로 나온 ResultSet을  RowMapper를 이용해 객체로 만들어 List를 반환합니다. 

from과 to 파라미터는 커맨드 객체를 이용하여 표현합니다.  파라미터는 모두 String 타입이지만 기본 타입의 변환은 핸들러 어댑터에서 수행시켜주므로 해당 필드에 @DateTimeFormat 어노테이션을 사용하여 pattern을 지정하면  핸들러 어댑터가 자동으로 지정한 패턴에 따라  LocalDateTime으로 변경시켜줍니다.

커맨드 객체 생성은 WebDataBinder가 수행하고 요청 파라미터와 뷰출력 변환 작업은 WebDataBinder의 ConversionService 객체로 수행합니다. @EnableWebMvc 어노테이션을 사용하면 DefaultFormattingConversionService가 ConversionService로 등록 되며 WebDataBinder가 사용합니다.

검색을 하는 컨트롤러를 작성시에 MemberDao를 이용하여 검색 기능을 수행합니다. 입력값이 null이 아닌경우 해당 기능을 수행하도록 작성합니다.

MemberDao는 DI를 통해 주입받습니다.

컨트롤러는 Bean컨테이너에 등록이 되어져있어야합니다.

뷰페이지는 검색 날짜 입력과 검색 결과 출력을 한페이지로 작성하며 LocalDateTime을 출력하기 위해 커스텀 태그를 사용합니다.

 

날짜를 지정한 형식대로 입력하지 않을 경우 400에러가 발생하게 되므로 컨트롤러에서 요청 매핑 메소드에 Error객체를 매개변수로 사용하여 핸들러 어댑터가 자동 검증을 수행하게 하고 에러 발생 시 에러코드가 Error 객체에 들어가게 됩니다. 이때 typeMismatch에러코드가 발생하게 되고 properties파일에 typeMisMatch.java.time.LocalDateTime 키 코드를 작성하게 되면 해당 에러가 보여지게 됩니다.

 

@PathVariable

여러 요청 경로에 대해서 한 매핑 메소드 사용하거나 경로의 일부가 고정되어 있지않고 달라질 경우 @PathVariable을 사용합니다. 

매핑경로에 {경로변수}를 사용하고 @PathVariable어노테이션으로 지정한 파라미터이고 어노테이션에 경로변수와 동일한 이름으로 설정이 되어져 있으면 전달 됩니다.

 

익셉션 처리하기

컨트롤러에서 익셉션을 처리하지 않을 경우 상위는 DispatcherServlet이므로 WAS를 통해 전달되어 어디서 발생된 오류인지 구분하기 어렵습니다. 개발자가 아니고서는 화면을 이해하기 어려움으로 개발자가 만든화면으로 익셉션을 처리하는 것이 적합합니다. 이를 위해서 @ExceptionHandler 어노테이션을 이용해서 처리합니다. 발생한 익셉션에 대해서 같은 컨트롤러에 해당 익셉션이 설정된 @ExceptionHandler어노테이션이 적용된 메소드가 존재하면 WAS에 전달되지 않고 try-catch를 사용하지 않아도 해당 메소드에서 리턴하는 뷰페이지로 익셉션을 처리할 수 있습니다. 

여러 컨트롤러에서 동일한 익셉션이 발생할 경우 각 컨트롤러에서 익셉션 처리 메소드를 작성하는 것은 중복 코딩이 됩니다. 그러므로 별도의 객체를 생성한 후 @ControllerAdvice 어노테이션을 적용하고 공통 익셉션을 처리하는 메소드를 작성합니다.

@ControllerAdvice 어노테이션의 속성으로 대상을 지정할 수 있습니다.

1) value속성(생략가능)을 사용하여 컨트롤러가 소속되는 패키지를 지정

2) annotations 속성을 사용하여 특정 어노테이션이 적용된 컨트롤러를 지정

3) assignableTypes 속성을 사용하여 특정 타입의 컨트롤러를 지정

 

익셉션 처리의 우선 순위는 같은 컨트롤러 내 메소드가 우선이고 그다음이 @ControllerAdvice객체의 메소드를 사용합니다.