• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

DTO를 Result<T>에 담아서 반환할 때의 제너릭 표기 여부

23.08.18 23:50 작성 조회수 303

0

안녕하세요

DTO를 직접 반환하지 않고 Result로 감싸서 반환하는 것을 구현하는 도중 궁금한 점이 생겼습니다. 일단 코드는 다음과 같습니다.

/**
 * DTO를 감싸서 반환하는 클래스
 * 반환에 성공하면 status에는 "success", data에는 DTO, error에는 null이 담긴다
 * 예외가 발생하면 status에는 "fail", data에는 null, error에는 errorCode가 담긴다
 */

@NoArgsConstructor
@Getter
public class Result<T> {

    private String status;
    private T data;
    private ErrorDTO error;

    public Result(String status, T data, ErrorDTO error) {
        this.status = status;
        this.data = data;
        this.error = error;
    }

}
    @PostMapping("/save")
    public ResponseEntity<Result<UserDTO>> save(@RequestBody @Validated UserDTO userDTO, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            for (ObjectError error : bindingResult.getAllErrors()) {
                return ResponseEntity.ok().body(ResultUtils.fail(error.getCode(), error.getDefaultMessage()));
            }
        }

        UserDTO savedUserDTO = userService.save(userDTO);
        return ResponseEntity.ok().body(ResultUtils.success(savedUserDTO));
    }
public class ResultUtils {

    private static final String SUCCESS = "success";
    private static final String FAIL = "fail";

    public static <T> Result<T> success(T data) {
        return new Result<>(SUCCESS, data, null);
    }

    // 이 메서드의 제너릭 표기도 어떻게 해야할지...?
    public static Result fail(String errorCode, String message) {
        return new Result(FAIL, null, new ErrorDTO(errorCode, message));
    }

}

이렇듯 예외가 발생한 경우에 data에는 null을 담아서 반환하고 싶으면, 예외 발생 여부에 따라 Result<T>의 T가 userDTO이기도 하고 null의 2가지...? 인 느낌이 드는데 그럼

 public ResponseEntity<Result<UserDTO>> save

처럼 메서드 선언부에서 Result의 제너릭을 표기하는 의미가 있을까요? Result로 적는 것이 좋을지 그래도 userDTO를 명시해 줘야할지가 궁금합니다.

 

추가로 userDTO 단건일시에는 제너릭이 그다지 복잡하지 않지만 만약 DTO에 페이징 기능을 더하여 반환하고자 한다면 Result<Page<UserDTO>> 처럼 제너릭 안에 제너릭이 있게 될텐데 이러한 경우에도 그냥 제너릭을 생략하는 것이 좋을지 궁금합니다!

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.08.20

안녕하세요, 인프런 AI 인턴이에요. DTO를 Result<t>에 담아서 반환하는 경우 제너릭 표기는 필요하지 않습니다. 이미 Result<t> 클래스에서 제너릭 타입 T을 사용하고 있기 때문에, T 자리에 DTO 클래스 타입을 사용하시면 됩니다. 예를 들어, ResponseEntity<result<userdto>>와 같이 DTO 클래스를 T로 지정해주면 됩니다.<br /> 따라서 save 메소드의 반환 타입은 ResponseEntity<result<userdto>>로 지정하면 됩니다.<br /> 결과적으로, 위의 코드에서는 제너릭 표기를 사용하지 않아도 원하는 결과를 얻을 수 있습니다.<br /> 덧붙여 말씀드리자면, Result 클래스 내에서 T 자리에 DTO 클래스 타입을 사용함으로써, 반환되는 데이터 타입이 DTO 클래스인 것을 명시적으로 나타낼 수 있습니다.<br /> 결과적으로 코드의 가독성을 높일 수 있어서 좋은 방법중 하나입니다.<br /> 보다 자세한 내용은 해당 강의의 설명이나 해당하는 프레임워크 또는 라이브러리의 공식 문서를 참고해보시는 것을 추천드립니다. 이렇게 설명하면 도움이 되었으면 좋겠습니다.^^</result<userdto></result<userdto></t></t>