토비의 스프링 책을 보다 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이 주는 에러 메시지를 잘 살펴보지 않은 것이 문제였다.