PHP 코드를 실행하다 보면 갑자기 화면에 노란색 경고 메시지가 떠본 경험이 있을까. 특히 데이터베이스나 외부 API에서 받은 배열 데이터를 처리할 때 자주 마주친다. "PHP Warning: Undefined array key 'user_id'"라는 메시지가 뜰 때, 대부분의 개발자는 일단 작동하니까 넘어가버린다. 다만 이 경고를 무시하면 프로덕션 환경에서 예상 못한 버그를 만나거나, error_reporting 설정에 따라 사이트 전체가 중단될 수도 있다. 이번에는 이 경고가 정확히 뭐길래 발생하는지, 왜 위험한지, 어떻게 완벽하게 막을 수 있는지 정리해서 소개하겠다.

 

배열 키가 없을 때 PHP가 경고하는 이유

PHP는 배열의 존재하지 않는 키에 접근하려고 할 때 E_WARNING을 발생시킨다. 이건 개발자의 실수를 조기에 발견하라고 의도한 설계다. 예를 들어 API 응답이나 폼 입력값이 항상 같은 구조를 가지지 않을 수 있으니까, 존재하지 않는 키를 사용하는 것 자체가 잠재적인 버그 신호인 셈이다. 문제는 PHP 버전에 따라 처리 방식이 달라진다는 것. PHP 7.x에서는 Warning을 띄우고 null 값을 반환하지만, PHP 8.0 이상에서는 좀 더 엄격해졌다. 특히 error_reporting을 E_ALL로 설정하면 개발 환경에서 부담 없지만, 프로덕션 환경에서는 이 경고들이 쌓여서 로그 파일을 부풀린다.

 

배열 키 존재 확인 3가지 방법

배열의 특정 키가 존재하는지 확인하는 방법은 여러 가지인데, 각각 동작이 다르다. isset()은 키가 존재하고 값이 null이 아닐 때만 true를 반환한다. array_key_exists()는 키의 존재 여부만 확인하므로 null 값도 감지한다. in_array()는 값으로 검색하는 방식이라 실제 배열 키 확인과는 다르다. 상황에 맞춰 올바른 함수를 선택해야 한다.

함수 null 값 감지 키 존재만 확인 사용 시기
isset() ❌ null은 false 반환 ✓ 키와 null 체크 동시 값이 있는지 확인할 때
array_key_exists() ✓ null 값도 감지 ✓ 키 존재만 체크 null 값도 포함해서 확인할 때
in_array() ✓ 값으로 검색 ❌ 값 기반 검색 배열 값으로 검색할 때

 

실전 코드 예제

아래는 실제로 많이 마주치는 상황들이다. 외부 API 응답 처리, 폼 입력값 검증, 데이터베이스 결과 처리 등에서 배열 키를 안전하게 접근하는 방법을 보여준다.

예제 1: API 응답 처리 시 배열 키 확인

✗ 잘못된 코드 (경고 발생)

<?php
$response = [
    'status' => 'success',
    'data' => ['name' => 'John']
    // 'error_code' 키가 없음
];

echo $response['error_code']; // PHP Warning: Undefined array key 'error_code'
?>

✓ 올바른 코드 (isset 사용)

<?php
$response = [
    'status' => 'success',
    'data' => ['name' => 'John']
];

if (isset($response['error_code'])) {
    echo $response['error_code'];
} else {
    echo 'No error';
}
?>

결과: "No error" 출력, 경고 없음

예제 2: null 값도 포함해야 할 때 (array_key_exists 사용)

✗ 잘못된 코드 (null 값을 놓침)

<?php
$user = [
    'id' => 1,
    'email' => null, // 명시적으로 null이 설정됨
    'name' => 'Alice'
];

if (isset($user['email'])) {
    // null이라서 실행 안 됨
    echo 'Email: ' . $user['email'];
} else {
    echo 'Email key does not exist';
}
?>

✓ 올바른 코드 (array_key_exists 사용)

<?php
$user = [
    'id' => 1,
    'email' => null,
    'name' => 'Alice'
];

if (array_key_exists('email', $user)) {
    // email 키가 존재하면 null이든 뭐든 실행됨
    echo 'Email key exists with value: ' . var_export($user['email'], true);
} else {
    echo 'Email key does not exist';
}
?>

결과: "Email key exists with value: NULL" 출력

예제 3: Null Coalescing Operator(??) 활용

✗ 삼항 연산자로 길게 쓴 코드

<?php
$config = ['timeout' => 30];

$max_retry = isset($config['max_retry']) ? $config['max_retry'] : 5;
echo $max_retry; // 5 출력
?>

✓ Null Coalescing Operator로 간결하게

<?php
$config = ['timeout' => 30];

$max_retry = $config['max_retry'] ?? 5; // 키가 없으면 5 사용
echo $max_retry; // 5 출력, 경고 없음
?>

결과: "5" 출력, 경고 없음

예제 4: 다차원 배열에서 중첩된 키 확인

✗ 잘못된 코드 (중간에 키가 없으면 크래시)

<?php
$data = [
    'user' => [
        'profile' => ['age' => 25]
        // 'address' 키가 없음
    ]
];

echo $data['user']['address']['street']; // PHP Warning 발생
?>

✓ 올바른 코드 (각 단계별 확인)

<?php
$data = [
    'user' => [
        'profile' => ['age' => 25]
    ]
];

$street = null;
if (isset($data['user']['address']['street'])) {
    $street = $data['user']['address']['street'];
}
echo $street ?? 'No street found'; // "No street found" 출력
?>

결과: "No street found" 출력, 경고 없음

 

주의사항과 흔한 실수

실수 1: isset()과 array_key_exists()를 구분 못 함

isset()은 키가 존재하고 null이 아닐 때만 true를 반환한다. 데이터베이스에서 NULL 값을 가져올 때나 API 응답에 명시적인 null 값이 포함되면 문제가 생긴다. array_key_exists()는 순수하게 키의 존재 여부만 확인한다.

실수 2: in_array()로 배열 키를 확인하려고 함

in_array()는 배열의 값으로 검색한다. 키를 확인하려면 반드시 isset()이나 array_key_exists()를 써야 한다. 특히 "user_id"라는 문자열이 배열 값으로도 들어있으면 오동작한다.

실수 3: 빈 문자열이나 0을 null처럼 취급

isset()은 ''(빈 문자열)이나 0 값도 false로 반환한다. 이런 값들이 실제 데이터라면 array_key_exists()를 써야 한다.

 

프로덕션 환경 설정 팁

로컬 개발 환경에서는 error_reporting을 E_ALL로 설정해서 모든 경고를 보는 게 좋다. 다만 프로덕션 서버에서는 display_errors를 off로 두고 error_log에만 기록하도록 설정한다. 그래도 배열 키 경고가 자주 뜨면 코드 자체를 수정하는 게 맞다. PHP 8.1부터는 "Undefined array key"를 더 엄격하게 다루므로, 일찍부터 습관을 들이면 나중에 버전 업그레이드할 때 고생이 줄어든다.

 

핵심 정리

배열 키 존재 확인은 PHP 코드의 견고성을 결정하는 작은 습관이다. isset()으로 대부분 처리하되, null 값도 포함해야 하면 array_key_exists()를 쓰고, 기본값이 필요하면 Null Coalescing Operator(??)를 활용하자. 이 세 가지를 상황에 맞춰 쓰면 "Undefined array key" 경고는 완벽하게 제거할 수 있다. 이 글의 예제 코드를 프로젝트에 적용하면, 에러 로그가 한결 깔끔해지고 코드 안정성도 한 단계 높아질 것이다.