[JavaScript] AJAX

2024. 10. 10. 16:55JavaScript

다른 웹서버의 데이터를 이용해서 원하는 형식으로

데이터를 한 번 출력해보자.

 

script 코드드 vscode로 작성할 거다.


이미지 출력

<style>
        #root {
            max-width: 1200px;
            display: flex;
            flex-flow: wrap;
            margin: 20px auto;
        }
        .item {
            width: 45%;
            display: flex;
            border: 1px solid black;
            margin: 10px;
            padding: 10px;
        }
        .item img {
            margin-right: 10px;
        }

    </style>

  </head>
  <body>
    <h1>AJAX 화면 구현</h1>
    <hr>

    <div id="root"></div>

    <script>
      //  fetch(콜백형태, 함수 내부에)

      const url = "https://jsonplaceholder.typicode.com/photos";
      
      
      fetch(url)     //  주소로 요청한다
        .then(resp => resp.json())     //  요청에 따른 응답이 오면, 응답을 json 으로 변환   
        .then(json => {                //  json 을 이용하여 다음 내용을 수행
  
          console.log(json);

          const arr = json.slice(0, 50).map(e => {
            delete e.url
            return e
          })

          console.log(arr)

          const root = document.getElementById('root')

          arr.forEach(dto => {
            let tag = ''
            tag += `<div class="item">`
            tag += `    <div class="thumbnailUrl"><img src="${dto.thumbnailUrl}"></div>`
            tag += `    <div>`
            tag += `        <div class="title">${dto.title}</div>`
            tag += `        <div class="id">${dto.id}</div>`
            tag += `        <div class="albumId>${dto.albumId}</div>`
            tag += `    </div>`
            tag += `</div>`

            root.innerHTML += tag
          })

          //    fetch.then() 함수의 콜백에는 반환을 수행하지 않는다
          //    만약, async / await 를 사용하면 반환을 수행할 수 있다 

        });

    </script>
  </body>
</html>

 

결과는 위와 같이 나올 것이다.

style에는 .item에 width를 사용하여, 한 줄ㅇ 나오는 요소의 개수를 정해 줄 수 있다.

 


전체 목록 출력 (페이징)

<style>
        a {
            color: inherit;
            text-decoration: none;
        }
        a:hover {
            text-decoration: underline;
        }
        table {
            border-collapse: collapse;
            margin: auto;
        }
        thead {
            background-color: grey;
            color: white;
        }
        tr {
            border-bottom: 1px solid grey;
        }
        td,th {
            padding: 5px 10px;
        }


    </style>
</head>
<body>
    
    <h1>posts</h1>
    <hr>


    <div id="root">
        <table>
            <thead>
                <tr>
                    <th>번호</th>
                    <th>제목</th>
                </tr>
            </thead>
            <tbody></tbody>
        </table>
    </div>


    <!--
        HTTP 요청 메서드
        
        GET           : select     요청할때 메서드를 지정하지 않으면 기본값은 get       
        POST          : insert
        PUT/PATCH     : update 
        DELETE        : delete

    -->


    <script>
    	 //  다른 서버에있는 데이터를 가져오기 위해 주소를 넣음 
        const url = 'https://jsonplaceholder.typicode.com/posts'   

        fetch(url)
            .then(resp => resp.json()) 
            .then(json => {

                //  console.log(json)   항상 fetch 하고 나서 출력해보기!! 
                //  (내가 가져온 데이터가 무엇인지 알아야 다듬을 수 있음 )
                //  tbody 에 innerHTML 넣어주는 것이 정석임
                const tbody = document.querySelector('#root > table > tbody')  
                const arr = json.toSorted((a, b) => b.id - a.id)    //  정수반환으로 정렬하기 
                                        .slice(0, 20)               //  slice 로 페이징 
                
                arr.forEach(dto => {
                        let tag = ''
                        tag += `<tr>`
                        tag += `    <td>${dto.id}</td>`
                        
                        //	12_post.html?id=${dto.id} : 이때 id 를 같이 넘긴다
                        tag += `    <td><a href="12_post.html?id=${dto.id}">${dto.title}</a></td>`
                        tag += `</tr>`
                        
                        tbody.innerHTML += tag
                })
            })

    </script>
</body>
</html>

 


 

개별 출력

전체 목록 중에서 하나를 선택하면 (a태그를 이용하여 페이지 이동)

이때, id를 받아와서 개별로 출력한다.

<style>
    table {
        border: 2px solid black;
        border-collapse: collapse;
        margin: 10px 0;
    }
    td, th {
        padding: 5px 10px;
    }
    tr {
        border-bottom: 1px solid grey;
    }

</style>

</head>
<body>
    

    <h1>post.html</h1>
    <hr>


    <table>
        <tr>
            <td class="id"></td>
            <td class="title"></td>
        </tr>
        <tr>
            <td class="userId" colspan="2"></td>
        </tr>
        <tr>
           <td colspan="2"><pre class="body"></pre></td>
        </tr>
    </table>

    <div style="display: flex; justify-content: space-between;">
        <div>
            <a href="11_post.html"><button>목록</button></a>
        </div>
        <div></div>
    </div>


    <script>
        //   자바스크립트에서 쿼리스트링 가져오기
        const id = new URLSearchParams(location.search).get('id')       //  위에서 생성한 id 를 
        const url = `https://jsonplaceholder.typicode.com/posts/${id}`  //  쿼리스트링 자리에 넣기 
        //  console.log(url)


        //  async / await 를 활용하여 json 을 반환값으로 받기
        //  비동기 함수를 정의할때 async        
        //  비동기 함수를 호출할때 await   :   주소로 요청을 하고 응답을 받으면 그 응답을 json 객체로 바꿈 (콘솔로그가 안뜬다)
        //  단, await 호출은    javascript 코드의 top-level 에서 호출할 수 없음(그래서, loadHandler() 를 만든 이유) 
        async function loadHandler() {
            const json = await fetch(url)
                        .then(resp => resp.json())
            console.log(json)


        //  json 객체의 변수(필드) 이름과 
        //  HTML element 의 클래스 이름을 맞춰두고 하나씩 대입
            for(let key in json) {      //  key 는 index 역할, index에 접근하려면 for 문의 in 을 사용 
                console.log(key)
                const value = json[key]
                const element = document.querySelector('.' + key)       //  앞에 . 붙이면 class로 불러옴 
                element.innerText = value

            }


        //  불러온 json 객체에서 userId 를 불러와서 username을 작성자 위치에 덮어쓰기
            const username = await fetch('https://jsonplaceholder.typicode.com/users/' + json.userId)
                        .then(resp => resp.json())
                        .then(json => json.username)
        
            document.querySelector('.userId').innerText = username
        }
        window.onload = loadHandler
    </script>
</body>
</html>

 


아직까지는 비동기 함수에 대해서 잘 모르겠다.

수업에서 배운 내용으로 계속 한 번씩 사용해보면서 사용법을 익혀봐야 될 것 같다.

'JavaScript' 카테고리의 다른 글

[JavaScript] hidden 활용  (1) 2024.10.11
[JavaScript] json 화면 구현  (0) 2024.10.10
[JavaScript] Search Filter  (0) 2024.10.10
[JavaScript] ClickEvent  (0) 2024.10.10
[JavaScript] 정렬  (7) 2024.10.09