@RestController
@RequiredArgsConstructor
public class MemberApiController {
@PutMapping("/api/v2/members/{id}")
public UpdateMemberResponse updateMemberV2(
@PathVariable Long id,
@RequestBody @Valid UpdateMemberRequest request) {
memberService.update(id, request.getName());
Member member = memberService.findOne(id);
return new UpdateMemberResponse(member.getId(), member.getName());
}
@Data
static class UpdateMemberRequest {
private String name;
}
@Data
@AllArgsConstructor
static class UpdateMemberResponse {
private Long id;
private String name;
}
}
@Transactional
이 끝나는 시점에 flush() 하고 DB 트랜잭션을 커밋한다.@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class MemberService {
@Transactional
public void update(Long id, String name) {
Member member = memberRepository.findOne(id);
member.setName(name);
}
}
회원정보 수정 시 Service의 update 메소드에서 Member를 반환해도 된다.
이 때, 영속상태가 끊긴 Member가 반환 된다.
사용은 해도 되지만 커맨드와 쿼리를 분리하도록 한다.
Update는 커맨드성 메소드인데, Member를 쿼리를 하는 형태가 되기 때문에,
입력 값에서 이용하는 id 정도만 반환하도록 한다.
회원 수정 API updateMemberV2
는 회원 정보를 부분 업데이트 한다.
PUT 방식을 사용했지만, PUT은 전체 업데이트를 할 때 사용하는 것이 타당하다.
부분 업데이트를 하려면 PATCH를 사용하거나 POST를 사용한다.
참고 :