# 회원 수정 API

```java
@RestController
@RequiredArgsConstructor
public class MemberApiController {

    @PutMapping("/api/v2/members/{id}")
    public UpdateMemberResponse updateMemberV2(@PathVariable("id") 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;
    }
}
```

* update할 때 사용했던 member 대신 새로 쿼리해서 member 값을 가져온다.
  * 혹은 update 했던 값의 id 정도는 가져와서 다시 쿼리한다.
  * 기존 member를 그대로 사용하면 update에서 커맨드와 쿼리가 같이 있는 모양이 되기 때문이다.
  * 커맨드와 쿼리를 분리하는 연습을 하면 유지보수가 쉬워진다.
* 커맨드
  * update를 하기 위한 변경성 메서드

```java
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class MemberService {

    @Transactional
    public void update(Long id, String name) {
        Member member = memberRepository.findOne(id);
        // 변경 감지를 사용한다.
        member.setName(name);
    }
}
```

* 변경 감지에 의해 영속 상태의 member는 @Transactional이 끝나는 시점에 flush() 하고 DB 트랜잭션을 커밋한다.

## 오류 정정

* 회원 정보를 부분 업데이트 하지만 PUT을 사용하고 있다.
  * PUT
    * 전체 업데이트
  * PATCH, POST
    * 부분 업데이트


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://dodeon.gitbook.io/study/kimyounghan-spring-boot-and-jpa-optimization/01-api-development/modify-member.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
