Programming/Spring framework

[오류 해결] Jdbc template의 RowMapper<T> 클래스 구현시 맵핑 객체 생성자 주의해서 보기.2022-02-23

최동훈1 2022. 2. 23. 09:41

우선 스프링으로 JDBC template를 이용해서, CRUD 서비스를 만드는 중, 분명 SQL 문으로 "Select * from member where Email = ?" 이렇게 잘 작성해서 DB에서 데이터를 뽑아왔다. 그런데, 이상하게 member 객체의 password와 name 멤버가 뒤바뀌어서 나오는 것이다.  SQL 구문잘못도 아니고, Member클래스의 생성자를 뒤바꾸게 정의한것도 아니였다.

그런데 예기치 못한 부분에서 해결을 하였다.

 

바로 RowMapper 클래스의 존재였다.

우리는 일반 JDBC API가 아닌, 스프링으로 JDBC Template을 쓰는 중이다. 그래서 "조회" 를 할때는 ResultSet을 이용하는 것이 아닌, JdbcTemplate.query() 메서드를 이용한다. 이 메서드의 두번째 인자로 RowMapper 인터페이스를 구현한 클래스를 넣어야 하는데, 이 클래스의 역할을 되뇌는 과정에서 내가 범한 오류를 발견했다.

이 클래스는 SQL Mapper 역할을 수행한다. 즉 "DB에서 가져온 데이터를 자바 객체로 만들어서 반환하는 역할을 해준다."

RowMapper<T> 클래스는 인터페이스이기 때문에 실제 DB의 데이터와 맵핑할 객체를 반환하는추상 메서드인 mapRow(Resultset rs,Int rownum) 을 구현해야 한다. 여기서 반환할 객체를 생성해야 하는데,

 내가 객체를 생성하는 과정에서 생성자의 파라미터 순서를 잘못 집어넣어서 결국 뒤틀린 값이 나온 것이다.

잘못된 코드.

생성자의 파라미터위치가 바뀌어 있는 모습.

 

생성자의 파라미터위치를 정상적으로 바꿈

이 오류가 중요한 시사점을 가지는 이유는 아무리 테스트 코드를 돌려봐도 오류를 알수 없다는 사실에 있다. 에초에 DB에서 데이터를 가져오는 과정에서 맴버가 바뀌어 버리면 알 길이 없기 때문이다.

 

오류해결시간 40분.