템플릿 뷰를 반환하는 컨트롤러와 api 방식의 컨트롤러의 패키지를 분리!
-> 예외 처리 방식이 다르기 때문
ex. api 방식은 json 형식으로 응답을 보낸다.
@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;
}
}
}
@RestController
: @Controller
+ @ResponseBody
@ResponseBody
: 데이터를 json, xml로 보낼 때 사용
@RequestBody
: json 데이터를 객체로 변경
@Valid
: javax validation을 체크해준다.
등록 V1은 요청 값으로 Member 엔티티를 직접 받는다.
엔티티에 프레젠테이션 계층을 위한 로직이 추가된다.
public class Member {
@NotEmpty
private String name;
}
엔티티가 변경되면 API 스펙이 변한다.
-> API 요청 스펙에 맞추어 별도의 DTO를 파라미터로 받는다.
@RestController
@RequiredArgsConstructor
public class MemberApiController {
private final MemberService memberService;
@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;
}
@Data
static class CreateMemberResponse {
private Long id;
public CreateMemberResponse(Long id) {
this.id = id;
}
}
}
CreateMemberRequest
를 Member
엔티티 대신에 RequestBody
와 매핑참고 :