알짜게시판

[PHP] 네이버 검색 Open API

아래 코드는 네이버 검색 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;
}

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

제목 글쓴이 조회 날짜
[PHP] 네이버 검색 Open API 12 3시간 전
[PHP] 네이버 검색광고 키워드 도구 API 검색 13 4시간 전
[MYSQL] MariaDB column_stats 테이블 오류 해결 방법 409 25-12-06
[PHP] PHP-FPM 에러 로그 실시간 모니터링 407 25-12-03
[윈도우] 윈도우11 업데이트 후 네트워크 드라이브 접근 불가 문제 해결 방법 788 25-11-24
[PHP] 다국어 번역 함수 구현 방법 2,842 25-11-08
[워드프레스] "치명적인 오류가 발생했습니다" 디버깅 가이드 13,684 25-10-31
[리눅스] Apache 웹 로그 분석하기 – awk와 GoAccess 활용 18,217 25-10-28
[칼무리] 외부 명령으로 캡처 자동화하기 1 39,730 25-10-14
[윈도우] 윈도11 강제업데이트 피하고 윈도10 계속 쓰기 41,410 25-10-12
[리눅스] PHP 파일 업로드 용량 늘리기 56,312 25-10-03
[HTML] 애드센스 충돌 문제 해결하기 74,318 25-09-20
[파이썬] Python Playwright로 Edge 브라우저 제어하기 76,310 25-09-12
[델파이] TDirectory.Delete 대신 CMD 으로 폴더 삭제 74,720 25-09-10
[윈도우] Chrome 및 Edge를 TLS 1.2 모드로 실행 73,989 25-08-30
[HTML] 애드센스 자동 광고 사용 시 빈 화면이 출력된다면? 158,924 25-06-20
[윈도우] 브라우저 환경설정 추출 145,479 25-06-18
[워드프레스] xmlrpc.php 차단으로 보안 강화하기 136,714 25-06-05
[델파이] 폼이 모니터 한 가운데 있는 경우 자연스럽게 왼쪽으로 이동시키기 134,261 25-05-26
[윈도우] WSH script registration is not valid. 134,438 25-05-23
[워드프레스] 제목 블록 기본값을 H5로 변경하는 방법 115,784 25-05-22
[파이썬] 동영상 특정 영역 모자이크(흐리게) 하기 47,490 25-04-30
[리눅스] 구글 크롬 콘솔 'Attestation check for Topics on' 에러 원인 & 해결방… 60,646 25-04-11
[크롬] 개발자 도구(DevTools)에서 붙여넣기 안될때 73,095 25-03-10
[그누보드] SmartEditor2Skin.html 다운로드 되는 현상 110,720 25-01-08
[윈도우] 네트워크 탐지 115,242 24-12-31
[델파이] TrayIcon 이 흐릿하게 보이는 버그? 수정 128,688 24-12-12
[델파이] 실행 중인 프로세스가 활성 창인지 확인하는 함수 146,004 24-11-02
[델파이] 메세지 다이어그램(Message Dialog) 에 체크박스(CheckBox) 추가 132,946 24-10-30
[그누보드] 부트스트랩 테마 예제로 사용중인 main.php 116,646 24-10-21
[그누보드] 유튜브 스킨 76,018 24-10-14
자기계발주방연구소잡학지식바투어책과지식