Backend(Framework)/Rust / / 2025. 3. 25. 14:40

[Rust] 응답 객체 패턴: ResponseDto 구현

웹 애플리케이션을 개발할 때 클라이언트에게 일관된 형식의 응답을 제공하는 것은 매우 중요합니다.

 

오늘은 러스트(Rust)에서 이를 구현하는 ResponseDto 패턴에 대해 알아보겠습니다.

 

ResponseDto란 무엇인가?

ResponseDto<T>는 제네릭 타입 파라미터 T를 사용하는 응답 데이터 전송 객체(Data Transfer Object)입니다.
이 패턴은 API 응답 형식을 표준화하여 코드의 일관성을 높이고 클라이언트 측에서의 응답 처리를 단순화합니다.

 

 

먼저 전체 코드를 드리겠습니다. 찬찬히 읽어보고 아래에 세부적인 설명을 보이면 이해가 잘 되실겁니다.

impl<T> ResponseDto<T> {
    pub fn builder() -> ResponseDtoBuilder<T> {
        ResponseDtoBuilder::new()
    }

    pub fn success(data: T) -> Self {
        Self {
            code: "0000".to_string(),
            message: "Success".to_string(),
            data: Some(data),
        }
    }

    pub fn success_with_data(data: T) -> Self {
        Self {
            code: code.into(),
            message: message.into(),
            data: None,
        }
    }

    pub fn error(code: impl Into<String>, message: impl Into<String>) -> Self {
        Self {
            code: code.into(),
            message: message.into(),
            data: None,
        }
    }
}

 

1. builder() 메소드

pub fn builder() -> ResponseDtoBuilder<T> {
    ResponseDtoBuilder::new()
}

 

이 메소드는 빌더 패턴을 구현한 것으로, ResponseDtoBuilder를 반환합니다.
빌더 패턴은 복잡한 객체의 생성 과정을 단순화하고 가독성을 높이는 디자인 패턴입니다.

예를 들면?

let response = ResponseDto::builder()
    .code("0000")
    .message("성공했습니다")
    .data(some_data)
    .build();

 

이렇게 작성 및 사용할 수 있습니다.

 

 

2. success() 메소드

pub fn success(data: T) -> Self {
    Self {
        code: "0000".to_string(),
        message: "Success".to_string(),
        data: Some(data),
    }
}

 

이 메소드는 성공적인 응답을 빠르게 생성하기 위한 편의 메소드입니다.
코드 "0000"과 메시지 "Success"를 자동으로 설정하고, 전달받은 데이터를 포함시킵니다.
이는 성공 응답을 자주 생성해야 하는 경우 코드 반복을 줄여줍니다.

 

사용 예시?

let user_data = get_user_info(user_id);
return ResponseDto::success(user_data);

 

 

 

3. success_with_data() 메소드

pub fn success_with_data(code: impl Into<String>, message: impl Into<String>, data: T) -> Self {
    Self {
        code: code.into(),
        message: message.into(),
        data: Some(data),
    }
}

 

이 메소드는 코드와 메시지를 커스터마이즈하면서도 데이터를 포함하는 성공 응답을 생성할 수 있게 해줍니다.

 

success 메소드와 success_with_data 메소드의 차이

success() 메소드:고정된 성공 코드("0000")와 메시지("Success")를 사용합니다.개발자가 데이터만 전달하면 됩니다.단순한 성공 응답을 빠르게 생성할 때 유용합니다.success_with_data() 메소드:개발자가 코드와 메시지를 직접 지정할 수 있습니다.데이터도 포함합니다.더 세밀한 성공 응답이 필요할 때 유용합니다(예: 다양한 성공 상태를 구분해야 할 때)

 

 

 

4. error() 메소드

pub fn error(code: impl Into<String>, message: impl Into<String>) -> Self {
    Self {
        code: code.into(),
        message: message.into(),
        data: None,
    }
}

 

 

이 메소드는 오류 응답을 생성합니다.
오류 코드와 메시지를 인자로 받아 설정하고, 데이터 필드는 None으로 설정합니다.
impl Into<String>을 사용하여 문자열로 변환 가능한 어떤 타입이든 인자로 받을 수 있게 하였습니다.

 

사용 예시?

return ResponseDto::error("E001", "사용자를 찾을 수 없습니다");
// 또는 에러 코드를 열거형으로 관리하는 경우
return ResponseDto::error(ErrorCode::NotFound, "사용자를 찾을 수 없습니다");

 

 

여기까지고, 이 ResponseDto 패턴은 웹 API에서 일관된 응답 형식을 제공하는 강력한 도구로 사용하고 있습니다.

러스트의 타입 시스템과 제네릭을 활용하여 타입 안정성을 유지하면서도 유연한 응답 생성이 가능합니다. 

이러한 패턴을 통해 클라이언트와 서버 간의 인터페이스를 명확히 하고, 코드의 재사용성과 유지보수성을 높일 수 있습니다.

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유