์ธํ๋ฐ ๊ฐ์
๐ ์ค์ ! ์คํ๋ง ๋ถํธ์ JPA ํ์ฉ2 - API ๊ฐ๋ฐ๊ณผ ์ฑ๋ฅ ์ต์ ํ
@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. ์ํฐํฐ์ ํ๋ ์ ํ
์ด์
๊ณ์ธต์ ์ํ ๋ก์ง๊ณผ ๊ฒ์ฆ(@NotEmpty)๋ฑ ๋ก์ง ์ถ๊ฐ๋จ
2. ํ ์ํฐํฐ์ ๋ค์ํ ์๊ตฌ์ฌํญ ํฌํจ์ ์ด๋ ค๊ณผ ๋์์ ์ํฐํฐ ๋ณ๊ฒฝ ์, ์์ฒญ๋ API ์คํ์ด ๋ณ๊ฒฝ๋จ
=> API ์์ฒญ ์คํ์ ๋ง์ถฐ์ ๋ณ๋์ dto๋ฅผ ๋ฐ๋ ๊ฒ ์ข๋ค.
@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 {
private String name;
}
๐ก ์ค๋ฌด์์๋ ์ํฐํฐ๋ฅผ API ์คํ์ ๋ ธ์ถํ๋ฉด ์๋๋ค !
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ ๋ณ๊ฒฝ ํ์ธ
jpa:
hibernate:
ddl-auto: none
@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());
}
@Data
@AllArgsConstructor
static class UpdateMemberResponse{
private Long id;
private String name;
}
@GetMapping("/api/v1/members")
public List<Member> membersV1(){
return memberService.findMembers();
}
๐จ๋ฌธ์ ์
1.๊ธฐ๋ณธ์ ์ผ๋ก ์ํฐํฐ์ ๋ชจ๋ ๊ฐ ๋
ธ์ถ
2. ์๋ต ์คํ์ ๋ง์ถ๊ธฐ ์ํด ๋ก์ง ์ถ๊ฐ (@JsonIgnore ๋ฑ)
3. ์ถ๊ฐ๋ก ์ปฌ๋ ์
์ ์ง์ ๋ฐํํ๋ฉด ํญํ API ์คํ์ ๋ณ๊ฒฝํ๊ธฐ ์ด๋ ค์(๋ณ๋์ Result ํด๋์ค ์์ฑ์ผ๋ก ํด๊ฒฐ)
@GetMapping("/api/v2/members")
public Result membersV2() {
List<Member> findMembers = memberService.findMembers();
//์ํฐํฐ -> DTO ๋ณํ
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;
}
=> ์ํฐํฐ๊ฐ ๋ณํด๋ API ์คํ ๋ณ๊ฒฝ X
์ํฐํฐ๋ฅผ ์ธ๋ถ์ ๋ ธ์ถํ์ง ์๊ธฐ
- ์ค๋ฌด์์๋ member ์ํฐํฐ์ ๋ฐ์ดํฐ๊ฐ ํ์ํ API๊ฐ ๊ณ์ ์ฆ๊ฐํ๊ฒ ๋๋ค. ์ด๋ค API๋ name ํ๋๊ฐ ํ์ํ์ง๋ง, ์ด๋ค API๋ name ํ๋๊ฐ ํ์์์ ์ ์๋ค.
=> ๊ฒฐ๋ก ์ ์ผ๋ก ์ํฐํฐ ๋์ ์ API ์คํ์ ๋ง๋ ๋ณ๋์ DTO ๋ ธ์ถ!