@Controller @ResponseBody
로 쓰면 됨@RestController
로 쓰면 똑같이 기능! @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;
}
}
@RequestBody
는 json 으로 input 이 들어오면, 해당 내용을 자동으로 Member에 맞게 매핑해주는 역할!!
http://localhost:8080/api/v1/members
로 post 요청을 하게 되면, 값이 반환 되는거 확인 가능!!
@Valid
는 엔티티 속의 @NotEmpty
가 있는 필드가 있는지 확인을 해줌.
Entity 가 Api Controller 의 파라미터로 쓰이는 것은 좋지 않다!
- Entity 내부 코드 자체에 API function 이 섞이고 ( @NotEmpty 같은 )
- Entity 수정에 api도 같이 영향을 받는다.
@PostMapping("/api/v2/members")
public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request){
Member member = new Member();
member.setName(request.name);
Long id = memberService.join(member);
return new CreateMemberResponse(id);
}
@Data
static class CreateMemberRequest {
@NotEmpty
private String name;
}
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();
}
@JsonIgnore
을 넣어주면 된다. (+ 양방향 json 화 무한루프 방지) @GetMapping("/api/v2/members")
public Result memberV2(){
List<Member> findMembers = memberService.findMembers();
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;
}
@AllArgsConstructor
는 class 내부 필드를 생성때 바로 받을 수 있게 해줌.