수정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 에러가 뜨게됩니다.
'프로젝트 > 도서관리 프로젝트' 카테고리의 다른 글
도서관리 프로젝트[5] IoC 제어의 역전, 인터페이스(interface), @Primary (0) | 2023.06.22 |
---|---|
도서관리 프로젝트[4] Controller 3단 분리, 스프링컨테이너, 스프링빈, 인스턴스화 (0) | 2023.06.21 |
도서관리 프로젝트[2] - 유저 조회 (0) | 2023.05.28 |
도서관리 프로젝트[1] - 기획과 유저 등록 (0) | 2023.05.28 |
[before project] HTTP와 API (0) | 2023.05.27 |
댓글