인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

큐딩님의 프로필 이미지
큐딩

작성한 질문수

모든 개발자를 위한 HTTP 웹 기본 지식

HTTP 메서드 - PUT, PATCH, DELETE

put/patch에 대한 질문입니다

작성

·

936

3

회원정보수정할 때 "patch를 사용할까?"라는 궁금증이 생겨서 질문하게 되었습니다.

왜냐하면 회원정보 수정시 patch개념을 이용하여 수정하게 되면

서버 로직에서 유저 정보 데이터 유무에 따라 분기하여

db에 update하게 되어 중복되는 코드가 많아진다고 생각했습니다.

// 회원정보수정 API에서 nickname, email 바디값을 받는다고 했을 때 
// 아래 코드와 같이 구현해야한다고 생각했습니다.

if(nickname){
  update  user set nickname = 'inflearn' where id = 1
} else if (email){
  update user set email = 'inflearn@gmail.com' where id = 1
}

// 왜냐하면 만약에 회원정보수정 API에서 클라이언트에서  nickname은 보내고 email은 안보내는 상황에 
// if문같은 분기가 없으면 아래 코드와 같이 email에 null값이 들어갈 것으로 예상되었기 때문입니다.

update user set nickname = 'inflearn', email = null where id =1

그래서 저같은 경우는 회원정보수정API는 put메서드를 사용하고 유저정보를 다 보내도록 했습니다.


그리고 회원정보수정API에 모든 회원정보 데이터를 보내도록 하고

아래 코드와 같이 회원정보수정API 로직이 시작하는 부분에 모든 예외상황을 생각해서

바디값이 왔는지 유무를 체크하여 예외처리하는 식으로 구현했습니다.

  if (!profile_nickname) return res.status(400).json({ code: 'invalid_profile_nickname' })

그러다보니 클라이언트에서는 회원정보 수정데이터가 10개중에 하나만 바뀌어도 모든 데이터를 회원정보수정API에 보내는 비효율적인 문제가 생기더라고요.

저도 제가 구현한 방식이 비효율적인 걸 알고 있는데 어떻게 구현하는게 맞는지 생각이 나지않아 질문하게 되었습니다.

어떻게 하면 patch를 잘 이용할 수 있을까요?

현재 저 같은 경우는 수정과 관련된 API이면 put만 사용하고

예외적으로 patch를 사용하는 경우는 비밀번호 변경일 때만 사용했는데요.

왜냐하면 user테이블의 비밀번호 부분만 변경을 하는거니까 patch를 사용하는게 맞다고 생각했습니다.

답변 2

4

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 큐딩님

원하시는 것을 하려면 update 쿼리를 동적 쿼리가 되도록 구성하시면 됩니다.

예를 들어서 클라이언트에서는 변경된 값만 서버에 넘기고, 서버에서는 필드에 값이 있는 경우에는 update set 조건으로 추가하고, 값이 null인 경우에는 update set 조건에서 제외하는 식으로 만들면 됩니다.

감사합니다.

1

큐딩님의 프로필 이미지
큐딩
질문자

아 이럴 때 동적 쿼리를 쓰는 거군요. 답변 감사합니다:)

큐딩님의 프로필 이미지
큐딩

작성한 질문수

질문하기