[Spring] Put & Delete API

정석·2024년 2월 22일

Spring

목록 보기
2/21
post-thumbnail

인프런 강의를 통해 학습한 내용입니다.

Put

사용자의 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 란 메서드를 활용한다.

jdbcTemplate.query ?

@Override
public <T> List<T> query(String sql, RowMapper<T> rowMapper, @Nullable Object... args) throws DataAccessException {
  // 생략
}

해당 메서드는 이런 메서드 시그니처를 가지고 있다. sql 문을 String으로 받고, RowMapper 인스턴스와 객체를 매개변수로 갖는다.

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으로 맵핑하라는 뜻이다. 단지, 값의 유무만 보기 위함이다.

Delete

 @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 구문을 통해 삭제한다.

0개의 댓글