어떤 게 같고, 어떤 걸 다르게 해도 될까?
가능하면 일반적인… 답변을 주고, 특수한 경우만 오버라이딩학.. 공통 구조를 찾자.
이건 그럼 어떻게 사용하는 거야? 이걸 이용하는 방법은 없을까?
**ex.getLocalizedMessage()**는 Java의 Throwable 클래스에 기본으로 정의된 메서드로, 기본적으로 **getMessage()**와 동일한 값을 반환합니다. 다만 이 메서드는 예외 클래스에서 재정의해서, 로케일(지역 설정)에 따라 다른 언어 메시지를 반환하도록 구현할 수 있습니다.
즉, **getLocalizedMessage()**를 활용하여 다국어 메시지를 제공하려면, 직접 예외 클래스를 상속받아 이 메서드를 재정의하고, 내부에서 메시지 리소스(예: ResourceBundle 또는 스프링의 MessageSource)에서 현재 로케일에 맞는 메시지를 꺼내 리턴하도록 해야 합니다.
public class LocalizedException extends RuntimeException {
private final String messageKey;
private final Locale locale;
public LocalizedException(String messageKey, Locale locale) {
this.messageKey = messageKey;
this.locale = locale;
}
@Override
public String getLocalizedMessage() {
return Messages.getMessageForLocale(messageKey, locale); // ResourceBundle 또는 MessageSource에서 조회
}
}
따라서, 스프링에서 기본 예외(MethodArgumentNotValidException, NoHandlerFoundException 등)가 **getLocalizedMessage()**를 자동으로 지역화된 메시지로 바꿔주지는 않습니다. 대신, 직접 커스텀 예외를 만들어서 **getLocalizedMessage()**를 구현하거나, 글로벌 예외 처리기에서 **MessageSource**로 메시지를 조회해서 응답 메시지에 반영하는 방식을 주로 사용합니다.