인프런 강의를 통해 학습한 내용입니다.
사용자의 ID(auto increment 값) 을 조회하여 해당 사용자의 이름을 새롭게 입력받은 내용으로 바꾸는 API 를 만들었다.
@PutMapping("/user")
public void updateUser(@RequestBody UserUpdateRequest request) {
String readSql = "SELECT * FROM user WHERE id = ?";
boolean isUserNotExist = jdbcTemplate.query(readSql, (rs, rowNum) -> 0, request.getId()).isEmpty();
if (isUserNotExist) {
throw new IllegalArgumentException();
}
String sql = "UPDATE user SET name = ? WHERE id = ?";
jdbcTemplate.update(sql, request.getName(), request.getId());
}
@RequestBody 로 메서드 내 UserUpdateRequest의 객체로 들어온 매개변수를 body에 넣어 보낸다. 이 과정에서 jdbcTemplate.query 란 메서드를 활용한다.
@Override
public <T> List<T> query(String sql, RowMapper<T> rowMapper, @Nullable Object... args) throws DataAccessException {
// 생략
}
해당 메서드는 이런 메서드 시그니처를 가지고 있다. sql 문을 String으로 받고, RowMapper 인스턴스와 객체를 매개변수로 갖는다.
@FunctionalInterface
public interface RowMapper<T> {
@Nullable
T mapRow(ResultSet rs, int rowNum) throws SQLException;
RowMapper는 이렇게 생긴 인터페이스로 mapRow 라는 메서드를 가지고 있다. SQL 구문이 실행 됐을 때 순차적으로 실행되어 나온 결과가 rs이고 그 순차적인 번호가 rowNum이다.
따라서 람다식 표현인
jdbcTemplate.query(readSql, (rs, rowNum) -> 0, request.getId()
이 구문은 request.getId()에서 가져온 값으로 sql 구문을 실행했을 때 값이 나오면 0으로 맵핑하라는 뜻이다. 단지, 값의 유무만 보기 위함이다.
@DeleteMapping("/user")
public void deleteUser(@RequestParam String name) {
String readSql = "SELECT * FROM user WHERE name = ?";
boolean isUserNotExist = jdbcTemplate.query(readSql, (rs, rowNum) -> 0, name).isEmpty();
String sql = "DELETE FROM user WHERE name = ?";
jdbcTemplate.update(sql, name);
}
해당 API는 파라미터로 들어온 값을 @RequestParam으로 받은 뒤 DB에서 유저 검색 후 유저가 존재하면 sql 구문을 통해 삭제한다.