[Spring API 실습 #-01] 회원 등록 API

 

꼭 API스펙을 위한 별도의 DTO를 만들어 사용하는것이 제일 좋다.

실무에서는 API 만들때 엔티티를 직접 받지도 말고 보내지도 말라.(직접 노출X)

 

MemberApiController.java

package com.jpabook.api;

import com.jpabook.domain.Member;
import com.jpabook.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;
import javax.validation.constraints.NotEmpty;

@RestController// = @Controller + @ResponseBody을 합친거다
@RequiredArgsConstructor
public class MemberApiController {

    private final MemberService memberService;

    // 엔티티를 받지발고 보내지도 말라!!
    // api스펙을 위한 별도의 DTO를 만들어 사용하는게 제이 좋다!!

    @PostMapping("/api/v1/members")
    public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member) {
        // @RequestBody는 해당 컨트롤러로 날라온 json데이터를 Member로 변환해준다.
        Long id = memberService.join(member);
        return new CreateMemberResponse(id);
    }


    // v2
    // Member 엔티티바꾸면 다 에러가난다.
    // 장점 : api 스펙이 바뀌지 않는다.
    /**
     * 등록
     * @param request
     * @return
     */
    @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;
        }
    }
}

 

Validation 같은 경우는 DTO에 정의해서 사용하는 것이 좋다. 

그 이유는 Entity마다 not null 등 사양이 다를 수 있기 때문이다.

참고로 Front-End개발자는 어떤 컬럼에 Validation이 걸려있는지 모를수가 있으니 주의해야 한다.

 

Member.java

package com.jpabook.domain;



import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import javax.validation.constraints.NotEmpty;
import java.util.ArrayList;
import java.util.List;

@Entity
@Getter @Setter
public class Member {

    @Id @GeneratedValue
    @Column(name = "member_id")
    private Long id;

    private String name;

    @Embedded //내장타입
    private Address address;

    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();

}

댓글

Designed by JB FACTORY