해결된 질문
작성
·
359
0
@RestController
@RequiredArgsConstructor
public class MemberApiController {
..
@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;
}
}
일 때,
memberService.join(member); 의 반환 값이
엔티티가 아니고 단순히 Long id인 값인데도
return id; 로 안하고
CreateMemberResponse 클래스를 만들어
return new CreateMemberResponse(id);
로 하는 이유는 뭔가요 ?
처음에는
Long id = memberService.join(member);
return id; 로 했다가
누군가가 inline으로 합쳐버려서
return memberService.join(member);
으로 만들어 버리면
memberService.join의 반환 값이 수정될 때 컴파일이 안뜨고, api에서 스펙이 바뀌어 오류가 생길 가능성이 있어서
컴파일 단계에서 막아버릴려고
CreateMemberResponse 클래스를 만들어
return new CreateMemberResponse(id);
를 해주는 것일까 생각도 들었는데,
inline으로 합쳐버리고 memberService.join의 반환값이 바뀌어도 어차피
@PostMapping("/api/v1/members")
public Long saveMemberV1(@RequestBody @Valid Member member) {
Long id = memberService.join(member);
return id;
}
인 상태에서 inline하는 거니까
public Long saveMemberV1(..) {..} 에서
return값이 Long타입이 아니게 바뀌면 컴파일 뜰 것 같아서 그것도 아닌가 싶기도 하고 ..
유지보수할 때, 추적하기 쉬우려고 그러는 건가 싶기도 하고 ..
갑자기 든 생각인데,
일반적으로는 단순히 id만 반환할 일이 없으니 일반적인 케이스를 생각해 만드신 건가 싶기도 하고..
이 케이스만 예외적으로 Long으로 써도 가능한 건지
궁금합니다 :]
답변 1
4
안녕하세요. relate16님
단순히 long으로 반환하게 되면 클라이언트는 JSON을 받는 것이 아니라 HTTP Body에 단순히 숫자 하나를 받게 됩니다.
CreateMemberResponse로 반환: {"id":10}
Long으로 반환: 10
클라이언트와 서버간에 약속을 하는 것이기 때문에 단순히 Long으로 반환해도 상관은 없지만, HTTP API에서는 데이터 응답을 JSON으로 받는다고 서로 약속을 하기 때문에 JSON으로 내려주는 것이 좋습니다.
감사합니다.
허억 그런 이유가 있었군요.
소중한 지식 감사합니다