해결된 질문
21.09.22 15:31 작성
·
357
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
2021. 09. 22. 19:25
안녕하세요. relate16님
단순히 long으로 반환하게 되면 클라이언트는 JSON을 받는 것이 아니라 HTTP Body에 단순히 숫자 하나를 받게 됩니다.
CreateMemberResponse로 반환: {"id":10}
Long으로 반환: 10
클라이언트와 서버간에 약속을 하는 것이기 때문에 단순히 Long으로 반환해도 상관은 없지만, HTTP API에서는 데이터 응답을 JSON으로 받는다고 서로 약속을 하기 때문에 JSON으로 내려주는 것이 좋습니다.
감사합니다.
2021. 09. 22. 22:31
허억 그런 이유가 있었군요.
소중한 지식 감사합니다