24.09.12

윤지현·2024년 9월 13일

TIL

목록 보기
62/75

Error 메시지 관리하기

  • Spring의 properties 파일을 이용한 에러 메시지 관리
    • Spring에서는 properties 파일을 이용하여 에러 메시지를 관리할 수 있습니다.
    • 에러 메시지는 properties 파일에서 key-value 형태로 작성되며, 작성된 값은 messageSource 를 Bean으로 등록하여 사용할 수 있습니다.
    • resources > messages.properties
  		below.min.my.price=최저 희망가는 최소 {0}원 이상으로 설정해 주세요.
		not.found.product=해당 상품이 존재하지 않습니다.
  • Spring Boot에서는 messageSource 가 자동으로 Bean으로 등록됩니다.
private final MessageSource messageSource;

...

@Transactional
public ProductResponseDto updateProduct(Long id, ProductMypriceRequestDto requestDto) {
    int myprice = requestDto.getMyprice();
    if (myprice < MIN_MY_PRICE) {
        throw new IllegalArgumentException(messageSource.getMessage(
                "below.min.my.price",
                new Integer[]{MIN_MY_PRICE},
                "Wrong Price",
                Locale.getDefault()
        ));
    }

    Product product = productRepository.findById(id).orElseThrow(() ->
            new ProductNotFoundException(messageSource.getMessage(
                    "not.found.product",
                    null,
                    "Not Found Product",
                    Locale.getDefault()
            ))
    );

    product.update(requestDto);

    return new ProductResponseDto(product);
}
  • Exception 클래스를 직접 구현하여 사용할 수도 있습니다.
    • ProductNotFoundException
  • messageSource.getMessage()메서드
    • 첫번째 파라미터는 messages.properties 파일에서 가져올 메시지의 키 값을 전달합니다.
    • 두번째 파라미터는 메시지 내에서 매개변수를 사용할 경우 전달하는 값입니다.
    • 세번째 파라미터는 언어 설정을 전달합니다.
      - Locale.getDefault()메서드는 기본 언어 설정을 가져오는 메서드입니다.
  • GlobalExceptionHandler
    package com.sparta.myselectshop.exception;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler({IllegalArgumentException.class})
public ResponseEntity<RestApiException> illegalArgumentExceptionHandler(IllegalArgumentException ex) {
    RestApiException restApiException = new RestApiException(ex.getMessage(), HttpStatus.BAD_REQUEST.value());
    return new ResponseEntity<>(
            // HTTP body
            restApiException,
            // HTTP status code
            HttpStatus.BAD_REQUEST
    );
}

@ExceptionHandler({NullPointerException.class})
public ResponseEntity<RestApiException> nullPointerExceptionHandler(NullPointerException ex) {
    RestApiException restApiException = new RestApiException(ex.getMessage(), HttpStatus.NOT_FOUND.value());
    return new ResponseEntity<>(
            // HTTP body
            restApiException,
            // HTTP status code
            HttpStatus.NOT_FOUND
    );
}

@ExceptionHandler({ProductNotFoundException.class})
public ResponseEntity<RestApiException> notFoundProductExceptionHandler(ProductNotFoundException ex) {
    RestApiException restApiException = new RestApiException(ex.getMessage(), HttpStatus.NOT_FOUND.value());
    return new ResponseEntity<>(
            // HTTP body
            restApiException,
            // HTTP status code
            HttpStatus.NOT_FOUND
    );
}

}

  • 오늘의 후기
    오늘 Test코드에 대한 강의를 들으면서 간단하게 요약했다.
Mock - 가짜 깡통. 의존성 주입으로 독립성 유지할때 사용. 동작을 전부다 직접 지정해줘야한다.
Spy - 진짜 객체처럼 쓸수도 있고 원할때 동작을 지정해서 쓸 수도 있다.
InjectMock - 우리가 아는 진짜 객체

내일은 한번 controller와 service의 테스트 코드를 작성해 봐야겠다.

profile
첫 시작

0개의 댓글