유저 업데이트/삭제 API 개발

goose_bumps·2024년 5월 31일

바로 전에 정리한 내용 중 Post,Get API를 수정하여 데이터를 생성(Post), 데이터를 조회(Get)하는 API를 개발하였다.(정확히는 쿼리를 이용할 수 있도록 수정)

이번에는 CRUD 중 update와 delete를 API로 개발해보자.

1. 유저 데이터 업데이트 API

가장 먼저 API의 Spec을 짜보자.

  • HTTP Method : PUT
  • HTTP Path : /user
  • HTTP Body : JSON
    {"id":Long,
    "name":String}
  • Return값 X

데이터를 업데이트 즉, 수정하는 것이 다른 데이터를 집어넣는 행위이기 때문에 PUT 방식을 사용하고 POST와 마찬가지로 데이터 저장에 해당되기 때문에 바디를 전달한다.

다시 복습하는 차원에서 언급하자면, 쿼리를 인자로 전달할 때에는 @RequestParam을, 바디를 인자로 전달할 때에는 @RequestBody를 사용한다.

그럼, 코드를 짜보자.

1) DTO 생성

인자로 UserUpdateRequest 클래스의 인스턴스를 전달하였다. 사용자가 /user로 데이터를 입력하게 되면 이 데이터가 JSON 형식으로 UserUpdateRequest의 인스턴스 request로 전달된다.

그럼, UserUpdateRequest 클래스를 우선 만들어야 한다.
dto -> user -> request에 UserUpdateRequest 클래스를 만든다.

이 클래스는 id, name 값을 필드로 가지며 Getter 메서드가 존재한다.
(Alt + insert 단축키로 빠르게 생성 가능)

과정을 다시 정리해보자.

  1. 사용자가 name을 입력하여 데이터를 /user로 전달한다
  2. id는 auto_increment 부가조건을 추가하였기 때문에 자동으로 생성되어 전달된다
  3. UserUpdateRequest의 인스턴스가 id,name 값을 받는다
  4. 이 객체를 updateUser 메서드의 인자로 사용한다

2) 쿼리 작성

데이터 수정의 명령어는 "update 테이블명 set 필드 = 변경하려는 값 where 조건"이었다.
동일한 이름이 존재할 수 있기 때문에 조건은 id(primary key로 설정)로 해야 한다.

그럼 왜 id가 조건이 되어야 하는가?
가장 처음에 user 테이블을 만들 때 id 필드는 auto_increment 부가조건을 추가했기 때문에 입력하지 않아도 자동으로 1씩 늘어나며 생성된다.

[ 예를 들어, name = "홍길동" 으로 입력하고 저장하면 id는 자동으로 부여된다.(id = 1이라고 가정하자)
이제 이 데이터를 변경하고 싶은데 name = "홍길동", id = 1 에서 name = "김철수" id = 1로 되는 것이다.
id값은 홈페이지 상에 표기를 안하기 때문에 사용자 입장에서 입력할 수 있는 데이터는 name뿐이다.
그래서 홍길동이 여러 명이어도 그 중 id가 1인 홍길동을 선택해서 김철수로 바꾸려면 그 조건이 id여야 하는 것이다. ]

본론으로 돌아와서, 그럼 쿼리는 update user set name = ? where id = ? 이 되고 이 ?에 값이 대체될 수 있도록 jdbcTemplate를 사용해야 한다.

3) jdbcTemplate

jdbcTemplate의 update 메서드를 사용하여 sql 다음 인자로 request.getName(), request.getId() 입력하면 UserUpdateRequest의 인스턴스인 request가 받은 body를 sql에 입력할 수 있다.

정리

  • 사용자가 name 데이터를 입력한다(=수정하려는 값을 입력)
  • 이 데이터가 id값과 함께 JSON 형식으로 request 인스턴스에 전달된다
  • 매개변수로 request를 사용하고 getter을 사용하여 name,id 값을 얻는다
  • 이 얻은 값을 sql에 입력한다

2. 유저 데이터 삭제 API

데이터 삭제 API는 더 간단하다.
API의 Spec을 보자.

  • HTTP Method : DELETE
  • HTTP Path : /user
  • Query 사용
  • Return 값 X

Get 방식과 유사하게 바디가 아닌 쿼리를 사용하는데 데이터를 삭제하는 것은 어떻게보면 데이터를 조회하는 것이 선행되어야 하기 때문에 데이터 조회처럼 쿼리를 인자로 사용한다.

1) API 작성

API Spec에 맞게 메서드를 만들어보자.

쿼리를 사용하기 때문에 인자로 @RequestParam을 사용하고 name 데이터를 입력하였다. name 데이터를 인자로 입력한 이유는 조건으로 사용되어 조건에 부합하는 테이블을 찾기 위해서이다.
사용자 입장에서 id 값을 모르기 때문에 이름 값으로 데이터를 찾고 삭제할 수 밖에 없다.
예를 들어, (김철수, 21세, 신장 190cm, id 5) 라는 데이터가 있으면 사용자는 id 값을 모르기 때문에 이름, 나이, 신장이라는 조건으로 데이터를 찾아야 한다.
여기서는 도서관리 웹을 개발하기 때문에 이름밖에 사용할 조건이 없다.

인자로 받은 name값은 jdbcTemplate의 update 메서드를 통해 sql에 입력되어 ?값을 대체한다.

2) 쿼리 작성

데이터 삭제의 명령어는 "delete 테이블명 where 조건"이었다. 여기서 조건은 이름이기 때문에 delete user where name = ? 가 되야 한다.
RequestParam으로 받은 name값이 ?에 들어가게 되어 "홍길동"이라는 값을 입력하면 홍길동이라는 name값이 있는 테이블 데이터가 삭제되는 것이다.


한 가지 의문점은 유저 정보가 없는 데이터를 업데이트, 삭제할 경우 어떻게 될까?
PostMan에 입력을 해보면 200 OK라는 상태를 보낸다.
실제로 없는 유저 데이터를 업데이트, 삭제하면 안되기 때문에 이러한 경우에는 예외 처리를 해주어야 한다.

0개의 댓글