3장. 보조 인프라스트럭처

이 장에서는 Acegi Security에서 사용되고 있으며 Acegi Security의 기능들을 보충하고 보조해 주는 몇 가지 지원 인프라스트럭처들을 소개할 것이다. 여기에서 소개하는 기능들이 보안에 직접적으로 관련되어 있지는 않더라도, 이미 Acegi Security 프로젝트에 포함되어 있기 때문에 이 장에서 논의할 것이다.

3.1. 지역화(Localization)

Acegi Security는 최종 사용자가 보게 될 예외 메시지에 대한 지역화를 지원한다. 여러분의 애플리케이션이 영어 문화권 사용자에 맞춰져 있다면 기본적으로 모든 Acegi Security 메시지는 영어이므로 여러분이 해야할 일은 없다. 만일 여러분이 다른 로케일을 지원해야 하는 경우라면, 본 섹션에 여러분이 알아야 할 것들은 모두 들어있다.

모든 예외 메시지들은 지역화가 가능하며, 여기에는 인증 실패와 접근 거부(권한부여 실패)와 관계된 메시지들이 포함된다. 개발자나 시스템 배포자 등에 초점을 맞추고 있는 예외와 로깅(잘못된 속성, 인터페이스 계약 위반, 잘못된 생성자 사용, 시작시간 유효성 검증, 디버그 차원의 로깅을 포함)은 지역화되지 않으며 대신 Acegi Security 코드에 영어로 하드코딩 되어 있다.

여러분은 acegi-security-xx.jar 파일에서 messages.properties 파일을 포함하고 있는 org.acegisecurity 패키지를 발견할 수 있을 것이다. 이 파일은 ApplicationContext에서 참조되어야 하는데, 왜냐하면 Acegi Security 클래스들이 Spring의 MessageSourceAware 인터페이스를 구현하고 있으며 애플리케이션 컨텍스트 구동시 메시지 리졸버(message resolver)에 대한 의존성 주입이 이루어지기 때문이다. 일반적으로 여러분이 해야할 일은 애플리케이션 컨텍스트내의 빈이 메시지를 가리키도록 등록하는 것 뿐이다. 아래에 그러한 예가 나타나 있다:

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
  <property name="basename"><value>org/acegisecurity/messages</value></property>
</bean>        

messages.properties는 표준 리소스 번들에 따라 지어진 이름이며 Acegi Security 메시지에 의해 지원되는 기본 언어를 표현한다. 이러한 기본 파일은 영어로 작성되어 있다. 여러분이 메시지 소스를 등록하지 않더라도 Acegi Security는 적절히 작동할 것이며 영어로 하드코딩되어 있는 버전의 메시지로 대체(fallback)할 것이다.

만약 여러분이 messages.properties 파일을 커스터마이즈하려 하거나 아니면 다른 언어를 지원하고자 한다면 먼저 파일을 복사한 다음 그 파일의 이름을 알맞게 변경하여 위의 빈 정의에 등록해야 한다. 이 파일 안에는 상당히 많은 양의 메시지 키가 들어 있으므로 지역화를 주 시작점으로 삼아서는 안된다. 여러분이 이 파일에 대한 지역화를 수행할 경우 JIRA 태스크에 로깅하고, 여러분이 알맞게 이름을 부여한 버전의 지역화 messages.properties 파일을 첨부하여 여러분의 작업 결과물을 커뮤니티상에서 협업하는 것을 고려해 보길 바란다.

지역화에 대한 논의는 org.springframework.context.i18n.LocaleContextHolder로 알려져 있는 Spring의 ThreadLocal로 마무리 하기로 하자. 여러분은 LocaleContextHolder가 각 사용자가 선호하는 Locale을 나타내도록 설정해야 한다. Acegi Security는 ThreadLocal로부터 획득한 Locale을 이용하여 메시지 소스로부터 메시지를 가져오려 할 것이다. LocaleContextHolder 사용법과 자동으로 Locale을 설정할 수 있도록 해주는 헬퍼 클래스(예, AcceptHeaderLocaleResolver, CookieLocaleResolver, FixedLocaleResolver, SessionLocaleResolver 등)에 관해 자세히 알아보려면 Spring 문서를 참조하도록 한다.