API 응답 처리 커스터마이징 vs Result 클래스 활용의 차이
143
작성한 질문수 4
안녕하세요! 제네릭 활용 실사례 학습 자료 중 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 클래스를 사용하는 것에 대한 질문을 주셨네요. 말씀하신 것처럼 두 접근법 모두 각자의 장단점이 있습니다.
ApiResponse클래스의 장점:- 커스터마이징 가능:
ApiResponse는 API가 제공하는 응답을 세부적으로 다루고 클라이언트와의 계약을 명확히 할 수 있어, 클라이언트와의 통신에서 더욱 유연한 처리가 가능합니다.
- 확장 가능: 성공 응답 또는 오류 응답 외에, 예를 들어 로딩 상태 등의 추가적인 상태를 표현할 수 있도록 확장이 가능합니다.
- 커스터마이징 가능:
Result클래스의 장점:- 제공되는 함수형 메서드 활용:
Result클래스는 fold, map과 같은 함수형 메서드를 제공하여, 응답 처리 로직을 간결하고 직관적으로 작성할 수 있습니다.
- 코틀린 표준 라이브러리의 다양한 기능을 활용할 수 있습니다.
- 제공되는 함수형 메서드 활용:
두 접근법을 섞어서 사용하는 것이 좋을지에 대한 의문에 관해서는, 서비스 계층에서 Result를 반환하고 컨트롤러에서 ApiResponse로 타입을 변경하는 방법은 합리적인 선택일 수 있습니다. 이는 함수형 프로그래밍 원칙을 위반하지 않으며, 서비스 계층에서 함수형 메서드를 적극 활용하다가, 최종적으로 클라이언트와의 통신에서 명확하고 커스터마이징된 응답을 생성하도록 합니다.
상황에 맞춰 두 방법을 혼합 사용하는 것이 유연성을 줄 수 있지만, 프로젝트의 요구사항이나 팀의 합의에 따라 결정하는 것이 중요합니다. 상황에 맞춰 적절한 방법을 선택하여 사용하시면 됩니다.
더 궁금한 점이 있으면 언제든지 질문해 주세요! 링크를 통해 더 많은 정보를 참고하실 수 있습니다:
- Kotlin Nullability
- Repository Methods in Spring Data
질문있습니다
0
23
1
1번 문제 질문입니다.
0
29
1
음악플레이어 문제 중 코드질문
0
24
1
문제와 풀이4 문제점
0
39
2
문제와 풀이
0
23
1
문제풀이 시간마다 방향성
0
38
2
다양한 관점의 코드 경험을 위해 개선하지 않은 코드
1
47
1
레이어드 아키텍처에서 도메인 중심 패키지 구조를 적용하거나 변화하는 시점이 있을까요?
1
37
2
LobbyUIController의 백키가 사라졌는데 왜그런건가요?
0
39
2
무조건 타이틀 씬부터 시작해야하나요?
0
38
1
9장 상속 문제와 풀이 질문
0
35
1
BaseUI, UIManager
0
48
3
강의가 검은 화면으로 나옵니다.
0
45
1
프로젝트 완성본 문의
0
39
2
섹션 2 퀴즈 9번
0
31
2
질문 디스코드 관련
0
39
1
histories() 응답에 PointHistory.id를 포함한 이유가 궁금합니다/
1
43
2
강의 자료에 사소한 오타가 있습니다.
0
46
2
DI시 eager과 lazy
0
35
2
git 업로드 가능한가요?
0
52
1
문제집 4 퀴즈 4번 질문입니다.
1
81
2
안녕하세요 강사님, discountCache 처리 방식에 대해 질문드립니다.
1
80
1
[문제집] 6_함수를 응답으로 받기 - 1번문제 오류
1
127
1
실습 자료 부분 업로드 다시 부탁드립니다!
1
105
1





