2-1. API 개발 기본

지니🧸·2023년 2월 22일
0

Spring Boot & JPA

목록 보기
19/35

본 문서는 인프런의 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 (김영한) 강의를 공부하며 작성한 개인 노트입니다.

🧀 회원 등록 API

  • @RestController - @Controller@ResponseBody 대체
  • @Valid - member paramter를 검증
@RestController
@RequiredArgsConstructor
public class MemberApiController {

    private final MemberService memberService;

    @PostMapping("/api/v1/members")
    public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member) {
        Long id = memberService.join(member);
        return new CreateMemberResponse(id);
    }

    @Data
    static class CreateMemberResponse {
        private Long id;

        public CreateMemberResponse(Long id) {
            this.id = id;
        }

    }
}
  • 엔티티를 직접 사용하지 말고 api 스펙에 맞춘 DTO를 별도 사용하는 것이 맞음

DTO 사용하는 로직

public class MemberApiController {
	...
    @PostMapping("/api/v2/members")
    public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request) {
        Member member = new Member();
        member.setName(request.getName());

        Long id = memberService.join(member);
        return new CreateMemberResponse(id);

    }
    @Data
    static class CreateMemberRequest {
        private String name;
    }
    @Data
    static class CreateMemberResponse {
        private Long id;

        public CreateMemberResponse(Long id) {
            this.id = id;
        }
    }
}
  • 엔티티가 변경되어도 API 스펙이 변하지 않음

🍳 회원 수정 API

MemberService.class 에 추가

@Transactional
public void update(Long id, String name) {
    Member member = memberRepository.findOne(id);
    member.setName(name);
}

API에 PUT으로 UPDATE 메소드 추가

@PutMapping("/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;
}

🥞 회원 조회 API

기본 조회

@GetMapping("api/v2/members/{id}")
public List<Member> membersV1() {
    return memberService.findMembers();
}
  • 엔티티가 외부에 노출됨 > 엔티티 변경 시 api 스펙도 변경됨
  • Member.class 필드에 @JsonIgnore 셋팅하면 제외해서 엔티티 반환됨
    • 장기적인 해결 방법은 아님
  • 실무/협업에 좋은 방법은 아님

정식 조회

@GetMapping("api/v2/members")
public Result memberV2() {
    List<Member> findMembers = memberService.findMembers();
    List<MemberDto> collect = findMembers.stream()
            .map(m -> new MemberDto(m.getName()))
            .collect(Collectors.toList());
    return new Result(collect);
}

@Data
@AllArgsConstructor
static class Result<T> {
    private T data; 
}

@Data
@AllArgsConstructor
static class MemberDto {
    private String name;
}
  • 필요한 것만 노출된다는 장점
profile
우당탕탕

0개의 댓글