스프링 3.1의 프로파일은 매력적이다. 이 좋은 걸 왜 진작에 안 만들었을까 싶다.

프로파일을 활성화 시키는 방법은 여러가지다. 컨텍스트의 Environment 오브젝트를 가져와 setActiveProfiles() 해주는 방법도 있고, 시스템 프로퍼티 설정, 환경 변수 설정, JVM 커맨드 라인 파라미터 설정 등등.

WAS에 올라가는 웹 앱이 여러개거나 시스템 관리자가 까칠해서 지원을 잘 안하주는 관계로 JVM 레벨의 프로파일 지정이 곤란하다면 web.xml에 넣는 방법도 있는데, 이 때 servlet context parameter와 servlet init. parameter 두가지가 다 가능하다.

그런데 주의할 점이 있다.

웹 환경에서 루트 앱 컨텍스트는 <listener>로 등록한 컨텍스트 로더가 담당하고,  앱 컨텍스트 옵션은 서블릿 컨텍스트 파라미터를 지정하는 <context-param>을 사용한다.

DispatcherServlet이 만드는 서블릿 앱 컨텍스트에 관한 설정은 <servlet> 안에 <init-param>을 사용해서 앱 컨텍스트 클래스나 파일 등을 지정할 수 있다.

이렇게 사용하던 습관을 가지고 <context-param>은 루트 앱 컨텍스트용이고, <init-param>은 서블릿 앱 컨텍스트용이라고 막연히 생각하고 있으면 active 프로파일 지정할 때 실수 할 수 있다.

왜냐하면 active 프로파일 설정에서는 <context-param>은 해당 웹 애플리케이션의 모든 앱 컨텍스트에 영향을 주기 때문이다.

<context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>dev</param-value>
</context-param>

이렇게 해 놓으면 루트 앱 컨텍스트 뿐 아니라 서블릿 앱 컨텍스트에도 active 프로파일이 dev로 잡힌다.

반면에 <servlet> 아래

<init-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>dev</param-value>
</init-param>

 

이렇게 해 놓으면 이건 루트 앱 컨텍스트의 active 프로파일에는 영향을 주지 않는다.

어떻게 보면 이게 자연스럽게 보인다. 서블릿 컨텍스트(즉 웹 앱)가 범위가 더 크므로 서블릿 컨텍스트의 모든 컨텍스트에 영향을 미치는게 맞다. 반면에 서블릿 레벨의 파라미터는 해당 서블릿의 앱 컨텍스트에만 적용되야지.

문제는 앱 컨텍스트의 조건을 줄 때는 이게 분리된다는 점이다. 같은 파라미터 설정 방식이지만 용도에 따라 적용 범위가 달라진다. 그래서 착각할 수도 있으니 주의할 것.

다른 문제로는 루트 앱 컨텍스에만 active 프로파일을 지정할 방법이 없다. 있을지도 모르겠지만 아직까지 못 찾았다.

 

그런데 프로파일을 하나의 웹 앱 안에서도 다르게 줄 필요가 있을까? 없을 거라고 볼 수는 없겠지. 매우 규모가 큰 앱이라 계층별로 독립적으로 개발하고, DS서블릿도 여러개를 사용하는 경우라면 필요에 따라 각각 다른 active 프로파일을 줄 수 있을 것이다. 물론 프로파일을 전체적으로 통일해서 관리하는 게 바람직하겠지만.

오늘의 결론은…

앱 컨텍스트 설정 결과를 꼭 눈으로 확인해서 기대한 대로 원하는 빈이 구성됐는지 확인하자. 특히 프로파일 같은 거 지정은 착각하면 대박 사고가 날지도. 설정 결과 확인 방법은 여기 저기서 많이 얘기했으므로 안해도 되겠지.

스프링 오덕 말고는 관심없을 것 같은 얘기는 여기서 끝. (뭔말하는지 도통 모르신 분들에게는 죄송. 언젠가 이해되실 겁니다)

© 2017 Toby's Epril Suffusion theme by Sayontan Sinha