API Null 처리 (데이터 명확성, 클라이언트 부담, 설계 전략)
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
API를 처음 설계할 때 Null 값을 그냥 반환하면 되는 줄 알았습니다. 데이터가 없으면 Null을 보내면 되고, 클라이언트에서 알아서 처리하면 그만이라고 생각했습니다. 그러나 프로젝트에서 클라이언트 개발자들과 협업하면서 제 생각이 얼마나 단순했는지 깨닫게 됐습니다. Null 하나 때문에 클라이언트 코드가 복잡해지고, 예외 처리가 늘어나고, 심지어 앱이 크래시 나는 상황까지 발생했습니다. 이후 팀 내에서 Null 처리 정책을 정비하면서 이게 단순한 기술적 선택이 아니라 데이터 의미 전달과 사용성을 모두 고려해야 하는 설계 판단이라는 걸 배웠습니다.
데이터 명확성
API 응답에서 Null 값을 사용하는 가장 큰 이유는 데이터 상태를 명확하게 표현하기 위해서입니다. 예를 들어 사용자 프로필 API에서 전화번호 필드가 있다고 가정해보겠습니다. 이 필드가 응답에 아예 포함되지 않으면 클라이언트 입장에서는 "전화번호를 입력하지 않은 건가", "API 버전이 달라서 누락된 건가", "서버 오류로 빠진 건가" 판단하기 어렵습니다. 하지만 필드는 존재하되 값이 Null이면 "이 사용자는 전화번호를 등록하지 않았다"는 의미가 명확하게 전달됩니다.
사용자 프로필 API에서 일부 선택 항목들은 값이 없을 경우 필드 자체를 응답에서 제외했었는데, 이 방식이 클라이언트 개발자들에게 혼란을 줬습니다. 특히 조건부 렌더링을 구현할 때 필드 존재 여부를 먼저 확인하고, 값이 있는지 다시 확인하는 이중 체크가 필요했습니다. 이후 모든 필드를 항상 반환하고 값이 없으면 Null을 사용하는 방식으로 변경했더니 클라이언트 코드가 훨씬 단순해졌습니다. 스키마 정의(Schema Definition)도 명확해져서 API 문서 작성이 쉬워졌습니다. 여기서 스키마 정의란 API가 반환할 데이터 구조를 미리 정의해놓은 것으로, 클라이언트 개발자가 어떤 필드가 올지 예측할 수 있게 해주는 설계 명세입니다.
또한 응답 구조의 일관성(Response Consistency)도 중요한 요소입니다. 항상 동일한 필드를 반환하면 클라이언트에서 타입 정의를 한 번만 해두면 되고, API 버전이 바뀌어도 호환성을 유지하기 쉽습니다. 최근 한 연구 보고서(출처: RESTful API 설계 가이드)에 따르면 일관된 응답 구조를 유지하는 API가 클라이언트 통합 시간을 평균 30% 단축시킨다고 합니다.
클라이언트 부담
하지만 Null 값을 반환하는 방식에도 분명한 단점이 있습니다. 바로 클라이언트에서 추가적인 Null 체크 로직을 구현해야 한다는 점입니다. 모든 필드에 대해 값이 Null인지 확인하고, Null인 경우 기본값을 설정하거나 UI를 다르게 렌더링해야 합니다. 특히 중첩된 객체 구조에서는 Null 체크가 여러 단계에 걸쳐 필요하기 때문에 코드가 복잡해집니다.
제 경험상 가장 문제가 됐던 건 일부 필드는 Null을 반환하고, 다른 필드는 아예 제외하는 혼합 방식이었습니다. 사용자 프로필 API에서 닉네임은 Null로 반환되는데 생년월일은 필드 자체가 없는 식이었습니다. 클라이언트 개발자 입장에서는 각 필드마다 다른 처리 로직을 작성해야 했고, 이게 버그의 원인이 됐습니다. 실제로 앱이 특정 상황에서 크래시 나는 문제가 발생했는데, 원인을 추적해보니 Null 체크를 빠뜨린 곳에서 Null Pointer Exception이 발생한 것이었습니다.
이런 문제를 해결하기 위해 팀 내부에서 다음과 같은 정책을 수립했습니다.
- 모든 응답 필드는 항상 포함하고, 값이 없으면 Null을 사용합니다.
- Null이 가능한 필드는 API 문서에 명확히 표기합니다.
- Optional 필드와 Required 필드를 명확히 구분하여 스키마를 작성합니다.
- 클라이언트에서 Null 체크를 강제하도록 타입 시스템을 활용합니다.
이 정책을 적용한 후 클라이언트 코드의 안정성이 크게 개선됐습니다. Null 체크 로직은 여전히 필요했지만, 최소한 예측 가능한 범위 내에서 처리할 수 있게 됐습니다. 또한 새로운 개발자가 팀에 합류했을 때도 API 사용 방법을 빠르게 이해할 수 있었습니다.
설계 전략
결국 Null 처리 전략은 프로젝트의 특성과 팀 상황에 맞춰 결정해야 합니다. 데이터 의미 전달이 중요한 시스템이라면 Null을 적극적으로 사용하는 것이 맞고, 클라이언트 구현 단순화가 우선이라면 Null 필드를 제거하는 방식도 고려할 수 있습니다. 클라이언트 부담이 늘어나더라도 데이터 의미가 명확하면 장기적으로 유지보수가 쉽기 때문입니다.
또 하나 중요한 점은 팀 내부에서 일관된 규칙을 정하고 문서화하는 것입니다. Null 처리 방식이 API마다 다르면 클라이언트 개발자는 매번 다른 방식으로 코드를 작성해야 하고, 이는 버그와 혼란의 원인이 됩니다. API 설계 가이드를 만들고, 코드 리뷰 단계에서 이 규칙이 지켜지는지 확인하는 프로세스가 필요합니다. API 문서에 각 필드의 Nullable 여부를 표시하는 템플릿을 만들어 사용하고 있고, 신규 API를 개발할 때 이 템플릿을 따르도록 강제하고 있습니다.
마지막으로 OpenAPI Specification(OAS) 같은 표준 스펙을 활용하는 것도 좋은 방법입니다. OAS는 API의 구조를 기계가 읽을 수 있는 형태로 정의하는 표준 규격으로, Null 가능 여부도 명시할 수 있습니다. 이를 활용하면 클라이언트 코드를 자동 생성할 때 Null 체크 로직까지 포함시킬 수 있어 개발 효율이 높아집니다. 제가 참여한 최근 프로젝트에서는 OAS로 API를 정의하고, 이를 기반으로 TypeScript 타입을 자동 생성했는데 Null 관련 버그가 눈에 띄게 줄어들었습니다.
Null 처리는 작은 선택처럼 보이지만 실제로는 API 전체의 사용성을 좌우하는 중요한 요소입니다. 정답은 없지만, 프로젝트의 상황과 팀의 역량을 고려해서 가장 적합한 전략을 선택하고, 그 규칙을 일관되게 유지하는 것이 핵심입니다. 여러분의 프로젝트에서는 어떤 방식을 사용하고 계신가요? 혹시 Null 처리로 인해 겪은 문제나 해결 방법이 있다면 공유해주시면 좋겠습니다.
- 공유 링크 만들기
- X
- 이메일
- 기타 앱
댓글
댓글 쓰기