jpa-spring boot - api 실습 (1)

김강현·2023년 4월 9일
0

SPRING-JPA-실습-API

목록 보기
1/4

  • 이런식으로 api 패키지를 만들어서 따로 관리하는 편 (김영한 개발자님)
  • @Controller @ResponseBody 로 쓰면 됨
  • @RestController 로 쓰면 똑같이 기능!

MemberApiController

saveMemberV1

    @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;
        }
    }
  • @RequestBody 는 json 으로 input 이 들어오면, 해당 내용을 자동으로 Member에 맞게 매핑해주는 역할!!

  • http://localhost:8080/api/v1/members 로 post 요청을 하게 되면, 값이 반환 되는거 확인 가능!!

  • @Valid 는 엔티티 속의 @NotEmpty 가 있는 필드가 있는지 확인을 해줌.

Entity 가 Api Controller 의 파라미터로 쓰이는 것은 좋지 않다!

  • Entity 내부 코드 자체에 API function 이 섞이고 ( @NotEmpty 같은 )
  • Entity 수정에 api도 같이 영향을 받는다.

saveMemberV2

    @PostMapping("/api/v2/members")
    public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request){
        Member member = new Member();
        member.setName(request.name);
        Long id = memberService.join(member);
        return new CreateMemberResponse(id);
    }
    @Data
    static  class CreateMemberRequest {
        @NotEmpty
        private String name;
    }
  • Entity 를 직접 쓰지않고, 따로 data 규약(DTO)을 만들어서 데이터를 왔다갔다!!
  • API 스펙이 Entity 영향을 받지 않음!

updateMemberV2

  • 수정의 경우, rest api 규약, 관례(?) 에 따라 Put 방식을 활용
  • url 에 id 를 받아오는 방식으로 ㄱㄱ!
    @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());
    }
  • Member Entity를 내부에서 직접 사용하지 않고, memberService 로 파라미터 넘기기 (캡슐화)

member 조회 v1

    @GetMapping("/api/v1/members")
    public List<Member> membersV1(){
        return memberService.findMembers();
    }

  • Entity를 직접 반환하면, 내부 정보들을 다 노출하게됨!!
  • 원치 않은 정보에는 @JsonIgnore 을 넣어주면 된다. (+ 양방향 json 화 무한루프 방지)
  • 회원과 관련된 다양한 API 가 있을텐데, 해당 기능마다 어노테이션을 달아주는 것이 어려움.
  • 위와 마찬가지로, Entity 변경에 API 스펙이 변경된다!

member 조회 v2

    @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;
    }

@AllArgsConstructor 는 class 내부 필드를 생성때 바로 받을 수 있게 해줌.

profile
this too shall pass

0개의 댓글