API Basics(Part 1: Request Response를 엔티티로 직접 사용)

2222 단어 SpringbootJPAJPA

Postman을 이용해서 API를 테스트해볼 예정입니다.

앞서 Controller에서 request를 받아서 처리하는 작업을 했는데, API로 한번 더 하는 이유는?
Controller에서는 HTML으로 Form 데이터를 받아서 회원가입 등을 하고 랜더링 할 페이지의 경로를 반환 했지만, API에서는 iOS, 안드로이드, Vue, React 등 별도의 프론트 클라이언트가 있으며, 클라이언트와 서버 간의 소통은 API로만 제공 되는 경우가 많기 때문에 API로 요청을 받아서 데이터(JSON 등)로 response를 보내는 것을 학습 할 예정입니다.

@RestController //@Controller && @ResponseBody
@RequiredArgsConstructor
public class MemberApiController {

    private final MemberService memberService;
    /**
     * V1: Reqeust & Response로 Member 엔티티를 직접 받는다.
     * 문제점
     * - 엔티티에 프레젠테이션 계층을 위한 로직이 추가된다.
     * - 엔티티에 API 검증을 위한 로직이 들어간다. (@NotEmpty 등등)
     * - 실무에서는 회원 엔티티를 위한 API가 다양하게 만들어지는데, 한 엔티티에 각각의 API를 위한 모든 요청 요구사항을 담기는 어렵다.
     * - 엔티티가 변경되면 API 스펙이 변한다.
     * 결론
     * - API 요청 파라미터로 절대 엔티티 자체를 받는 것을 기피
     * - API 요청 스펙에 맞추어 별도의 DTO를 파라미터로 받는다.(CreateMemberRequest)
     */
    @PostMapping("/api/v1/members") //회원 등록 api
    public Member saveMemberV1(@RequestBody @Valid Member member) {
        // @RequestBody == Node.js 에서 req.body 와 같다고 생각하면 됨
        return memberService.findOne(member.findId());
    }
}

@RestController:
-> @Controller + @ResponseBody
기존에 @Controller만 사용 했을때는, 요청에 대한 response로 String으로 랜더링 할 HTML의 경로&파일 이름을 반환 했었습니다.
반면, RestController에서는 @ResponseBody도 포함 되어 있으므로, 요청에 대한 response를 원하는 대로 데이터를 반환하도록 합니다.
(더 자세한 내용은 이미 학습한 SpringMVC1 && SpringMVC2 참고: https://github.com/k-ms1998/Spring-studies)

V1:
Request로 엔티티 자체를 받고, Response도 엔티티를 반환 합니다.
가장 단순한 방법이지만, 실무에서는 절대 이런식으로 요청을 받고 데이터를 반환하지 않습니다.

왜냐하면, 엔티티가 변경되면, 해당 엔티티를 사용하는 모든 API를 변경해야 됩니다. 또한, Response를 보낼때도 스펙에 맞게 보내기도 어려워지며, 해당 API에서 필요하지 않는 값도 반환하게 됩니다.
이러한 문제점들을 해결하기 위해서 DTO를 사용해서, DTO로 Request를 받고 DTO를 Response로 반환합니다.

좋은 웹페이지 즐겨찾기