2025-04-08T19:56:24

This commit is contained in:
2025-04-08 19:56:24 +09:00
parent a75a1dbd0f
commit eef061c1c9
100 changed files with 18639 additions and 0 deletions

105
docs/i18n.md Normal file
View File

@@ -0,0 +1,105 @@
스프링부트에서 국제화(Internationalization, i18n)는 애플리케이션이 여러 언어와 지역 설정을 지원할 수 있도록 하는 기능입니다. 이를 통해 사용자의 언어 환경에 맞춰 메시지, 날짜, 숫자 형식 등을 동적으로 제공할 수 있습니다. 스프링부트는 이를 쉽게 구현할 수 있도록 `MessageSource`와 같은 기능을 제공합니다. 아래에서 주요 개념과 설정 방법을 설명하겠습니다.
### 1. **국제화의 기본 개념**
국제화는 주로 메시지 파일을 통해 구현됩니다. 메시지 파일은 언어별로 번역된 텍스트를 키-값 쌍으로 저장하며, 사용자의 로케일(Locale)에 따라 적절한 메시지를 불러옵니다. 예를 들어:
- `messages.properties`: 기본 메시지 (영어 등)
- `messages_ko.properties`: 한국어 메시지
- `messages_en.properties`: 영어 메시지
### 2. **스프링부트에서 국제화 설정**
스프링부트에서 국제화를 설정하는 기본 단계는 다음과 같습니다.
#### (1) **의존성 확인**
스프링부트 프로젝트라면 별도의 의존성 추가 없이 `spring-boot-starter`에 포함된 기능을 사용할 수 있습니다.
#### (2) **메시지 파일 생성**
프로젝트의 `src/main/resources` 디렉토리에 메시지 파일을 추가합니다. 예시:
- `messages.properties`:
```
greeting=Hello, {0}!
```
- `messages_ko.properties`:
```
greeting=안녕하세요, {0}님!
```
- `messages_en.properties`:
```
greeting=Hello, {0}!
```
파일 이름은 `messages_[언어코드].properties` 형식을 따르며, 언어 코드는 ISO 639-1 표준(예: `ko`, `en`, `fr`)을 사용합니다.
#### (3) **MessageSource 설정**
스프링부트는 기본적으로 `MessageSource` 빈을 자동으로 설정합니다. 필요 시 `application.properties`에서 커스터마이징할 수 있습니다:
```properties
spring.messages.basename=messages
spring.messages.encoding=UTF-8
```
- `spring.messages.basename`: 메시지 파일의 기본 이름 (디렉토리 경로 없이).
- `spring.messages.encoding`: 파일 인코딩 설정.
#### (4) **로케일 설정**
스프링부트는 사용자의 요청 헤더(`Accept-Language`)를 기반으로 로케일을 자동 감지합니다. 필요 시 `LocaleResolver`를 커스터마이징할 수 있습니다. 예를 들어, 세션 기반 로케일을 사용하려면:
```java
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver slr = new SessionLocaleResolver();
slr.setDefaultLocale(Locale.KOREAN); // 기본 로케일 설정
return slr;
}
```
#### (5) **컨트롤러에서 사용**
컨트롤러에서 `MessageSource`를 주입받아 메시지를 가져올 수 있습니다:
```java
@Autowired
private MessageSource messageSource;
@GetMapping("/greet")
public String greet(Locale locale) {
String greeting = messageSource.getMessage("greeting", new Object[]{"사용자"}, locale);
return greeting;
}
```
위 코드는 로케일에 따라 적절한 메시지를 반환합니다.
#### (6) **Thymeleaf와 같은 템플릿 엔진에서 사용**
Thymeleaf를 사용할 경우, 템플릿에서 직접 메시지를 참조할 수 있습니다:
```html
<p th:text="#{greeting('사용자')}"></p>
```
`#{key}`는 메시지 파일에서 해당 키를 찾아 로케일에 맞는 값을 렌더링합니다.
### 3. **추가 기능**
- **파라미터 전달**: 메시지에 동적 값을 삽입하려면 `{0}`, `{1}` 같은 플레이스홀더를 사용합니다.
- **로케일 변경**: `LocaleChangeInterceptor`를 추가해 URL 파라미터(예: `?lang=ko`)로 로케일을 동적으로 변경할 수 있습니다:
```java
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
lci.setParamName("lang");
return lci;
}
@Bean
public WebMvcConfigurer webMvcConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
};
}
```
### 4. **실행 예시**
- 요청: `GET /greet` (`Accept-Language: ko`)
- 응답: "안녕하세요, 사용자님!"
- 요청: `GET /greet` (`Accept-Language: en`)
- 응답: "Hello, 사용자!"
### 5. **주의점**
- 메시지 파일이 없거나 키가 누락된 경우, 기본 메시지 파일(`messages.properties`)을 참조하거나 예외가 발생할 수 있습니다.
- UTF-8 인코딩을 명시적으로 설정하지 않으면 한글 등 비ASCII 문자가 깨질 수 있으니 주의하세요.
스프링부트의 국제화는 이렇게 간단하면서도 강력하게 다국어 지원을 가능하게 합니다. 추가로 궁금한 점이 있으면 말씀해주세요!