Spring 기초 정리 - JDBCTemplate

Zyoon·2025년 5월 16일

Spring 기초정리

목록 보기
8/18
post-thumbnail

💡JDBCTemplate 구조 정리


JDBCTemplate


JDBCTemplate 이란?

  • Spring Framework에서 JDBC를 효율적으로 사용할 수 있게 해주는 클래스
  • 복잡한 JDBC 코드를 단순화하고 추상화하여 깔끔하고 안전한 코드로 만들어준다.

JDBCTemplate 선언 및 생성

//Repository에 선언
private final JdbcTemplate jdbcTemplate;

@Autowired
CalendarRepository(JdbcTemplate jdbcTemplate) {
    this.jdbcTemplate = jdbcTemplate;
}

//build.gradle 에 추가
implementation 'org.springframework.boot:spring-boot-starter-jdbc'

JDBCTemplate 메서드 종류

  • queryForObject : 하나의 SELECT 결과 값을 반환합니다.
  • queryForList(query) : 여러 개의 SELECT 결과 값을 반환합니다.
  • update : 주로 INSERT, UPDATE, DELETE 쿼리를 실행할 때 사용됩니다.
  • execute : 쿼리 실행 후 직접적인 결과를 처리합니다.
  • batchUpdate : 여러 SQL 문을 한 번에 실행할 때 사용됩니다.

사용법

  1. queryForObject
  • 형식
//기본형식
queryForObject(sql문, 반환타입지정(RowMapper), 바인딩 될 파라미터,..)
//바인딩 데이터를 배열로 전달(Object[])
queryForObject(sql문, 바인딩 될 파라미터 배열, 반환타입지정(RowMapper))
  • 단일 값 조회 - SQL 문 결과가 단일 결과일 시
// 정수 리턴
String sql = "SELECT COUNT(*) FROM users";
int count = jdbcTemplate.queryForObject(sql, Integer.class);

// 문자열 리턴
String sql = "SELECT name FROM users WHERE id = ?";
String name = jdbcTemplate.queryForObject(sql, String.class, 1);

//배열로 전달
String sql = "SELECT COUNT(*) FROM users WHERE role = ? AND active = ?";
Object[] params = { "admin", true };
int count = jdbcTemplate.queryForObject(sql, params, Integer.class);
  • DTO 매핑 - SQL 문 결과가 하나의 Row 로 생성될 시
String sql = "SELECT id, name, email FROM users WHERE id = ?";
UserDto user = jdbcTemplate.queryForObject(sql,
    (rs, rowNum) -> {
        UserDto dto = new UserDto();
        dto.setId(rs.getInt("id"));
        dto.setName(rs.getString("name"));
        dto.setEmail(rs.getString("email"));
        return dto;
    },
    1
);
//rs : ResultSet
//rowNum : 현재 행의 인덱스 (사용하지 않아도 필수로 넘겨야 한다.)

  1. queryForList / query
  • 형식
//반환값은 List<Map<String, Object>> 이다.
List<Map<String, Object>> result = jdbcTemplate.queryForList(String sql, Object... args);
  • 사용법
String sql = "SELECT id, name, email FROM users WHERE role = ?";
List<Map<String, Object>> result = jdbcTemplate.queryForList(sql, "admin");

for (Map<String, Object> row : result) {
    int id = (Integer) row.get("id");
    String name = (String) row.get("name");
    String email = (String) row.get("email");
    System.out.println(name + " : " + email);
}
//컬럼명을 key로 가지는 Map이 row마다 생성됨
//타입 캐스팅 필요 ((String), (Integer) 등)
  • DTO 타입의 List를 반환시에는 query 사용
String sql = "SELECT id, name, email FROM users WHERE role = ?";

//일반적 사용
List<UserDto> result = jdbcTemplate.query(sql,
    (rs, rowNum) -> {
        UserDto dto = new UserDto();
        dto.setId(rs.getInt("id"));
        dto.setName(rs.getString("name"));
        dto.setEmail(rs.getString("email"));
        return dto;
    },
    "admin"
);

//배열로 전달
String sql = "SELECT id, name, email FROM users WHERE role = ? AND active = ?";
Object[] params = { "admin", true };
List<UserDto> users = jdbcTemplate.query(
    sql,
    params,
    (rs, rowNum) -> {
        UserDto dto = new UserDto();
        dto.setId(rs.getInt("id"));
        dto.setName(rs.getString("name"));
        dto.setEmail(rs.getString("email"));
        return dto;
    }
);

//DTO 필드명과 컬럼명이 정확히 일치할 경우 사용 가능
UserDto user = jdbcTemplate.queryForObject(
    sql,
    new BeanPropertyRowMapper<>(UserDto.class),
    1
);

  1. update
  • 형식
//반환값은 영향을 받은 row 수(int)
update(sql 쿼리, 바인딩될 파라미터들)
  • 사용법
//INSERT
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
int rows = jdbcTemplate.update(sql, "아이유", "iu@example.com");

//UPDATE
String sql = "UPDATE users SET name = ? WHERE id = ?";
int rows = jdbcTemplate.update(sql, "아이유", 3);

//DELETE
String sql = "DELETE FROM users WHERE id = ?";
int rows = jdbcTemplate.update(sql, 5);

//배열로 전달
String sql = "INSERT INTO users (name, age, email) VALUES (?, ?, ?)";
Object[] params = { "홍길동", 30, "hong@example.com" };
int rows = jdbcTemplate.update(sql, params);
profile
기어 올라가는 개발

0개의 댓글