부트캠프 과제 中 트러블슈팅 과정 작성 글
일정 관리 앱 서버 ver.2
※ 이용 방법만 필요하면 목차에서 [구현 과정] 클릭
💡트러블 슈팅
1. 문제
Exception을 처리할 Enum을 만들 때 message_ko와 message_en을 한번에 같이 전달하고 있었다.
USER_NOT_FOUND(HttpStatus.NOT_FOUND,"해당 id를 찾을 수 없습니다.", "The ID cannot be found.")
2. 원인
다국어처리를 지원하는 i18n
에 대해서 이야기를 들었고, 이 방법을 이용하면 사용자가 설정한 언어에 따라서 그에 맞는 메세지가 전달할 수 있다는 방법을 알았다.
이 방법을 이용하기 위해서 i18n에 대해서 알아보았지만, Enum에서 이 값을 전달하기 위해서는 추가 설정이 필요했다.
3. 해결 방안
MessageUtil
을 생성해 MessageSource
를 받아주고, 이 MessageUtil로 Enum에 전달하는 방법이 있었다.
🛠️ 구현 과정
resources에 properties작성을 확인하며 src/main/resources
에 폴더를 생성해 properties
를 먼저 작성한다.
1. 설정 파일 생성
@Configuration
public class I18nConfig {
@Bean
public LocaleResolver localeResolver() {
AcceptHeaderLocaleResolver resolver = new AcceptHeaderLocaleResolver();
resolver.setDefaultLocale(Locale.getDefault());
return resolver;
}
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:/messages/message");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
}
Accept-Language
에 맞는 언어를 반환하고 싶어 AcceptHeaderLocaleResolver
를 이용했다.
이 외에도 Cookie나 Session등 여러가지가 있고, 하단에 있는 참고 블로그를 확인하면 자세히 알 수 있다.
기본 설정setDefaultLocale
은 컴퓨터에 설정된 값을 가지고 오도록 Locale.getDefault()
를 지정했다.
ReloadableResourceBundleMessageSource
를 이용해 사용할 소스를 지정한다.setBasename()
에는 생성한 resource폴더
를 입력하면 된다.
해당 위치에 properties
를 입력했기 때문에 /messages/message 로 작성했다.
위와 같이 작성하고 나면 알아서 리소스 번들
이 생기는데 그 이름이 뒤에 들어가는 이름이다.
2. MessageUtil 작성
@Component
public class MessageUtil {
private static MessageSource messageSource;
public MessageUtil(MessageSource messageSource) {
MessageUtil.messageSource = messageSource;
}
public static String getMessage(String key) {
return messageSource.getMessage(key, null, LocaleContextHolder.getLocale());
}
}
이제 위 내용을 Enum에 적용시키기 위한 MessageUtil
을 작성해보자.
getMessage()
를 이용해서 Enum에 메세지를 전달할 것이고, properties에서 작성한 key
를 전달해 value
를 가져와 return한다.
두번째 파라미터에 null로 작성했지만, 동적으로 값을 넣어주고 싶으면 이 안에 값을 넣어줄 수 있다.
3. Enum에서 받아오기
public enum ExceptionCode {
...
PAGE_OVER(HttpStatus.NOT_FOUND,"PAGE_OVER");
private final HttpStatus status;
private final String message;
...
public String getMessage(){
return MessageUtil.getMessage(message);
}
}
위에서 생성한 MessageUtil의 getMessage를 이용해 가져올 key값을 넣어주자.
해당 Enum class에서 message라는 변수명으로 key를 사용하고 있어 이 값을 넣어주었다.
Enum에서 언어에 맞는 메세지를 전달하기 위해서는 위와 같이 MessageUtil을 설정해 언어에 맞게 메세지를 전달할 수 있다.
✅ 결과
1. Accept-Language를 요청하지 않았을 때 → default
시스템 기본 설정으로 변경되어 전달된다.
한국어로 전달되는 모습을 볼 수 있다.
다른 언어를 지정했더라도 ko와 en만 작성했기 때문에 default로 설정된 언어가 응답된다.
2. ko, ko-KR 사용
3. en, en-US 사용
reference
GuruneLee.log. [spring] LocaleResolver 개요
haerong22.log. [springboot] 쿠키를 이용한 다국어 처리 (i18n)
'Framework > Spring' 카테고리의 다른 글
[Spring] Global Exception Handler에서 Enum 사용하기 (0) | 2025.02.12 |
---|---|
[Spring] 의존 관계 주입(DI) & 의존 관계 검색(DL) (0) | 2024.12.17 |
[Spring] 싱글톤 레지스트리(Singleton Registry)란? (0) | 2024.12.09 |
[토비의스프링] 1.5 스프링의 IoC (0) | 2024.12.03 |
[토비의스프링] 1.4 제어의 역전(IoC) (1) | 2024.11.29 |