개발에서 트레이드 오프란, 어떤 것을 얻으면 반드시 다른 것을 포기해야 하는 상충 관계를 말합니다. 즉, 모든 걸 다 가질 수 없고 상황에 맞게 무엇을 우선순위에 둘지 선택해야 한다는 개념입니다.
현실의 시스템은 성능, 비용, 유지보수성, 보안, 개발 속도 등 여러 요소가 동시에 존재하는데, 이들이 서로 충돌하는 경우가 많기 때문입니다.
// ✅ 가독성 좋은 코드 (성능은 상대적으로 낮음)
List<String> result = users.stream()
.filter(u -> u.getAge() > 20)
.map(User::getName)
.collect(Collectors.toList());
// ⚡ 성능 최적화 코드 (가독성은 떨어짐)
String[] names = new String[users.size()];
int idx = 0;
for (int i = 0; i < users.size(); i++) {
if (users.get(i).getAge() > 20) {
names[idx++] = users.get(i).getName();
}
}
→ 대부분의 경우 가독성을 선택하고, 병목이 생길 때만 최적화합니다.
사용자 요청
↓
[캐시 hit] → 빠른 응답 (but 오래된 데이터일 수 있음)
[캐시 miss] → DB 조회 → 정확한 데이터 (but 느림)
→ Redis 같은 캐시를 쓸 때 항상 고민하는 문제입니다.
분산 시스템에서 일관성(Consistency) 과 가용성(Availability) 을 동시에 완벽하게 보장할 수 없습니다.
예를 들어, DB 복제(Replication) 환경에서:
// 🚀 빠르게 개발 (유지보수 어려움)
if (type.equals("A")) { ... }
else if (type.equals("B")) { ... }
else if (type.equals("C")) { ... } // 조건 추가될 때마다 수정 필요
// 🛠 유지보수 좋은 설계 (개발 시간이 더 걸림)
// 전략 패턴(Strategy Pattern) 적용
Map<String, Handler> handlers = Map.of(
"A", new AHandler(),
"B", new BHandler()
);
handlers.get(type).handle();
💡 핵심은 "정답은 없다"는 것입니다. 트레이드 오프를 이해한다는 건, 현재 상황에서 어떤 가치를 우선시할지 근거 있게 판단할 수 있다는 의미입니다. 시니어 개발자와 주니어 개발자의 차이 중 하나가 바로 이 트레이드 오프를 얼마나 잘 인식하고 선택하느냐입니다.