[스프링부트 JPA API개발 성능최적화] 회원 수정 API
[스프링부트 JPA API개발 성능최적화] 회원 수정 API
스프링부트 JPA API개발 성능최적화
목차#
- API 개발 기본
- 회원 등록 API
- 회원 수정 API
- 회원 조회 API
- API 개발 고급
- 조회용 샘플 데이터 입력
- 지연 로딩과 조회 성능 최적화
- 페이징과 한계 돌파
- OSIV와 성능 최적화
- 다음으로
- 스프링 데이터 JPA 소개
- QueryDSL 소개
- 마무리
API 개발 기본#
회원 수정 API#
회원 수정 API는 저장 API와 크게 다를 것이 없습니다.
이전 API에서 수정하여 수정 API를 작성해 보겠습니다.
id와 name을 입력받아, 해당 id로 조회한 member의 이름을 name으로 변경합니다.
MemberApiController.java
@PutMapping("/api/v2/members/{id}")
public UpdateMemberResopnse updateMemberV2(
@PathVariable("id") Long id
, @RequestBody @Valid UpdateMemberRequest request
){
// 수정 커맨드
memberService.update(id, request.getName());
// 조회 쿼리
Member findMember = memberService.findOne(id);
// 커맨드와 쿼리를 분리
return new UpdateMemberResopnse(findMember.getId(), findMember.getName());
}
@Data
@AllArgsConstructor
static class UpdateMemberResopnse {
private long id;
private String name;
}
@Data
static class UpdateMemberRequest {
@NotEmpty
private String name;
private String city;
private String street;
private String zipcode;
}
@AllArgsConstructor#
AllArgsConstructor 어노테이션은 모든 필드 값을 파라미터로 받는 생성자를 만들어줍니다.
MemberService.java
/**
* 회원 수정
*/
@Transactional // 변경 감지를 위한 트랜잭션 필수 !!!
public void update(Long id, String name) {
Member member = this.findOne(id);
member.setName(name);
}
하나의 트랜잭션에서 조회한 엔티티는 변경감지 대상이기 때문에 조회 후 Set을 통해 name을 Update할 수 있습니다.
update 메소드의 리턴값으로 Member를 넘기지 않는 이유는 수정에 대한 커맨드와, 조회 쿼리를 분리함과
Member를 리턴하게 되면 id를 통해 새로 변경된 member를 조회하여 영속상태가 끊어진 member를 전달하게 됩니다.
RESTfulApi#
RESTfulApi의 get, post, put, patch, delete를 처음 듣는다면, 한번 REST API의 개념을 먼저 공부하시는게 도움이 되실것같습니다.
Resource | GET(read) | POST(create) | PUT/PACTH(update) | DELETE(delete) |
---|---|---|---|---|
/members | 사용자 전체 조회 | - | - | - |
/members/{id} | {id}사용자 조회 | {id} 신규 사용자 추가 | {id} 사용자 수정 | {id} 사용자 삭제 |
엔티티와 프리젠테이션 계층간 로직을 분리를 할 수 있습니다.
엔티티와 API 스팩을 분리할 수 있어 엔티티를 변환해도 API 스팩에 변화가 없습니다.