[스프링 활용2] 회원 수정 API

atdawn·2024년 6월 25일

SPRING BOOT+JPA

목록 보기
36/49

참고 : [실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화] - 김영한


...
 @PutMapping("/api/v2/members/{id}")
    public UpdateMemberResponse updateMemberV2(
            @PathVariable("id") Long id,
            @RequestBody @Valid UpdateMemberRequest request){

        memberService.update(id, request.getName());
        Member findMember = memberService.findOne(id);
        return new UpdateMemberResponse(findMember.getId(),findMember.getName());

    }

    @Data
    static class UpdateMemberRequest {
        private String name;
    }

    @Data
    @AllArgsConstructor
    static class UpdateMemberResponse {
        private Long id;
        private String name;
    }
...

MemberService

...
 @Transactional //변경
    public void update(Long id, String name) {
        Member member = memberRepository.findOne(id);
        member.setName(name);
    }

@AllArgsConstructor 어노테이션

  • Lombok 라이브러리에서 제공하는 어노테이션
  • 클래스의 모든 필드를 사용하는 생성자를 자동으로 생성
  • @AllArgsConstructor을 사용할 경우 기본 생성자가 생성되지 않으므로, 명시적으로 필요한 경우 기본 생성자를 추가해야 함.

@PutMapping 어노테이션

  • 스프링 프레임워크에서 HTTP PUT 요청을 처리하는 메서드를 정의할 때 사용하는 어노테이션
  • PUT 요청은 서버에서 리소스를 수정하거나 업데이트할 때 사용
  • @PutMapping은 @RequestMapping 어노테이션의 축약형으로, HTTP 메서드가 PUT일 때만 요청을 처리


우선 Post로 hello라는 이름의 회원을 등록해준다.


그 후 이름을 변경해주면 업데이트가 완료 된다.

동작 과정

  • URI와 요청 메서드 매핑
    • 클라이언트에서 PUT 메서드로 /api/v2/members/{id} 엔드포인트에 요청을 보냄
    • {id}는 경로 변수로, 실제로는 멤버의 ID
  • 매개변수 처리
    • @PathVariable("id") Long id: URI에서 추출한 멤버의 ID를 매개변수로 받음
    • @RequestBody @Valid UpdateMemberRequest request: 요청 본문에 포함된 JSON 데이터를 UpdateMemberRequest(DTO) 객체로 변환하여 받음.
  • 서비스 계층 호출
    • memberService.update(id, request.getName()): memberService에서 update 메서드를 호출하여 멤버의 이름을 업데이트
    • @Transactional 어노테이션이 붙어 있어, 이 메서드는 트랜잭션 범위에서 실행 됨. 따라서 메서드가 실행되는 동안 변경된 엔티티 상태는 트랜잭션 커밋 시점에서만 데이터베이스에 반영
  • 변경 감지와 업데이트
    • JPA는 트랜잭션 커밋 시점에 변경 감지(Dirty Checking)를 통해 엔티티의 상태 변화를 감지
    • 변경된 엔티티의 필드(name)가 데이터베이스에 업데이트되는 SQL 쿼리를 생성하고 실행
  • 응답 생성
    • memberService.findOne(id);: 업데이트된 멤버의 ID로 데이터베이스에서 해당 멤버를 조회
    • 조회된 멤버 객체에서 ID와 이름을 추출하여 UpdateMemberResponse DTO 객체를 생성 후 HTTP 응답으로 반환

+ 오류정정: 회원 수정 API updateMemberV2 은 회원 정보를 부분 업데이트 한다. 여기서 PUT 방식을 사용했는 데, PUT은 전체 업데이트를 할 때 사용하는 것이 맞다. 부분 업데이트를 하려면 PATCH를 사용하거나 POST를 사용하는 것이 REST 스타일에 맞다.

POST , PUT , PATCH 차이점 ?

  • POST: 새로운 리소스를 생성할 때 사용하며, 데이터가 완전한 리소스 정보
  • PUT: 전체 리소스를 업데이트할 때 사용하며, 클라이언트가 보낸 데이터로 리소스가 완전히 교체
  • PATCH: 부분적인 업데이트를 할 때 사용하며, 클라이언트가 보낸 데이터는 업데이트할 필드와 해당 값만 포함
profile
복습 복습 복습

0개의 댓글