본문 바로가기
JavaScript

[Javascript] 자바스크립트를 활용해서 get/post로 데이터 전달하기

by teamnova 2023. 5. 25.
728x90

안녕하세요 이번 시간에는 자바스크립트 코드를 활용해서 get/post 방식으로 데이터를 보내는 방법을 알아보려 합니다. 보통은 아래와 같이 html 안에서 form 태그 안에 input 태그를 넣어서 전송하는 방법이 주로 쓰이는데요.

 <h1>회원가입</h1>
<form action="http://localhost:3000/" method="GET">
    <label for="id">아이디:</label>
    <input type="text" id="id" name="id"><br><br>
    <label for="pw">비밀번호:</label>
    <input type="text" id="pw" name="pw"><br><br>
    <input type="submit" value="Submit">
</form>

 

같은 방식을 자바스크립트 코드를 통해서도 전송할 수 있습니다. 이렇게 구현할 경우 데이터를 보내는 기능을 함수화하여 재사용성을 높일 수도 있고, 클릭한 ui에 따라 데이터를 다르게 전송할 수도 있습니다. 

특히 서버에서 받아온 데이터를 활용하여 자바스크립트로 동적인 ui를 표시하고, 이 각각의 ui를 클릭하거나 할 때 별개의 get/post 이벤트를 넣고 싶은 경우 유용하게 활용될 수 있습니다.

 

 

예를 들어 서버에서 아래와 같은 데이터를 받아서 자바스크립트로 ui를 렌더링했다고 가정합니다.

const json_data = ["1번 전송", "2번 전송", "3번 전송", "4번 전송", "5번 전송"]
<!DOCTYPE html>
<html>
<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"/> 
</head>
<body>

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

  <script>
    // 받아온 데이터
    const json_data = ["1번 전송", "2번 전송", "3번 전송", "4번 전송", "5번 전송"]

    // ui 렌더링할 div 태그에 변수 할당
    const div = document.getElementById("root");

    // 데이터 개수만큼 렌더링
    for (const block of json_data) {

      // 렌더링할 div 태그 생성
      const content = document.createElement('div')
      
      // div 태그 안에 데이터 이름, 전송버튼 추가
      content.innerHTML = `<div>
                        <span>${block}</span>
                        <button>전송하기</button>
                      </div>`
      
      div.append(content)
    }
  </script>
</body>
</html>

만약 전송하기 버튼을 눌렀을 때 특정 경로로 get/post 요청을 보내고 각 행의 텍스트를 보내게 하고 싶으면 (ex : 첫번째 전송하기 버튼을 클릭할 때는 1번 전송 텍스트가 보내지고 두번째 전송하기 버튼을 클릭할 때는 2번 전송 텍스트를 보내고 싶을 경우) 아래와 같이 별도의 함수로 get/post 요청을 보내는 로직을 만든 뒤, 전송하기 버튼의 클릭 이벤트 발생 시 해당 함수가 실행되게 할 수 있습니다.

 

우선 자바스크립트로 get/post 요청을 보내는 sendData 함수를 만들어줍니다.

// 자바스크립트로 데이터 전송하는 함수
    function sendData(data, data2, url) {
        
    const form = document.createElement('form'); // form 태그 생성
    form.setAttribute('method', 'get'); // 전송 방식 결정 (get or post)
    form.setAttribute('action', url); // 전송할 url 지정

    const data_1 = document.createElement('input'); // input 태그 생성
    data_1.setAttribute('type', 'hidden'); // type = hidden
    data_1.setAttribute('name', 'data1'); // 데이터의 key
    data_1.setAttribute('value', data1); // 데이터의 value (여기서는 data1)

    // 여러 개의 데이터를 보낼 경우 위와 같은 코드 반복
    const data_2 = document.createElement('input');
    data_2.setAttribute('type', 'hidden');
    data_2.setAttribute('name', 'data2');
    data_2.setAttribute('value', data2);

    // form 태그에 input 태그 넣고 summit 가능하게 처리
    form.appendChild(data_1);
    form.appendChild(data_2);
	
    document.body.appendChild(form);

    form.submit();      

    }

위 코드에서는 자바스크립트를 통해 동적으로 form 태그를 생성한 뒤 전송방식, 전송할 경로를 지정합니다.

그 후 input 태그를 생성하여 type : hidden으로 안보이게 처리한 뒤 요청을 보낼 key와 value값을 설정해 줍니다.

마지막으로 form 태그 아래에 input 태그를 넣어줍니다.

 

다음으로는 각 전송하기 버튼을 클릭했을 때 이 함수가 작동하도록 렌더링 되는 부분을 다음과 같이 수정 해줍니다.

for (const block of json_data) {

      // 렌더링할 div 태그 생성
      const content = document.createElement('div')
      
      // div 태그 안에 데이터 이름, 전송버튼 추가
      // span와 button의 id에 json의 key값 부여
      content.innerHTML = `<div>                        
                        <span id = "text_${Object.keys(block)}" >${Object.values(block)}</span>
                        <button id = "${Object.keys(block)}" class = "send_btn">전송하기</button>
                      </div>`
      
      div.append(content)


    }

    // 버튼에 대한 클릭 리스너
    for (const btn of document.querySelectorAll('.send_btn')) {

      btn.addEventListener('click', (e) => {       

        // 클릭한 버튼의 id
        const btn_id = e.target.id;
        // 같은 행의 텍스트 (span 태그)
        const text = document.getElementById("text_"+btn_id);        

        // 클릭한 버튼의 텍스트와 "전송 버튼 클릭"이라는 문자열을 get.php 파일로 전송
        sendData(text.innerHTML, "전송 버튼 클릭", "./get.php");
      })
    }

 먼저 렌더링 된 ui에 고유값을 부여하기 위해 span태그와 button 태그에 json의 key값을 부여합니다.

그리고 전송하기 버튼을 클릭했을 때 그 id를 활용하여 해당 전송하기 버튼과 일치하는 행의 텍스트를 찾아낸 뒤 sendData 함수를 통해 get.php로 get/post 요청을 실행합니다.

 

 

get.php 

전송하기 버튼을 클릭했을 때 전송한 데이터를 확인할 수 있습니다.

<?php echo $_GET['data1']; ?>
<?php echo "\n"; ?>
<?php echo $_GET['data2']; ?>

 

 

결과 영상입니다. 클릭한 버튼에 따라 데이터가 다르게 전송되는 걸 확인할 수 있습니다.

 

 

전체 코드입니다.

<!DOCTYPE html>
<html>
<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"/> 
</head>
<body>

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

  <script>
    // 받아온 데이터
    const json_data = [{1 : "1번 전송"}, {2 : "2번 전송"}, {3 : "3번 전송"}, {4 : "4번 전송"}, {5 : "5번 전송"}]

    // ui 렌더링할 div 태그에 변수 할당
    const div = document.getElementById("root");

    // 데이터 개수만큼 렌더링
    for (const block of json_data) {

      // 렌더링할 div 태그 생성
      const content = document.createElement('div')
      
      // div 태그 안에 데이터 이름, 전송버튼 추가
      // span와 button의 id에 json의 key값 부여
      content.innerHTML = `<div>                        
                        <span id = "text_${Object.keys(block)}" >${Object.values(block)}</span>
                        <button id = "${Object.keys(block)}" class = "send_btn">전송하기</button>
                      </div>`
      
      div.append(content)


    }

    // 버튼에 대한 클릭 리스너
    for (const btn of document.querySelectorAll('.send_btn')) {

      btn.addEventListener('click', (e) => {       

        // 클릭한 버튼의 id
        const btn_id = e.target.id;
        // 같은 행의 텍스트 (span 태그)
        const text = document.getElementById("text_"+btn_id);        

        // 클릭한 버튼의 텍스트와 "전송 버튼 클릭"이라는 문자열을 get.php 파일로 전송

        sendData(text.innerHTML, "전송 버튼 클릭", "./get.php");
      })
    }

    // 자바스크립트로 데이터 전송하는 함수
    function sendData(data1, data2, url) {
        
    const form = document.createElement('form'); // form 태그 생성
    form.setAttribute('method', 'get'); // 전송 방식 결정 (get or post)
    form.setAttribute('action', url); // 전송할 url 지정

    const data_1 = document.createElement('input'); // input 태그 생성
    data_1.setAttribute('type', 'hidden'); // type = hidden
    data_1.setAttribute('name', 'data1'); // 데이터의 key
    data_1.setAttribute('value', data1); // 데이터의 value (여기서는 data1)

    // 여러 개의 데이터를 보낼 경우 위와 같은 코드 반복
    const data_2 = document.createElement('input');
    data_2.setAttribute('type', 'hidden');
    data_2.setAttribute('name', 'data2');
    data_2.setAttribute('value', data2);

    // form 태그에 input 태그 넣고 summit 가능하게 처리
    form.appendChild(data_1);
    form.appendChild(data_2);

    document.body.appendChild(form);

    form.submit();      

    }


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