스프링의 멋진 기능들에 현혹되어있다 보면 딱 한가지 마음에 안드는것이 있다.
JDBCTemplate 클래스의 멋진기능에 흠집이라도 낼려고 작정한것 같다. 바로 SELECT시에 수많은 필드별로 값을 지정하는 RowMapper 클래스를 제작해야 한다.
이곳 저곳 구글링을 해봤지만, 달리 방법은 없는듯 하다. 하지만 무언가 풀려서는 안되는 괴물 탈옥수 처럼 스프링의 샌드박스에 잠들어있는 녀석이 있었다.
그 이름하여 바로 ActiveRowMapper !이녀석은 삽질한 소스코드를 한 한줄로 줄여버린다.
기존의 소스코드 :
[code]String query = “SELECT EMP_NAME, EMP_GRADE, EMP_DEPT, EMP_PHONE FROM EMPLOYEE”;
ParameterizedRowMapper<Employee> rowMapper = new ParameterizedRowMapper<Employee>() {
public User mapRow(ResultSet rs, int rowNum) throws SQLException
{
Employee empoyee = new Employee();
empoyee .setEmpName(rs.getString(“EMP_NAME”));
empoyee .setEmpGrade(rs.getString(“EMP_GRADE”));
empoyee .setEmpDept(rs.getString(“EMP_DEPT”));
empoyee .setEmpPhone(rs.getString(“EMP_PHONE”));
return empoyee;
}
};
Employee empoyee = jdbcTemplate.queryForObject(query, rowMapper);[/code]
새로운 소스코드 :
[code]String query = “SELECT EMP_NAME, EMP_GRADE, EMP_DEPT, EMP_PHONE FROM EMPLOYEE”;
ActiveRowMapper rowMapper = new ActiveRowMapper(Employee.class);
Employee empoyee = jdbcTemplate.queryForObject(query, rowMapper);[/code]
어떤가? 매우 산뜻하게 바뀌었다. 하지만 이녀석이 정식 마엘스톰에 못올라가고 있는 이유가 있는듯 하다.
다이나믹 하지 못하다. 나름 문제점이 있는거 같다. 우선 하나 꼬집어 보자면, 관례상 DB의 필드명은 언더바가 들어가고 Java에서는 낙타등 표기법으로 표기한다.
즉 디비에는 필드명이 “EMP_NAME” 이지만 Java Bean에서는 “empName” 으로 지정해야 한다. 물론 String 형이겠죠.
Java 표준 규약에 따르면 “empName” 이라는 변수에 값을 세팅 하는 셋터의 이름은 “setEmpName”이다.
고로 ActiveRowMapper는 입력해야할 셋터를 찾아가기 위해 다음과 과정을 거친다.
1. 필드명 소문자화 : EMP_NAME → emp_name
2. 언더바를 기준으로 토큰화 : emp_name → [1] emp, [2] name
3. 나누어진 열을 병합(첫글자는 대문자로 변환) : [1] emp, [2] name → EmpName
4. 앞에 set을 붙임 : EmpName → setEmpName
고로 이것을 명심해야만 에러없는 ActiveRowMapper를 사용할수 있다.
디비 EMP_NAME == 자바 empName