old/Javascript

[JQuery/ajax]비동기 검색제시어 기능/검색 API 활용

뒷골목프로그래머 2020. 1. 21. 02:05
반응형

안녕하세요. 글쓰는 개발자입니다.

오늘은 업무 중에 활용했던,

커리어넷 OPEN API 센터의 학교명 검색 기능을 활용해서

비동기 검색제시어 기능을 구현한 것을 간단하게 소개하려고 합니다.

동기, 비동기 방식에 대한 자세한 설명이 필요할 것 같지만, 다른 포스팅에서 다루도록 하고

기능구현만 간단히 소개하겠습니다.

 

1. 검색제시어 기능

   다양한 포털사이트에서 검색을 하실 경우 아래에 유사한 검색어들이 제시되는 것들을

   보셨을 것입니다. 그것이 바로 검색제시어 기능입니다.

   비동기 방식이기 때문에 검색어가 변경될 때 마다 매번 새로고침 되지않고

   제시어만 계속 바뀌게 됩니다

 

검색제시어 기능 예시(Google 검색)

 

2. 기능 구현

    커리어넷의 OPEN API를 예시로 들었지만, DB에서 불러온 값들을 활용하셔도 됩니다.

    1) html

        간단하게 검색어를 입력받고 제시어가 나타날 <ul>영역을 만들었습니다.

<input type = "text" id="word" placeholder="검색어를 입력하세요." onkeyup="search(this);"><button type="button" id="btn_search">Search</button>
<ul id="schoolList"></ul> <!-- 검색리스트가 나타나는 영역 -->

    2) script

        입력받은 값을 URI 인코딩을 거쳐, ajax 내부의 url에 삽입한 후 실시간으로 data를 받아와서

        append()를 활용해 제시어를 나타냅니다.

 

        (1) onkeyup

              input tag에 text가 keyup될 때 마다 search function을 호출하고 입력값을 전달합니다.

        (2) encodeURI()

              인터넷 주소에서 사용하는 :, ;, /, =, ?, & 등을 제외하고 인코딩하는 함수입니다.

<script>
    
        function search(target){

            var word = target.value;
            var encodeWord = encodeURI(word);
            console.log(word);
            console.log(encodeWord);
            
            //start Ajax
            $.ajax({
               type : 'GET',
               dataType : 'json',
               url : "http://www.career.go.kr/cnet/openapi/getOpenApi?"
                      +"apiKey=본인의appKey(회원가입 후 승인받아야함)"
                      +"&svcType=api&svcCode=SCHOOL&contentType=json&gubun=elem_list"
                      +"&searchSchulNm="+word,
               error : function(err) {
                  console.log("실행중 오류가 발생하였습니다.");
               },
               success : function(data) {

                  console.log("data확인 : "+data);
                  console.log("결과 갯수 : "+data.dataSearch.content.length);
                  console.log("첫번째 결과 : "+data.dataSearch.content[0]);
                  $("#schoolList").empty();
                  var checkWord = $("#word").val(); //검색어 입력값
                  console.log(data.dataSearch.content.length);
                  if(checkWord.length > 0 && data.dataSearch.content.length > 0){
                     
                     for (i = 0; i < data.dataSearch.content.length; i++) {
   
                        $("#schoolList")
                              .append(
                                    "<li class='schoolList' value='"
                                          + data.dataSearch.content[i].schoolName
                                          + "' data-input='"
                                          + data.dataSearch.content[i].schoolName
                                          + ">"
                                          + "<a href='javascript:void(0);'>"
                                          + data.dataSearch.content[i].schoolName
                                          + "</a>"
                                          + "</li>");
   
                     }

                  }
                  
                                    
               }
            });//end Ajax

        }


    
    
    </script>

 

3) 전체코드 및 실행결과

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
    
    <input type = "text" id="word" placeholder="검색어를 입력하세요." onkeyup="search(this);"><button type="button" id="btn_search">Search</button>
    <ul id="schoolList"></ul> <!-- 검색리스트가 나타나는 영역 -->

    <script>
    
        function search(target){

            var word = target.value;
            var encodeWord = encodeURI(word);
            console.log(word);
            console.log(encodeWord);
            
            //start Ajax
            $.ajax({
               type : 'GET',
               dataType : 'json',
               url : "http://www.career.go.kr/cnet/openapi/getOpenApi?"
                    +"apiKey=본인의appKey(회원가입 후 승인받아야함)="
                    +"api&svcCode=SCHOOL&contentType=json&gubun=elem_list"
                    +"&searchSchulNm="+word,
               error : function(err) {
                  console.log("실행중 오류가 발생하였습니다.");
               },
               success : function(data) {

                  console.log("data확인 : "+data);
                  console.log("결과 갯수 : "+data.dataSearch.content.length);
                  console.log("첫번째 결과 : "+data.dataSearch.content[0]);
                  $("#schoolList").empty();
                  var checkWord = $("#word").val(); //검색어 입력값
                  console.log(data.dataSearch.content.length);
                  if(checkWord.length > 0 && data.dataSearch.content.length > 0){
                     
                     for (i = 0; i < data.dataSearch.content.length; i++) {
   
                        $("#schoolList")
                              .append(
                                    "<li class='schoolList' value='"
                                          + data.dataSearch.content[i].schoolName
                                          + "' data-input='"
                                          + data.dataSearch.content[i].schoolName
                                          + ">"
                                          + "<a href='javascript:void(0);'>"
                                          + data.dataSearch.content[i].schoolName
                                          + "</a>"
                                          + "</li>");
   
                     }

                  }
                  
                                    
               }
            });//end Ajax

        }


    
    
    </script>

</body>
</html>

실행결과

반응형