• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

return new CreateMemberResponse(id); 필요성

21.09.22 15:31 작성 조회수 309

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으로 내려주는 것이 좋습니다.

감사합니다.

relate16님의 프로필

relate16

질문자

2021.09.22

허억 그런 이유가 있었군요. 

소중한 지식 감사합니다