...
@RestController
@RequiredArgsConstructor
public class MemberApiController {
private final MemberService memberService;
/**
* 수정 API
* @param id
* @param request
* @return UpdateMemberResponse
*/
@PatchMapping("/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;
}
}
REST API
회원 수정도 DTO를 요청 파라미터에 매핑
회원 등록과 수정의 입력 필드는 다를 수 있기 때문에 별도의 response, request 객체를 생성하는 것이 좋음
...
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class MemberService {
private final MemberRepository memberRepository;
/**
* 회원 이름 수정
* @param id
* @param name
*/
@Transactional
public void update(Long id, String name) {
Member member = memberRepository.findOne(id);
member.setName(name);
}
}
변경 감지를 사용해서 데이터 수정
영속성컨텍스트가 id를 찾을 때, 처음에는 없기 때문에 DB에서 값을 끌어옴
DB에서 영속성 컨텍스트 Member를 올린 것을 반환해줌
member는 영속 상태영속 상태의 member를 setName으로 이름을 바꾸면, 해당 update 메서드가 종료되면서 스프링 AOP가 동작함
@Transational 어노테이션에 의해서 트랜잭션 관련된 AOP가 끝나는 시점에 트랜잭션 commit이 됨
JPA가 그때 flush한 후에, 영속성 컨텍스트를 다 commit 함
flush하고 데이터베이스 트랜잭션 commitAspect Oriented Programming : 관점 지향 프로그래밍
Aspect : 흩어진 관심사를 모듈화한 것어떤 로직을 기준으로 핵심적인 관점과 부가적인 관점으로 나누어 보고 그 관점을 기준으로 각각 모듈화
관점 기준으로 모듈화 : 코드를 나눠서 모듈화
Crosscutting Concerns(흩어진 관심사) : 소스 코드 상에서 계속 반복되서 사용되는 코드
Command-Query Separation : Command와 Query를 분리
Command : 상태를 변경하고, 결과값을 반환하지 않음Query : 상태를 변경하지 않고, 결과값을 반환함Command : MemberService에서 Member 객체의 name을 바꾼 후에 Member 객체를 반환하지 않고, 그대로 반환 없이 종료하거나 id 값 정도만 넘겨주는 정도로 개발을 진행
Query : MemberApiController에서는 Member 객체를 변경하지 않고 결과값을 반환하는 로직만 수행
먼저 회원 등록 API를 실행하여 새로운 회원 데이터를 생성함

데이터 등록 확인

Path Variable로 수정하고자 하는 회원의 id값을 전달하고 requestBody로 수정 이름을 전달한 후에 send를 하면 해당 회원의 이름이 수정됨

데이터까지 변경 완료
