본문 바로가기
프로젝트/도서관리 프로젝트

도서관리 프로젝트[3] 회원 수정, 삭제 (update, delete)

by CodeMango 2023. 6. 15.

수정API


삭제API

 

1.UserController

//수정, 삭제
    //json이 들어온걸 객체로 바꾸기 위해서 dto를 만든다. UserUpdateRequest라는 dto
    @PutMapping("/user")
    public void updateUser(@RequestBody UserUpdateRequest request) {
        String sql = "UPDATE user SET name = ? WHERE id = ?";
        //특정 id를 가진 유저가 특정 이름으로 변경되어야함.
        jdbcTemplate.update(sql, request.getName(), request.getId());
    }

    @DeleteMapping("/user")
    //쿼리가 하나라서 RequestParam사용함
    public void deleteUser(@RequestParam String name) {
        String sql = "DELETE FROM user WHERE name = ?";
        jdbcTemplate.update(sql, name);
    }
    }

2.UserUpdateRequest(dto)

package com.group.libraryapp.dto.user.request;

public class UserUpdateRequest {

    private long id;
    private String name;

    //alt + insert : 생성자, getter, setter


    public UserUpdateRequest(long id, String name) {
        this.id = id;
        this.name = name;
    }

    public long getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}

 

예외  : 존재하지 않는 사용자의 수정, 삭제

 

업데이트나 삭제를 할 때, 존재하지 않는 유저라면?

존재하지 않아도 성공했다는 의미인 200 OK를 전달하게됩니다.

이를 해결하기 위해서는, update API나 삭제 API가 호출될 때 API에서 데이터 존재여부를 확인한 다음

데이터가 없다면 예외를 던지고, API를 사용하는 사람에게 문제가 있다는 것을 알려주게 해야합니다. 

해결방법은 throw  exception 을 던지는 것입니다!

    //아래와 같이 작성시 500에러
    @GetMapping("/user/error-test")
    public void errorTest(){
        throw new IllegalArgumentException();
    }

위와 같이 예외를 잡으면 Internal Server Error (500) 에러가 반환되게 됩니다. 

이 논리를 그대로 가져와서 아까 만든 수정 API에 적용합니다.

//수정, 삭제
    //json이 들어온걸 객체로 바꾸기 위해서 dto를 만든다. UserUpdateRequest라는 dto
    @PutMapping("/user")
    public void updateUser(@RequestBody UserUpdateRequest request) {
        //데이터가 존재하는지 먼저 확인하기
        String readSql = "SELECT * FROM user WHERE id = ?";
        //조회됐을 때 결과가 있으면 무조건 0을 반환하고, ?에 값을 넣어주기 (id)
        //존재하지 않는 경우는 조회 결과가 비어있는 경우(존재하면 0이 나옴)
        //query : 반환된 값들을 List로 감싸줌
        //0은 최종적으로 List로 반환됨 (  [0]  )
        boolean isUserNotExist = jdbcTemplate.query(readSql, (rs, rowNum) -> 0, request.getId()).isEmpty();

        //user가 존재하지 않는다면 예외처리
        if(isUserNotExist){
            throw new IllegalArgumentException();
        }
        String sql = "UPDATE user SET name = ? WHERE id = ?";
        //특정 id를 가진 유저가 특정 이름으로 변경되어야함.
        jdbcTemplate.update(sql, request.getName(), request.getId());
    }

 

이렇게 코드를 변경하고나서 포스트맨에 없는 값을 수정하라는 명령을 보내면

500에러가 뜨고 수정이 불가능하게 됩니다!

 

DELETE도 마찬가지로 아래와 같이 수정합니다.

    @DeleteMapping("/user")
    //쿼리가 하나라서 RequestParam사용함
    public void deleteUser(@RequestParam String name) {
        String readSql = "SELECT * FROM user WHERE name = ?"; //삭제는 이름을 기준으로 검색해야함
        //조회됐을 때 결과가 있으면 무조건 0을 반환하고, ?에 값을 넣어주기 (id)
        //존재하지 않는 경우는 조회 결과가 비어있는 경우(존재하면 0이 나옴)
        //query : 반환된 값들을 List로 감싸줌
        //0은 최종적으로 List로 반환됨 (  [0]  )
        boolean isUserNotExist = jdbcTemplate.query(readSql, (rs, rowNum) -> 0, name).isEmpty();

        //user가 존재하지 않는다면 예외처리
        if(isUserNotExist){
            throw new IllegalArgumentException();
        }

        String sql = "DELETE FROM user WHERE name = ?";
        jdbcTemplate.update(sql, name);
    }

 

DELETE는 포스트맨에서 query를 이용합니다.

아래처럼 존재하는 값인 AA를 입력하고 삭제해주면 정상적으로 삭제가 되고, 

없는 값인 bb를 입력하면 삭제가 되지 않고 500 에러가 뜨게됩니다.

 

댓글