1-2 API 개발 기본 - 회원 수정 API

shin·2024년 2월 5일

[ 회원 수정 API ]


...
@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

    • PUT
      • 전체 업데이트시 사용
    • PATCH, POST
      • 부분 업데이트시 사용
  • 회원 수정도 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는 영속 상태
  • 영속 상태의 membersetName으로 이름을 바꾸면, 해당 update 메서드가 종료되면서 스프링 AOP가 동작함

  • @Transational 어노테이션에 의해서 트랜잭션 관련된 AOP가 끝나는 시점에 트랜잭션 commit이 됨

  • JPA가 그때 flush한 후에, 영속성 컨텍스트를 다 commit

    • 영속성컨텍스트를 flush하고 데이터베이스 트랜잭션 commit

✨ 스프링 AOP

  • Aspect Oriented Programming : 관점 지향 프로그래밍

    • Aspect : 흩어진 관심사를 모듈화한 것
    • AOP는 Aspect를 분리하여 핵심기능을 설계 및 구현할 때 객체지향적인 가치를 지킬 수 있도록 도와주는 것
  • 어떤 로직을 기준으로 핵심적인 관점과 부가적인 관점으로 나누어 보고 그 관점을 기준으로 각각 모듈화

  • 관점 기준으로 모듈화 : 코드를 나눠서 모듈화

    • 핵심적인 관점 : 개발자가 적용하고자 하는 핵심 비즈니스 로직
    • 부가적인 관점 : 핵심 로직을 수행하기 위해 필요한 데이터베이스 연결(JDBC), 로깅, 파일 입출력 등
  • Crosscutting Concerns(흩어진 관심사) : 소스 코드 상에서 계속 반복되서 사용되는 코드

    • 흩어진 관심사를 Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리해서 재사용하는 것이 AOP 취지

✨ CQS : Command-Query Separation

  • Command-Query Separation : Command와 Query를 분리

    • Command : 상태를 변경하고, 결과값을 반환하지 않음
    • Query : 상태를 변경하지 않고, 결과값을 반환함
    • command와 query를 분리하여 개발하면 유지보수성이 증대됨
  • Command : MemberService에서 Member 객체의 name을 바꾼 후에 Member 객체를 반환하지 않고, 그대로 반환 없이 종료하거나 id 값 정도만 넘겨주는 정도로 개발을 진행

  • Query : MemberApiController에서는 Member 객체를 변경하지 않고 결과값을 반환하는 로직만 수행



💡 API 테스트

  • 먼저 회원 등록 API를 실행하여 새로운 회원 데이터를 생성함

  • 데이터 등록 확인

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

  • 데이터까지 변경 완료



강의 출처 : 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

profile
Backend development

0개의 댓글