라티의 작은 일기장

패스트캠퍼스 환급챌린지 4일차 미션 (2월 4일) : 10개 프로젝트로 시작하는 백엔드 웹개발 : 신입 개발자 취업 집중반 강의 후기 본문

Spring(Java)

패스트캠퍼스 환급챌린지 4일차 미션 (2월 4일) : 10개 프로젝트로 시작하는 백엔드 웹개발 : 신입 개발자 취업 집중반 강의 후기

코드라티 2025. 2. 4. 22:31

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

https://bit.ly/4gL1f1o

오케이 작심삼일의 고비는 넘어갔다. 4일차도 스근하게 끝내보자.

오늘은 SQL 쿼리 결과를 Java 객체로 변환하는 방법에 대해 알아보았다.

사실 어제일자로 JDBC 공부하고 실습할 때 이미 JdbcTemplate이 제공하는 queryForObject라는 메소드를 활용한 적이 있다.

public User findUserById(Long userId) {
    return jdbcTemplate.queryForObject(
        "SELECT id, name, email FROM users WHERE id = ?",
        (rs, rowNum) -> {  // 람다를 이용한 RowMapper
            User user = new User();
            user.setId(rs.getLong("id"));
            user.setName(rs.getString("name"));
            user.setEmail(rs.getString("email"));
            return user;
        },
        userId  // 파라미터 자동 바인딩
    );
}

이 코드에서 람다를 활용해 RowMapper를 파라미터로 넘겨 활용했는데, 이 RowMapper의 역할은 쿼리 실행 결과를 ResultSet에 저장시키는 것이고, RowMapper 인터페이스의 mapRow()라는 메소드가 ResultSet에서 데이터를 한줄씩 읽어서 자바 객체로 변환하는 것이다.

JdbcTemplate이 SQL 쿼리를 위해 활용할 수 있도록 제공하는 메서드가 하나 더 있는데, query()이다.

위의 queryForObject()와의 차이는, 여러 건의 쿼리가 가능하기 때문에 그 결과가 List 타입으로 반환된다는 것.

public List<User> findUsersByName(String name) {
    return jdbcTemplate.query(
        "SELECT id, name, email FROM users WHERE name = ?",
        (rs, rowNum) -> {
            User user = new User();
            user.setId(rs.getLong("id"));
            user.setName(rs.getString("name"));
            user.setEmail(rs.getString("email"));
            return user;
        },
        name
    );
}

그래서 query()는 만약 조회 결과가 0이라면 길이가 0인 List를 반환하게되고, queryForObject()는 조회 결과가 0이거나 2 이상이면 예외가 발생한다. 굉장히 엄격하게 분리되어있다!

 

이런 차이점 때문에 queryForObject()를 사용할 때는 반드시 결과가 하나만 나온다는 확신이 필요하고, unique한 값(예: ID)으로 조회하는 경우라면 적절하지만, 다중 결과가 가능하다면 주저없이 query()를 써야 한다.

 

또한, RowMapper를 따로 클래스로 분리해서 사용할 수도 있다. 이렇게 잘 만들어둔 RowMapper 클래스는 재사용할 수도 있고, 코드도 훨씬 간결해진다.

public class UserRowMapper implements RowMapper<User> {
    @Override
    public User mapRow(ResultSet rs, int rowNum) throws SQLException {
        User user = new User();
        user.setId(rs.getLong("id"));
        user.setName(rs.getString("name"));
        user.setEmail(rs.getString("email"));
        return user;
    }
}

 

사용하는 쪽에서는 이렇게 쿼리문과 RowMapper 클래스를 넘겨주기만 하면 된다.

public List<User> findAllUsers() {
    return jdbcTemplate.query(
        "SELECT id, name, email FROM users",
        new UserRowMapper()
    );
}

 

이렇게 findAllUsers()를 호출하면, users 테이블의 모든 데이터를 User 객체 리스트로 변환해서 반환한다.

 

학습 시작 인증

학습 종료 인증

첫 번째 클립 수강 인증

두 번째 클립 수강 인증

학습 인증