Skip to content

Commit 30e5127

Browse files
committed
Add post
1 parent 0e87d45 commit 30e5127

File tree

1 file changed

+77
-0
lines changed

1 file changed

+77
-0
lines changed
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
---
2+
layout: post
3+
title: "[ADR][가상] 아키텍처 의사 결정 기록: CI 빌드 시간 단축을 위한 Tuist Cache 활용 방안"
4+
tags: [ADR, iOS, CI, Tuist, Build Cache]
5+
---
6+
{% include JB/setup %}
7+
8+
## 네트워크 응답 처리 방식 개선: 공용 응답 모델 도입
9+
10+
작성일 : 2025-06-02
11+
작성자 : 안정민
12+
13+
<h2 id="status">상태</h2>
14+
15+
* 제안됨(Proposed)
16+
17+
<h2 id="context">배경</h2>
18+
19+
20+
우리 팀은 현재 네트워크 응답을 처리할 때 **API Raw Response를 받은 후 Mapper를 통해 DTO(Data Transfer Object)로 변환하고, 이를 비즈니스 로직에 적용**하는 방식을 사용하고 있습니다. 이 방식은 네트워크 통신 로직과 비즈니스 로직 간의 **관심사 분리**를 명확히 하고, 외부 API 변경 시 **Mapper를 통해 변경 영향을 최소화**하며, 비즈니스 로직 테스트 시 **Mock DTO 활용이 용이**하다는 장점을 가지고 있습니다.
21+
22+
하지만, 우리는 이 방식에서 다음과 같은 문제점들을 발견했습니다.
23+
24+
* **코드 중복 발생**: 많은 경우 API Response 객체와 비즈니스 로직용 DTO 객체가 동일한 필드를 가지고 있어, 유사한 구조의 클래스를 두 번 정의하는 코드 중복이 빈번하게 발생합니다.
25+
* **Mapper 코드 작성 및 유지보수 부담**: 단순 필드 매핑을 위한 반복적인 Mapper 코드 작성이 필요하며, Response나 DTO 변경 시 Mapper 코드 또한 함께 수정해야 하는 번거로움이 있습니다.
26+
27+
이러한 문제점들은 개발 시간 증가와 유지보수 포인트 증가로 이어지고 있습니다.
28+
29+
<h2 id="decisions">결정</h2>
30+
31+
**'공용 응답 모델(Common Response Model)' 도입**을 제안합니다.
32+
33+
<h4 id="rationale">이유</h4>
34+
35+
이 제안의 핵심은 API Response 데이터 구조를 정의하는 타입을 별도의 **공용 모듈/패키지에 정의**하고, **네트워크 모듈과 비즈니스 로직이 이 공용 응답 모델을 직접 공유하고 사용**하도록 하는 것입니다. 이렇게 함으로써 중간 단계의 DTO와 이를 변환하는 Mapper를 생략하여 다음과 같은 이점들을 얻을 수 있습니다.
36+
37+
* **코드 중복 대폭 감소**: Response와 거의 동일한 구조의 DTO를 중복으로 정의할 필요가 없어 코드베이스를 더욱 간결하게 유지할 수 있습니다.
38+
* **Mapper 코드 제거**: 단순 값 복사에 불과했던 Mapper 클래스 및 관련 로직의 작성 및 관리 부담이 해소되어 개발 생산성이 크게 향상될 수 있습니다.
39+
* **개발 생산성 향상**: 새로운 API 연동 또는 기존 API 변경 시 작업 단계가 줄어들고 보일러플레이트 코드 작성 시간이 단축되어 전반적인 개발 속도를 높일 수 있습니다.
40+
* **데이터 모델의 일관성**: API 스펙이 비즈니스 요구사항을 잘 반영하는 경우, 네트워크 경계에서의 데이터 왜곡이나 정보 누락 가능성을 줄여 데이터 모델의 일관성을 유지하는 데 도움이 됩니다.
41+
42+
43+
<h2 id="consequences">결과 및 영향</h2>
44+
45+
'공용 응답 모델' 도입 시 다음과 같은 사항들을 신중히 고려하고, 필요시 이에 대한 대비책을 마련해야 합니다.
46+
47+
* **결합도 증가 가능성**: 비즈니스 로직이 API의 데이터 구조에 직접적으로 의존하게 됩니다. 따라서 API 명세(필드명 변경, 타입 변경, 필드 삭제 등)가 변경되면 해당 '공용 Response 모델'을 사용하는 모든 비즈니스 로직에 직접적인 영향이 미칠 수 있습니다. 이는 Mapper가 제공했던 완충 역할이 사라지기 때문이므로, 이에 대한 대응 방안(예: API 변경 알림 프로세스 강화, 테스트 커버리지 확대) 마련이 필요합니다.
48+
* **비즈니스 로직의 순수성/독립성 저해 가능성**: API 응답에만 존재하는 불필요한 필드나 API 중심의 명명 규칙(예: `user_id` vs `userId`)이 비즈니스 로직에 그대로 노출될 수 있습니다. 이는 비즈니스 관점에서 최적화된 모델을 설계하고 사용할 유연성을 감소시킬 수 있으므로, 공용 모델의 설계에 신중해야 합니다.
49+
* **'공용 응답 모델'의 책임 범위**: 해당 모델은 순수 데이터 구조(POJO, data class 등)여야 하며, 특정 라이브러리(예: JSON 파싱 라이브러리 어노테이션)에 과도하게 의존하지 않도록 주의해야 합니다. 만약 특정 라이브러리에 의존해야 한다면, 해당 라이브러리가 공용 모듈의 일부가 되도록 관리해야 합니다.
50+
* **다양한 API 또는 데이터 소스 관리**: 여러 외부 API를 사용하거나, 동일 API의 여러 버전을 지원해야 할 때, 각기 다른 응답 구조를 모두 '공용'으로 관리하는 것이 오히려 복잡도를 높일 수 있습니다. 따라서 모든 Response가 '공용'으로 적합한지 충분한 검토가 필요합니다.
51+
52+
다음과 같은 긍정적 및 잠재적 부정적 영향이 있을 수 있습니다.
53+
54+
* **긍정적 영향**:
55+
* 코드베이스의 크기가 감소하고, 관련 클래스의 복잡도가 줄어들어 **가독성이 향상**됩니다.
56+
* 신규 API 연동 및 기존 API 변경 시 개발 소요 시간이 단축되어 **개발 생산성이 증가**합니다.
57+
* Mapper 관련 버그 발생 가능성이 줄어듭니다.
58+
* **잠재적 부정적 영향**:
59+
* API 명세 변경 시, 비즈니스 로직 계층까지 직접적인 영향이 파급될 수 있어 **더 광범위한 코드 수정**이 필요할 수 있습니다.
60+
* 초기에는 비즈니스 로직에 API 종속적인 필드가 노출되는 것에 대한 팀원들의 **적응 기간**이 필요할 수 있습니다.
61+
* API 안정성이 보장되지 않거나, 비즈니스 모델과 API 응답 모델 간의 괴리가 큰 경우, 오히려 **복잡도가 증가**할 수 있습니다.
62+
63+
64+
65+
<h2 id="conclusion">결론</h2>
66+
67+
**코드 중복 감소****개발 생산성 향상**이라는 목표를 달성하기 위해 '공용 응답 모델' 도입을 제안합니다. 이 방식은 특히 API 응답 구조가 안정적이고 비즈니스 로직의 데이터 모델과 거의 일치하는 경우에 큰 이점을 제공할 것으로 기대됩니다.
68+
69+
그러나 **결합도 증가****비즈니스 로직의 순수성 저해 가능성**과 같은 잠재적 위험에 대해서는 충분히 인지하고, 이를 관리하기 위한 방안을 함께 마련해야 합니다.
70+
71+
<h2 id="notes">노트</h2>
72+
73+
* **참고 자료**: [네트워크 응답 처리 방식 개선 제안 PPT 초안] (내부 문서 링크 또는 공유 위치)
74+
* **PoC 진행 예정**: 이번 주 내 특정 API 1~2개에 대해 '공용 응답 모델'을 적용하는 PoC(Proof of Concept)를 진행하여 실제 적용 가능성과 영향도를 검증할 예정입니다.
75+
* **추가 논의 필요 사항**:
76+
* 우리 프로젝트의 API 안정성과 변경 빈도를 고려했을 때, 이 방식의 **적용 범위**(전체, 특정 기능, 시범 적용 등)에 대한 구체적인 논의가 필요합니다.
77+
* API 변경 시의 **리스크 관리 방안**(예: API 변경 알림 프로세스, 테스트 전략 강화)에 대한 구체적인 계획 수립이 필요합니다.

0 commit comments

Comments
 (0)