Spring Wev MVC 강의 정리 (2)
15 Aug 2022패스트 캠퍼스 Spring Web MVC 강의 정리
@ControllerAdvice
- 스프링 부트 기본 에러 응답
- Whitelabel Error Page
server.error.whitelabel.enabled=false
설정 가능- 그외에 다른 설정도 할 수 있으나 정보 유출할 수 있으므로 유의해야 함
server.error.include-stacktrace=always server.error.include-message=always server.error.include-exception=true
-
BasicErrorController
- 상속받아서 특정 메소드만 오버라이드하거나 특정 핸들러 메소드 추가해서 사용 가능
- 핸들러 메서드
- BasicErrorController.errorhtml(): 뷰 응답
- BasicErrorController.error(): json body 응답
-
커스텀 에러 페이지
- static html 또는 template 이용하여 등록
- 단일 기본 페이지
- /resources/static/error.html
- /resources/public/error.html
- /resources/template/error.{템플릿 확장자}
- http status 별 기본 페이지
-
/resources/[static public template]/error/{http status code}.{템플릿확장자} -
/resources/[static public template]/error/4xx.{템플릿확장자} -
/resources/[static public template]/error/5XX.{템플릿확장자}
-
- static html 또는 template 이용하여 등록
-
@ExceptionHandler
- 비즈니스 로직이 던진 예외에 반응하는 핸들러 메서드
- 특정 컨트롤러 클래스 내부 또는 @ControllerAdvice 컴포넌트 내부에 위치
- 특정 예외에 반응
- 처리 범위
- 컨트롤러 안에 작성했을 경우: 해당 컨트롤러만
- @ControllerAdvice에 작성했을 경우: 프로젝트 전체
// RuntimeException 하위 에러도 모두 처리 @ExceptionHandler public ResponseEntity<APIErrorResponse> general(RuntimeException e) { return ResponseEntity.internalServerError().build; } // RuntimeException만 처리 @ExceptionHandler(RuntimeException.class) public ResponseEntity<APIErrorResponse> general(RuntimeException e) { return ResponseEntity.internalServerError().build; } // 여러 예외를 추가해서 해당 에러만 처리 @ExceptionHandler({RuntimeException.class, IOException.class}) public ResponseEntity<APIErrorResponse> general(RuntimeException e) { return ResponseEntity.internalServerError().build; }
- @ExceptionHandler를 모아 글로벌하게 쓸 때 사용하는 애노테이션
@ControllerAdvice
@RestControllerAdvice
(@ControllerAdvice + @ResponseBody)
- 속성
- value: basePackes
- basePackaes: 적용 범위를 문자열을 이용해 특정 패키지로 지정
- basePackeClasses
- 적용 범위를 대표 클래스 한 개를 이용해 해당 클래스가 포함된 패키지로 지정
- basePackages를 type-safe하게 사용하기 위해 제공
- assignableTypes: 적용 범위를 특정 클래스에 할당할 수 있는 컨트롤러로 지정
- annotations: 적용 범위를 특정 애노테이션을 사용한 컨트롤러로 지정
-
ResponseEntityExceptionHandler
- Spring MVC에서 내부적으로 발생하는 예외 처리
- API 예외 처리를 담당하는 @ControllerAdvice 클래스에서 상속해서 사용 가능
- 커스터마이징을 원하는 특정 메소드 오버라이딩
Controller Test
-
@SpringBootTest
- 스프링 컨테이너와 스프링 부트 환경 포함하는 테스트
- 통합 테스트 할 때 적절
- 애플리케이션 컨텍스트를 로드하는 시간이 걸림
@BootstrapWith
,@ExtendWith
포함@Test
- JUnit5 애노테이션으로 단위 테스트 메소드 지정
- 속성
- value, properties: 프로퍼티 설정
- args: 애플리케이션 실행할 때 커맨드라인으로 입력하는 옵션 설정
- classes: 애플리케이션 컨텍스트 로딩을 위한 설정 클래스 지정
- webEnvironment: 애플리케이션 컨텍스트의 웹 환경 설정
- MOCK: mock servlet, embedded server 동작 안 하며 @AutoConfigureMockMvc, @AutoConfigureWebTestClient와 함께 써서 mock test 가능
- RANDOM_PORT: 랜덤 포트 사용하며 embedded server 동작
- DEFINED_PORT: 포트 지정하며 embedded server 동작
- NONE: 웹 환경 구성 안 하며 embedded server 동작 안 함
@SpringBootTest( properties = { "server.error.whitelabel.enabled=false", "debug=false" }, args = "--my-argument=true", classes = SampleApplication.class, webEnvironment = SpringBootTest.WebEnvironment.MOCK )
- Auto-configured Test (Slice Test)
- @DataJpaTest, @DataJdbcTest, @DataMongoTest, @DataRedisTest, @DataCassandraTest, @DataR2dbcTest
- @WebMvcTest, @WebFluxTest, @RestClientTest, @WebServiceClientTest
- @JdbcTest
- @JooqTest
- @JsonTest
- 관련 문서
@WebMvcTest
- Spring MVC 컨트롤러 레이어 테스트할 때 사용
- MockMvc 빈을 자동 설정하고 테스트에 사용
- 로드할 컨트롤러 클래스 지정 가능(기본: 전체 컨트롤러 로드)