참고 : [실전! 스프링 부트와 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라는 이름의 회원을 등록해준다.

그 후 이름을 변경해주면 업데이트가 완료 된다.
/api/v2/members/{id} 엔드포인트에 요청을 보냄@PathVariable("id") Long id: URI에서 추출한 멤버의 ID를 매개변수로 받음@RequestBody @Valid UpdateMemberRequest request: 요청 본문에 포함된 JSON 데이터를 UpdateMemberRequest(DTO) 객체로 변환하여 받음.memberService.update(id, request.getName()): memberService에서 update 메서드를 호출하여 멤버의 이름을 업데이트@Transactional 어노테이션이 붙어 있어, 이 메서드는 트랜잭션 범위에서 실행 됨. 따라서 메서드가 실행되는 동안 변경된 엔티티 상태는 트랜잭션 커밋 시점에서만 데이터베이스에 반영memberService.findOne(id);: 업데이트된 멤버의 ID로 데이터베이스에서 해당 멤버를 조회+ 오류정정: 회원 수정 API updateMemberV2 은 회원 정보를 부분 업데이트 한다. 여기서 PUT 방식을 사용했는 데, PUT은 전체 업데이트를 할 때 사용하는 것이 맞다. 부분 업데이트를 하려면 PATCH를 사용하거나 POST를 사용하는 것이 REST 스타일에 맞다.
POST , PUT , PATCH 차이점 ?
- POST: 새로운 리소스를 생성할 때 사용하며, 데이터가 완전한 리소스 정보
- PUT: 전체 리소스를 업데이트할 때 사용하며, 클라이언트가 보낸 데이터로 리소스가 완전히 교체
- PATCH: 부분적인 업데이트를 할 때 사용하며, 클라이언트가 보낸 데이터는 업데이트할 필드와 해당 값만 포함