[PHP] 네이버 검색 Open API
- 17:25
- 11 회
- 0 건
아래 코드는 네이버 검색 Open API를 사용해 다양한 검색 엔드포인트에 공통으로 대응할 수 있도록 구성된 PHP 함수 예제이다. 본문에서는 코드의 구조와 동작 원리를 중심으로 설명한다.
목적과 개요
이 구현의 목적은 네이버 검색 Open API를 호출하여 검색 결과를 수집하고, 결과 항목에서 제목과 요약 정보를 정제된 문자열 형태로 반환하는 것이다. 뉴스, 블로그, 카페 등 서로 다른 검색 API 엔드포인트를 하나의 공통 함수로 처리할 수 있도록 설계되어 있다.
API 인증 정보 관리
상단에서는 네이버 Open API 사용을 위한 클라이언트 ID와 클라이언트 시크릿을 상수로 정의한다.
이 값들은 HTTP 요청 헤더에 포함되어 API 호출 시 인증 수단으로 사용된다. 상수로 관리함으로써 코드 전반에서 일관되게 참조할 수 있고, 인증 정보 변경 시 수정 범위를 최소화할 수 있다.
공통 검색 함수의 역할
검색 로직은 하나의 함수로 캡슐화되어 있다. 이 함수는 다음과 같은 역할을 수행한다.
- 검색 엔드포인트를 동적으로 지정
- 검색어와 결과 옵션을 쿼리 파라미터로 구성
- cURL을 이용해 HTTP 요청을 전송
- 응답 상태 코드와 본문을 기반으로 결과를 가공
이 구조를 통해 엔드포인트만 변경하면 동일한 방식으로 여러 검색 API를 호출할 수 있다.
요청 URL과 파라미터 구성
함수 내부에서는 검색 엔드포인트 이름을 기반으로 API 요청 URL을 생성한다.
검색어, 출력 개수, 시작 위치, 정렬 방식은 쿼리 스트링으로 구성되며, 표준 함수로 인코딩되어 URL에 결합된다.
정렬 방식은 최신순으로 고정되어 있어, 시간 기준의 검색 결과를 우선적으로 수집하는 데 초점이 맞춰져 있다.
HTTP 헤더 설정과 요청 전송
인증에 필요한 클라이언트 ID와 시크릿은 HTTP 헤더에 포함된다.
cURL 옵션을 통해 다음 사항이 설정된다.
- 요청 대상 URL
- 인증 헤더
- 응답 데이터를 문자열로 반환하도록 설정
요청이 전송된 이후에는 HTTP 상태 코드를 함께 확인할 수 있도록 처리되어 있다.
응답 처리와 오류 제어
응답이 정상적으로 수신되었는지는 HTTP 상태 코드로 판단한다.
정상 응답인 경우에만 JSON 데이터를 배열로 변환하고, 검색 결과 목록이 존재하는지 확인한다.
이 과정은 API 호출 실패나 예외적인 응답 구조로 인해 발생할 수 있는 오류를 최소화하기 위한 기본적인 방어 로직이다.
검색 결과 데이터 가공
검색 결과 항목에서는 제목과 설명 필드만을 사용한다.
HTML 태그가 포함될 수 있으므로, 태그 제거 처리를 통해 순수 텍스트만 추출한다.
추출된 제목과 설명은 하나의 문자열로 결합되어 배열에 저장되며, 이 배열이 함수의 최종 반환값이 된다.
이를 통해 이후 단계에서 텍스트 분석, 키워드 추출, 로그 저장 등의 작업에 바로 활용할 수 있다.
반환 값의 특징
함수는 검색 결과를 문자열 배열 형태로 반환한다.
각 요소는 개별 검색 결과를 요약한 텍스트 단위이며, API 원본 구조에 의존하지 않도록 단순화되어 있다.
이 방식은 호출부에서 API 스펙을 직접 다루지 않아도 되도록 추상화 수준을 높이는 데 기여한다.
가독성을 높이기 위해 줄바꿈을 자주 활용한다.
해당 코드를 설명하는 블로그 포스팅 글을 작성한다.
코드 자체는 이미 포함되어 있으므로, 본문에서는 코드를 다시 인용하지 않고 동작과 역할 위주로 설명한다.
이모지를 사용하지 않는다.
"매우", "굉장히", "정말로" 등의 표현을 하지 않는다.
기술 문서 스타일로 작성한다.
소제목은 ### 로 시작한다.
// 네이버 검색 API 설정
define('CLIENT_ID', '');
define('CLIENT_SECRET', '');
// 네이버 API 검색 공통 함수
function naver_search($endpoint, $query, $display = 100, $start = 1) {
$url = "https://openapi.naver.com/v1/search/{$endpoint}.json";
$headers = [
"X-Naver-Client-Id: " . CLIENT_ID,
"X-Naver-Client-Secret: " . CLIENT_SECRET
];
$params = http_build_query([
"query" => $query,
"display" => $display,
"start" => $start,
"sort" => "date"
]);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url . '?' . $params);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$list = [];
if ($status == 200) {
$data = json_decode($response, true);
if (isset($data['items'])) {
foreach ($data['items'] as $item) {
$title = strip_tags($item['title']);
$description = strip_tags($item['description']);
$list[] = $title . "\n" . $description;
}
}
}
return $list;
}











로그인 후 댓글내용을 입력해주세요