Spring boot + JdbcTemplate 사용해보기 (6) BeanPropertyRowMapper 적용

Peter·2024년 7월 19일
post-thumbnail

BeanPropertyRowMapper 적용해보기

기존에 RowMapper 를 생성하는 로직을 살펴보자.

private RowMapper<Member> memberRowMapper() {
    return ((rs, rowNum) -> Member.builder()
        .id(rs.getLong("id"))
        .name(rs.getString("name"))
        .gender(Gender.valueOf(rs.getString("gender")))
        .position(rs.getString("position"))
        .birthDate(rs.getDate("birth_date").toLocalDate())
        .address(rs.getString("address"))
        .phoneNumber(rs.getString("phone_number"))
        .build());
}

이 코드는 결국 쿼리 결과(Result Set) 로 부터 각 컬럼 값을 Member 의 필드로 매핑해주는 역할을 한다.

쿼리 실행 시, 이미 ResultSet 으로 넘어올 컬럼 명은 알고 있으니 Member 필드와 동일하게만 사용한다면 쉽게 매핑이 가능할 것이다. (물론 snake_case 를 camelCase 로 바꿔주는 작업 및 enum 이나 Date 와 같은 타입에 대한 conversion 이 필요하다.)

이런 기능을 제공해주는 클래스가 바로 BeanPropertyRowMapper 이다.
BeanPropertyRowMapper 를 적용하면 아래와 같이 코드가 훨씬 간결해진다.

private RowMapper<Member> memberRowMapper() {
    return BeanPropertyRowMapper.newInstance(Member.class);
} 

주의사항

BeanPropertyRowMapper 적용 시, 주의사항이 있다.

BeanPropertyRowMapper 가 동작할 때 내부적으로 setter 를 사용하기 때문에 대상 도메인 Entity 에는 반드시 setter 를 명시해줘야 한다.

아래와 같이 도메인 Entity 에 @Setter 를 추가해주면 정상적으로 동작한다.

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@EqualsAndHashCode
public class Member {
    private Long id;
    private String name;
    private Gender gender;
    private String position;
    private LocalDate birthDate;
    private String address;
    private String phoneNumber;
}

0개의 댓글