spring SpEL 설정 삽질 이야기

토비의 스프링 책을 보다 SpEL을 알게 되었고, 이를 샘플 프로젝트에 설정해 보았다.

간단하게 끝날 줄 알았던 설정이 1시간 동안의 삽질을 선물해 주었고, 이런 삽질을 다른 분들은 겪지 마시길 바라며 SpEL 설정 시 조심해야 할 사항에 대해서 간략하게 정리해 본다.

기존 프로퍼티 설정은 전용 태그인 <context:property-placeholder location=”classpath:db-config.xml” /> 를 이용하였는데, 책을 보니 명시적이고, 이해하기 쉬우며 오류도 잘 잡아주는 SpEL 사용을 적극 권장하기에 이를 도입하기로 결정

프로퍼티 설정이 담겨 있는 설정 파일은 다음과 같이 xml 형식으로 되어 있다. (db-config.xml)

<?xml version=”1.0″ encoding=”UTF-8″ standalone=”no”?>

<!DOCTYPE properties SYSTEM “http://java.sun.com/dtd/properties.dtd”>

<properties>

<comment>database config</comment>

<entry key=”jdbc.driver”>com.mysql.jdbc.Driver</entry>

<entry key=”jdbc.url”>jdbc:mysql://localhost:3306/spring3</entry>

<entry key=”jdbc.username”>lng1982</entry>

<entry key=”jdbc.password”>1111</entry>

<entry key=”test”>1111</entry>

</properties>

자. 이제 SpEL로 변경하기 위해서 <util:properties 전용 태그를 사용하여 다음과 같이 설정을 추가한다.

<util:properties id=”dbConfig” location=”classpath:db-config.xml” />

datasource 프로퍼티의 치환자는 아래와 같이 선언 후 WAS start

<property name=”driverClass” value=”#{dbConfig.jdbc.driver}” />

헌데 jdbc 프로퍼티를 찾을 수 없을 수 없다는 에러 메시지가 나온다.

뭐지? 뭐지?

왜 jdbc 프로퍼티를 찾을 수 없다는 거지?

오타가 있나? 뭐가 문제지?

1시간의 삽질 후 알게된 사실은 자바에서 사용하는 Map의 데이터를 가져오는 방식으로 SpEL 데이터를 추출해야 한다는 것이다.

즉, dbConfig.jdbc.driver는 Map 표현식에 맞지 않고, dbConfig.driver와 같이 표현을 해야 한다는 것이다.

dbConfig.get(“driver”) <- 자바에서 Map 데이터 안에 있는 데이터 추출을 할 때 사용하는 표현

결국 properties의 jdbc.driver에서 jdbc를 삭제하고 driver만을 남겨 키로 사용해야 한다. 

또는 jdbcDriver와 같이 선언하면 된다.

(.) 점만 없애면 됨

기존의 프로퍼티 사용법에 너무 익숙한 나머지 SpEL이 주는 에러 메시지를 잘 살펴보지 않은 것이 문제였다.