일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 자바
- 내일배움카드
- reactnative강의
- 패캠
- 직정인자기계발
- 오공완
- 수강료0원챌린지
- 코딩자격증
- 환급챌린지
- 코딩교육
- K디지털기초역량훈련
- 국비지원교육
- 직장인공부
- 직장인자기계발
- 패캠인강후기
- 패캠강의후기
- fastcampus
- 파이썬
- 패캠reactnative
- PM강의
- 자바스크립트
- 패스트캠퍼스
- 패캠챌린지
- 30개프로젝트로배우는iOS앱개발withSwift초격차패키지Online.
- 패스트캠퍼스후기
- 코딩테스트
- 직장인인강
- Today
- Total
라티의 작은 일기장
패스트캠퍼스 환급챌린지 4일차 미션 (2월 4일) : 10개 프로젝트로 시작하는 백엔드 웹개발 : 신입 개발자 취업 집중반 강의 후기 본문
패스트캠퍼스 환급챌린지 4일차 미션 (2월 4일) : 10개 프로젝트로 시작하는 백엔드 웹개발 : 신입 개발자 취업 집중반 강의 후기
코드라티 2025. 2. 4. 22:31본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
오케이 작심삼일의 고비는 넘어갔다. 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 객체 리스트로 변환해서 반환한다.
학습 시작 인증
학습 종료 인증
첫 번째 클립 수강 인증
두 번째 클립 수강 인증
학습 인증