본문 바로가기
Spring

국제화처리를 위한 messageSource 빈에 대한 이슈

by ybs 2021. 6. 18.
반응형

스프링 부트가 아닌 스프링 프로젝트에서는 applicationContext.xml  servlet-context.xml 가 따로 있다.


applicationContext.xml 에서는 @Service @Repository @Component 빈 등록과 dataSource 관련 빈 등록 등을 작업.
servlet-context.xml 에서는 web 과 관련된 설정들 @Controller 빈등록과 mvc 관련 config, 뷰리졸버 관련 빈 등록 등을 작업.

 

처음엔 messageSource 빈 등록을 servlet-context.xml 에서 했다. 보여지는 메세지만 로케일에 맞게 다국어 처리하는 거니 web 영역이라고 판단했다. 그런데 applicationContext.xml 에 등록된 빈은 servlet-context.xml 에 등록된 빈을 못 찾는다(반대는 가능).

 

다시 말해 applicationContext.xml 에 등록된 service 빈들은 servlet-context.xml 에 등록된 messageSource 빈을 못찾아서 주입받을 수 없었다. 

cf) 반대로 servlet-context.xml 에 등록된 controller 빈들은는 applicationContext.xml 에 등록된 service 빈들을 찾을 수 있다.

 

 

그러다 보니 service 에서 비지니스처리를 위해서 db 조회해온 list들을 for 문 돌려서 처리하고, controller 에서 다시 for 문 돌려서 다국어 처리를 진행해야했다. list 갯수가 적으면 for문을 두번 도는것에 대한 부담이 적어서 괜찮은데, list 갯수가 많았기 때문에 고민이 됐다.


비지니스처리에 대한 작업을 java8 function 처리를 해서 controller 넘긴다면 controller 에서 function 실행 과 다국어 처리를 한번에 할 수 도 있다. 하지만 이런 방식으로 개발하는걸 들어본적도 없어서 이 방식을 선택하지는 않았다. 

 

결국은 messageSource 빈을 applicationContext.xml 에 등록함으로써 원칙?을 깨고 해결했다. 스프링부트는 Configuration 자바 클래스에서 빈등록을 진행하는데 예전처럼 applicationContext.xml  servlet-context.xml 로 나누는 개념이 없다. 


그래서 그 원칙이 정말 꼭 지켜야 한다는 확신도 100% 있는게 아니어서 나름 쉽게 해결했는데 이게 정답이라고는 생각하지 않는다.

반응형