Back-End/Spring

Spring) Row Mapper

아. 이렇게 하면 될거 같은데.. 2023. 12. 18. 12:41
728x90


1. Row Mapper

Row Mapper는 Spring Framework에서 JDBC를 사용하여 데이터베이스로부터 검색한 결과를 Java 객체로 매핑하는 데 사용되는 인터페이스다. 이 인터페이스는 org.springframework.jdbc.core.RowMapper 패키지에 속하며, 단일 행의 결과를 객체로 변환하는 로직을 정의한다.

즉, Row를 객체에 매핑 한다.

 


2. Row Mapper 사용이유

Row Mapper를 사용하면 예전의 JDBC를 사용할 떄보다 코드가 간결해지고 원하는 형태로 반환할 수 있다. 또한 여러개의 값을 반환 할 수 있다.

 

- 과거 JDBC

과거의 JDBC는 아래의 코드처럼 resultSet에 먼저 query실행 결과를 받고, adminMemberVo 객체에 ResultSet을 저장한후, adminMemberVo 객체를 반환한다. 총 3단계를 거친다.

private static final String SELECT_ADMIN_SQL = "SELECT * FROM tb1_admin_member WHERE a_m_id=? AND a_m_name=? AND a_m_mail=?";

public AdminMemberVo selectAdmin(String a_m_id, String a_m_name, String a_m_mail) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try {
            connection = // Get your connection 

            preparedStatement = connection.prepareStatement(SELECT_ADMIN_SQL);
            preparedStatement.setString(1, a_m_id);
            preparedStatement.setString(2, a_m_name);
            preparedStatement.setString(3, a_m_mail);

            resultSet = preparedStatement.executeQuery();

            if (resultSet.next()) {
                AdminMemberVo adminMemberVo = new AdminMemberVo();
                adminMemberVo.setA_m_no(resultSet.getInt("a_m_no"));
                adminMemberVo.setA_m_approval(resultSet.getInt("a_m_approval"));
                adminMemberVo.setA_m_id(resultSet.getString("a_m_id"));
                adminMemberVo.setA_m_pw(resultSet.getString("a_m_pw"));
                adminMemberVo.setA_m_name(resultSet.getString("a_m_name"));
                adminMemberVo.setA_m_gender(resultSet.getString("a_m_gender"));
                adminMemberVo.setA_m_part(resultSet.getString("a_m_part"));
                adminMemberVo.setA_m_position(resultSet.getString("a_m_position"));
                adminMemberVo.setA_m_mail(resultSet.getString("a_m_mail"));
                adminMemberVo.setA_m_phone(resultSet.getString("a_m_phone"));
                adminMemberVo.setA_m_reg_date(resultSet.getString("a_m_reg_date"));
                adminMemberVo.setA_m_mod_date(resultSet.getString("a_m_mod_date"));

                return adminMemberVo;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // Close ResultSet, PreparedStatement, and Connection
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (preparedStatement != null) {
                    preparedStatement.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        return null;
    }

 

- Row Mapper이용

public AdminMemberVo selectAdmin(String a_m_id, String a_m_name, String a_m_mail) {
		
		String sql = "SELECT * FROM tb1_admin_member WHERE a_m_id=? AND " +
					 "a_m_name=? AND a_m_mail=?";
		List<AdminMemberVo> adminMemberVos = new ArrayList<AdminMemberVo>();
		
		adminMemberVos = jdbcTemplate.query(sql, new RowMapper<AdminMemberVo>() {

			@Override
			public AdminMemberVo mapRow(ResultSet rs, int rowNum) throws SQLException {
				AdminMemberVo adminMemberVo = new AdminMemberVo();
				adminMemberVo.setA_m_no(rs.getInt("a_m_no"));
				adminMemberVo.setA_m_approval(rs.getInt("a_m_approval"));
				adminMemberVo.setA_m_id(rs.getString("a_m_id"));
				adminMemberVo.setA_m_pw(rs.getString("a_m_pw"));
				adminMemberVo.setA_m_name(rs.getString("a_m_name"));
				adminMemberVo.setA_m_gender(rs.getString("a_m_gender"));
				adminMemberVo.setA_m_part(rs.getString("a_m_part"));
				adminMemberVo.setA_m_position(rs.getString("a_m_position"));
				adminMemberVo.setA_m_mail(rs.getString("a_m_mail"));
				adminMemberVo.setA_m_phone(rs.getString("a_m_phone"));
				adminMemberVo.setA_m_reg_date(rs.getString("a_m_reg_date"));
				adminMemberVo.setA_m_mod_date(rs.getString("a_m_mod_date"));
				return adminMemberVo;
			}
		}, a_m_id, a_m_name, a_m_mail);
		
		return (adminMemberVos.size() > 0)? adminMemberVos.get(0) : null;
	}

public AdminMemberVo mapRow(ResultSet rs, int rowNum) throws SQLException

 

 

이 부분에서 mapRow메서드는 위에서 말한 3단계를 한다는 뜻이다. rowNum은 자동으로 세어진다.

람다식으로 바꾸면 이러한 형태가 된다.

 List<AdminMemberVo> adminMemberVos = jdbcTemplate.query(sql, (rs, rowNum) -> {

 

728x90
반응형