스프링&스프링부트

[스프링부트/웹 애플리케이션 개발]API 개발 기본

gitofjy 2023. 1. 11. 14:13

- 포스트맨 설치

( https://www.getpostman.com )

 

 

 

회원 등록 API / MemberApiController - V1

package jpabook.jpashop.api;

import jpabook.jpashop.domain.Member;
import jpabook.jpashop.service.MemberService;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

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

}

1) 포스트맨 - 헤더 설정

2) 포스트맨 - 바디(raw, JSON) 입력

3) 포스트맨 - send

4) insert 확인

 

- @Controller + @ResponseBody > @RestController

- @RequestBody : json으로 넘어온 바디를 member에 맵핑해서 넣어준다

- @Valid > javax.validation 검증한다

 

v1(Member 엔티티를 Request Body에 직접 매핑) 문제점

- 엔티티에 프레젠테이션 계층을 위한 로직이 추가된다

- 엔티티에 API 검증을 위한 로직(@NotEmpty)이 들어간다

- 엔티티가 변경되면 API 스펙이 변한다.

>> API 요청 스펙에 맞추어 별도의 DTO를 파라미터로 받는다.

 

 

 

 

 

회원 등록 API / MemberApiController - V2

@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 > valid 추가할 수 있음
    private String name;
}

>> CreateMemberRequest를 Member 엔티티 대신에 RequestBody와 매핑

- 엔티티와 프레젠테이션 계층을 위한 로직을 분리할 수 있다

- 엔티티와 API 스펙 분리

- 엔티티가 변해도 API 스펙이 변하지는 않는다.

728x90