JAVA

[JAVA] CRU API

응디 2022. 5. 17. 17:47

회원등록

API를 만들때 controller에서 entity를 파라미터로 받아서 사용하지 말자.

entity는 굉장히 여기저기서 사용되므로 이름이 바뀌거나 하기 쉽다.

근데 이때 이름이 바뀌면 API 스펙이 바뀌므로 API가 작동이 안될수 있다.

따라서 API 를 개발할 때는 controller 에서 DTO를 사용하자!

@RestController // Controller + ResponseBody -> 데이터를 바로 json이나 xml로 보내자!
@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);
    }

    // entity가 바뀌어도 어차피 코드 자체에서 실행 전 에러를 뿌려주기 때문에 수정만 해주면 api 스펙이 바뀌지 않음
    // 유지보수 할때 큰 장점 CreateMemberRequest만 보면 어떤 데이터를 받는지도 알수 있다.
    @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{
        @NotEmpty
        private String name;
    }

    @Data
    static class CreateMemberResponse {
      private Long id;

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

위에 v1은 entity를 사용하여 회원가입을 진행한다. v2 보다 코드는 간략하지만 entity에서 수정이 일어나면 실행 전에 에러를 받을 수 없기 때문에 실무에서 장애가 터지기 쉽상이다.

따라서 v2 처럼 class만드는게 귀찮아도

DTO class(CreateMemberRequest class) 만들어 주고 사용하는게 코드상으론 좀 더 복잡해 보여도 더 안전하다.


회원수정

// 무언가 수정할때는 put 을 사용
    @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());
    }

회원조회

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

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

      return new Result(collect);
}

위에 v1 처럼 회원을 조회 하면 entity를 바로 받아오기 때문에 entity를 수정 했을 시 장애를 일으키기 쉽다.

따라서 v2 처럼 Dto를 이용하여서 api 응답 값으로 전달해줘야 api 스펙을 수정 하지 않아도 된다.

위에 코드 실행 시 아래와 같은 결과값이 나온다.

이때 클라이언트가 count 값을 추가해 달라고 한다면??

Result에 추가해주고 return new Result(collect.size(), collect) 로 수정해 주기만 하면 된다.

결과 예시

 

다음엔 API 개발의 고급 단계를 공부해보겠다. 

'JAVA' 카테고리의 다른 글

[JAVA] API 구현 시 테스트 개발  (0) 2022.06.02
[JAVA] 지연로딩과 조회 성능 최적화  (0) 2022.05.19
[JAVA] boolean @Getter  (0) 2022.03.24
[TEST] Memory DB 사용  (0) 2022.03.16
[JAVA] 결과조회(fetch)  (0) 2022.03.14