[Spring Boot]Put / Patch

재피터노트북·2022년 10월 5일
1

Spring Boot로 CRUD API를 구현하던중 update부분에서 Put하고 Patch의 차이를 더 알고싶어 구현해보았다.

PUT과 PATCH 메서드는 기존에 존재하던 자원에 업데이트를 실시함. 둘다 업데이트를 실시하기 때문에 혼용해서 API를 구축하기 되게 쉽다.

PUT

  • HTTP PUT 메서드는 요청 페이로드를 사용해 새로운 리소스를 생성하거나, 대상 리소스를 나타내는 데이터를 대체함.

PATCH

  • HTTP PATCH 메소드는 리소스의 부분적인 수정을 할때에 사용됩니다.

그래서 한번 JAVA Spring Boot로 PUT하고 PATCH의 업데이트 하는 부분을 구현해 보았다.

DB Table : Blog

  • title

  • username

  • password

  • contents

테이블 안에 이렇게 값이 있고 어떻게 코드로 썻는지 보여주겠음.

PUT Update

@PutMapping("/api/blogs/{id}")
    public Long updateBlog(@PathVariable Long id, @RequestBody BlogRequestDto requestDto) throws SQLException {

        return blogService.update(id, requestDto);
    }
  • 이렇게 URI로 요청을 받으면 Service에게 넘겨준다.

public Long update(Long id, BlogRequestDto requestDto) throws SQLException {
        Blog blog = blogRepository.findById(id)
                .orElseThrow(() -> new NullPointerException("해당 아이디가 존재하지 않습니다."));
        blog.update(requestDto);
        return id;
    }
  • 서비스에서는 requestDto객체로 들어온값으로 DB에 해당값이 존재하는지 확인하고 값이 있다면 지금들어온 requestDto객체의 값으로 update해줌.

  • 처음에 POST로 Create를 한후

  • 이렇게 전체 데이터를 덮어씌워서 업데이트를 함.

  • 바뀐 데이터를 조회

이렇게 PUT은 Request Body쪽에 전체 데이터를 줘서 그값으로 덮어 씌웠는데 Patch에서는 다이나믹 업데이트를 통해 바꾸고 싶은 값만 바꿀수 있음.

PATCH Update

 @PatchMapping("api/blogs/{id}")
    public Long update2(@PathVariable Long id, @RequestBody BlogRequestDto requestDto) throws SQLException {

        return blogService.patchUpdate(id, requestDto);
    }
  • Patch로 요청이 들어오면 Service의 patchUpdate함수로 넘어간다.

public Long patchUpdate(Long id, BlogRequestDto requestDto) throws SQLException {

        Blog blog = blogRepository.findById(id)
                .orElseThrow(() -> new NullPointerException("해당 아이디가 존재하지 않습니다."));

        List<BlogRequestDto> list = new ArrayList<>();
        list.add(requestDto);


        for (int i=0;i< list.size();i++) {
            if (list.get(i).getContents() != null) blog.setContents(list.get(i).getContents());
            if (list.get(i).getUsername() != null) blog.setUsername(list.get(i).getUsername());
            if (list.get(i).getPassword() != null) blog.setPassword(list.get(i).getPassword());
            if (list.get(i).getTitle() != null) blog.setTitle(list.get(i).getTitle());
        }

        blogRepository.save(blog);

        return id;
    }
    
  • 블로그 객체에 기존 정보를 담고 Request Body에 담은 정보를 requestDto로 받고 ArrayList안에 그값을 넣어준후 값을 하나하나 확인하면서 넘어온값이 null이 아니라면 Setter를 통해 바꿔준후 저장한다.

  • 이렇게 요청은 Patch로 주고 body안의 값을 title만 준후

  • GET으로 확인해 보면 title만 바뀐걸 볼 수 있다.!!

profile
난 이 재 선

1개의 댓글

comment-user-thumbnail
2023년 2월 6일

안녕하세요, 먼저 PUT/PATCH 예제를 통한 자세한 설명으로 이해에 도움을 주셔서 감사합니다.

"Patch로 요청이 들어오면 Service의 patchUpdate함수로 넘어간다."
부분에서
List list = new ArrayList<>();
로 리스트로 만들어준다음
list.add(requestDto); 를 통해 param값을 리스트에 "1"건을 넣어준 뒤
하단에서 따로 리스트로 진행을 시킨 로직상 이유가 있을지 궁금하여 댓글드려봅니다!

하나의 객체를 통해 비교하여 blog라는 객체에 넣는 것과 비교하여
가용성등을 통한 이점이 있을까 싶어 질문드려봅니다

답글 달기