Spring Wev MVC 강의 정리 (2)

패스트 캠퍼스 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.{템플릿확장자}
  • @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 빈을 자동 설정하고 테스트에 사용
    • 로드할 컨트롤러 클래스 지정 가능(기본: 전체 컨트롤러 로드)