Inflearn brand logo image

인프런 커뮤니티 질문&답변

정혜민님의 프로필 이미지
정혜민

작성한 질문수

코틀린 함수형 프로그래밍 - 입문편

4_코틀린 제너릭과 타입 파라미터

API 응답 처리 커스터마이징 vs Result 클래스 활용의 차이

작성

·

78

1

안녕하세요! 제네릭 활용 실사례 학습 자료 중 API 응답 처리에 대한 내용이 있어서 질문드립니다.

API 응답 처리 시 ApiResponse<out T> 와 같은 sealed class를 만들어 커스터마이징하여 사용하는 것이 이점이 있을지, 아니면 이미 코틀린 내장 클래스로 존재하는 Result 클래스 활용하는 것이 나을지 궁금하여 질문드립니다.


sealed class ApiResponse<out T> data class Success<out T> (val data : T, val message : String) : ApiResponse<T>() data class Error(val message : String) : ApiResponse<Nothing>() fun <T> handleResponse(response: ApiResponse<T>) { when (response) { is Success -> println("Success: ${response.message}") is Error -> println("Error: ${response.message}") } }
위처럼 커스텀하면 장점은 클라이언트 측과 통신할 때 서로 합의한 방식과 원하는 데이터를 자유롭게 전달할 수 있다는 장점이 있지만 Result에서 제공하는 함수형 메서드(fold,map등)를 활용하지 못하는 단점이 있다고 생각합니다. 반대로 Result를 사용하면 제공되는 함수형 메서드도 활용할 수 있지만, 응답 json을 커스터마이징 할 수 없다는 단점이 있습니다.

이처럼 각자의 장단점이 있다보니, 장점을 모두 사용할 수 있도록 서비스 계층에서 Result를 반환하고 이를 컨트롤러에서 ApiResponse로 타입 변경하는 것은 어떤가요? 함수형 프로그래밍에 위반하진 않는지 궁금합니다.

둘을 혼합해서 사용하는 것이 최선인지,, 각각 상황에 맞춰 써야하는 것인지 잘 느낌이 오지 않아 질문드립니다!

답변 2

0

양세열님의 프로필 이미지
양세열
지식공유자

안녕하세요. heym5019님, 흥미로운 질문 감사드립니다 😄

ApiResponse 같은 클래스는 외부로의 응답을 줄 때 사용하는 클래스로 목적이 명확하기 때문에 다양한 기능이 그렇게 필요하진 않습니다. 여러 기능을 가진 클래스도 편리할 수 있으나, 그로 인해 유지보수성이 떨어질 수 있어 SRP(단일책임원칙)을 지키는 것이 중요합니다. 즉, 외부 응답 생성에 집중하는 편이 더 바람직합니다. 이런 경우엔 map이나 fold와 같은 기능을 활용할 일이 거의 없습니다.

코틀린의 Result 클래스는 저도 잠시 사용했습니다. 다만 여러 기능적 제약 때문에 이런저런 확장함수를 붙이다 보니, '이럴 거면 차라리 직접 만들어 쓰는 게 낫겠다' 라는 결론에 이르렀습니다. 처음에는 SampleResult 같은 클래스를 만들어 사용했지만, 실패 시에 Throwable만 담을 수 있는 부분이 불편하여 SampleEither와 같은 클래스로 전환했고, 현재는 Kotlin Arrow 라이브러리의 Either를 주로 활용하고 있습니다. 물론 필요에 따라 여기에도 확장함수를 추가해 사용합니다.

결론적으로, 말씀하신 것처럼 각 클래스는 용도에 맞게 사용하시는 것이 좋습니다. Result는 내장된 것을 활용해보시거나, 프로젝트 요구사항에 맞게 직접 구현해보시는 것도 좋은 경험이 될 것입니다.

좋은 질문 주셔서 감사합니다! :)

0

안녕하세요, 인프런 AI 인턴입니다.

hyem5019님, API 응답 처리 시 커스텀 클래스인 ApiResponse와 코틀린의 Result 클래스를 사용하는 것에 대한 질문을 주셨네요. 말씀하신 것처럼 두 접근법 모두 각자의 장단점이 있습니다.

  1. ApiResponse 클래스의 장점:

    • 커스터마이징 가능: ApiResponse는 API가 제공하는 응답을 세부적으로 다루고 클라이언트와의 계약을 명확히 할 수 있어, 클라이언트와의 통신에서 더욱 유연한 처리가 가능합니다.
    • 확장 가능: 성공 응답 또는 오류 응답 외에, 예를 들어 로딩 상태 등의 추가적인 상태를 표현할 수 있도록 확장이 가능합니다.
  2. Result 클래스의 장점:

    • 제공되는 함수형 메서드 활용: Result 클래스는 fold, map과 같은 함수형 메서드를 제공하여, 응답 처리 로직을 간결하고 직관적으로 작성할 수 있습니다.
    • 코틀린 표준 라이브러리의 다양한 기능을 활용할 수 있습니다.

두 접근법을 섞어서 사용하는 것이 좋을지에 대한 의문에 관해서는, 서비스 계층에서 Result를 반환하고 컨트롤러에서 ApiResponse로 타입을 변경하는 방법은 합리적인 선택일 수 있습니다. 이는 함수형 프로그래밍 원칙을 위반하지 않으며, 서비스 계층에서 함수형 메서드를 적극 활용하다가, 최종적으로 클라이언트와의 통신에서 명확하고 커스터마이징된 응답을 생성하도록 합니다.

상황에 맞춰 두 방법을 혼합 사용하는 것이 유연성을 줄 수 있지만, 프로젝트의 요구사항이나 팀의 합의에 따라 결정하는 것이 중요합니다. 상황에 맞춰 적절한 방법을 선택하여 사용하시면 됩니다.

더 궁금한 점이 있으면 언제든지 질문해 주세요! 링크를 통해 더 많은 정보를 참고하실 수 있습니다:
- Kotlin Nullability
- Repository Methods in Spring Data

정혜민님의 프로필 이미지
정혜민

작성한 질문수

질문하기