Sad Puppy 3 '도메인/웹개발' 카테고리의 글 목록 :: 개발자 아지트

쿼리 스트링(Query String)이란?

:웹 주소(URL)의 일부로, 클라이언트에서 특정 페이지나 기능을 요청할 때 추가적인 정보를 서버에 전달하기 위해 사용된다.

URL의 끝에 붙으며, ?로 시작하고 여러 개의 키-값 쌍으로 이루어져 있음.

 

쿼리 스트링이 필요한 상황 예시

: 인터넷 쇼핑몰에서 장난감을 검색하려한다. 이때 필요한 쇼핑몰 웹사이트의 주소는 http://www.toyshop.com이다.

검색어를 입력하고 검색 버튼을 누르면, 웹사이트는 클라이언트가 어떤 장난감을 검색했는지 서버에 알려줘야 한다.

이때 쿼리 스트링이 사용된다. 

 

쿼리 스트링이 사용된 예시 URL

http://www.toyshop.com/search?product=lego&color=red

 

URL 요소별 설명

  • http://www.toyshop.com/search: 기본 URL (검색 페이지)
  • ?: 쿼리 스트링의 시작을 알림
  • product=lego: 첫 번째 키-값 쌍. 키는 product 값은 lego
  • &: 여러 개의 키-값 쌍을 구분하는 구분자
  • color=red: 두 번째 키-값 쌍, 키는 color 값은 red

즉, 이 URL은 "lego"라는 제품과 "red"라는 색상을 검색하겠다는 정보를 서버에 전달한다. 

 

쿼리 스트링은 URL에 포함되어 서버에 전달되며, 서버는 이 정보를 사용해 요청한 데이터를 반환한다. 

이렇게 하면 사용자가 웹사이트에서 원하는 것을 쉽게 찾을 수 있다. 

 

쉽게 기억하는 방법

:쿼리 스트링은 마치 웹 주소에 붙이는 "메모"와 같다. 주소 자체가 어디로 갈지 알려주고, 쿼리 스트링은 그 주소에서 무슨 일을 해야 하는지 더 자세히 알려주는 것이라고 생각하면 편하다. 

  • 기본 주소: 집 주소 (어디로 갈지)
  • 쿼리 스트링: 방문할 때 가져갈 목록 (무엇을 할지)

 

1. CSS 크로스 브라우징 해보기

 

CSS 크로스 브라우징 툴인 autoprefixer(https://autoprefixer.github.io)을 사용해서 CSS가 어떻게 바뀌는지 확인해 본다. 

 

git에 따르면, 이걸 npm으로 설치할 수 있어서 brew, npm, nvm으로 설치하고 cli명령어 쳐서 해봤는데 아무일도 일어나지 않았다. 찾아보니까 html파일안에 css코드가 있는 경우 적용이 안된다. 그래서 html코드랑 css코드를 분리했다. 

 

autoprefixer을 실행해봤다. build라는 폴더가 생기고 그 안에 style.css가 생겼다. 



바로 기존 코드와 새로 생긴 코드를 비교해보겠다. 

적용전



적용후

 

 

 음 일단 내 코드에서는 너무 평이한 기능들만 사용해서인지 22번째줄에 주석 말곤 달라진점이 없다.

다음에 기회가 된다면 다음에 한번 더 써봐야겠다. 

 

 

2. 자바스크립트 크로스 브라우징 해보기 

 

Transpiler를 사용해 보고, 자바스크립트 코드가 어떻게 바뀌는지 확인해보기 

Transpiler는 호환성에 맞게해주는 변환기를 말한다. (compiler 같은 기계임)

 

주로 쓰는 Transpiler는 babel과 TypeScript가 있다. 

 

이번에 나는 Babel을 사용해보겠다. 

 

이것도 html안에 script코드가 있으니 적용이 안돼서 app.js파일로 따로 script코드를 분리해줬다. 

 

babel 명령어를 실행하니 dist라는 폴더가 생기고 안에 app.js가 생겼다. 

 

 

 

바로 코드를 비교해보겠다. 

 

변경전 후 코드 확인해보기 

 

확실히 제대로 바뀌는것 같다. ES6이하로 바뀐것을 확인할 수 있다.

 

 

근데 var 위험하다고 선생님이 쓰지말라고 하셨는데,,

 

 

얘가 템플릿 리터럴도 해제시켜버렸다.

 

 

 

전체 코드 비교해보기 

더보기

 

[기존코드]

// window.onload = function(){ ES6 적용전 코드 
window.onload = () =>{ // ES6 적용 코드 
    // 페이지 로드시 localStorage에서 값을 가져와서 출력 
    // 동일한 기능을 하는 걸 함수로 묶어서 개발하는게 좋다. 
    // 나중에 개발하고나서 코드 리뷰를 하면면서 함수 묶으면 좋음
    try {
        // Array.isArray
        let todo = JSON.parse(localStorage.getItem('todo')) || [];
        let check = 0
        // todo값이 배열인지 아닌지만 확인하는 코드도 추가돼야 할거같음 
        if (Array.isArray(todo) == true){
            // 아래는 배열 순회 코드 
            for(let key in todo){
                // key 의 타입은 String 임 
                if ((typeof todo[key] != "undefined") && (todo[key].length > 0)){
                    if ((typeof todo[key] != "undefined") && (todo[key].length > 0)){
                        check = 0;
                    }else{
                        check = 1;
                    }
                }
            }
            if (check == 0){
                displayArray(todo);
            }else{
                console.error('정상적인 접근이 아닙니다.');
            }
        }else{
            console.error('정상적인 접근이 아닙니다.');
        }
        
    } catch (error) {
        console.error('Error parsing JSON from localStorage:', error.message);
        // 이 경우에는 새로운 배열로 초기화할 수 있음
        let todo = [];
        displayArray(todo);
    }
}

function showValue() {
    let inputValue = document.getElementById('inputData').value;
    console.log('inputValue:', inputValue);
    
    let inputLength = inputValue.length;
    
    // 로컬스토리지에서 'todo' 키로 저장된 배열 가져오기 
    let storedArray = JSON.parse(window.localStorage.getItem('todo')) || [];

    let maxLength = 0;

    storedArray.forEach((item, index, storedArray) => {
        if (maxLength < item.length){
            maxLength = item.length;
            console.log('maxLength: ', maxLength);
        }
    });

    let container = document.querySelector('.container');

    if (inputLength >= maxLength){
        container.style.width = `${80 + (inputLength * 10)}px`;
    }else{
        container.style.width = `${80 + (maxLength * 10)}px`;
    }

    container.style.height = `80 + ${(storedArray.length+1) * 20}px`;
    console.log('storedArray:', storedArray);
    
    // 입력값을 배열에 추가함
    storedArray.push(inputValue)

    // localStorage에 값을 저장 
    window.localStorage.setItem('todo', JSON.stringify(storedArray));

    // 입력 필드 초기화 
    document.getElementById('inputData').value = '';

    // 배열 화면에 출력
    displayArray(storedArray);
}

function displayArray(array){
    console.log('displayArray');
    let list = document.getElementById('todoList');
    list.innerHTML = ''; // 기존 리스트 초기화 

    let maxLength = 0;
    
    for(let i = 0; i < array.length; i++){
        if (maxLength < array[i].length){
            maxLength=array[i].length;
            console.log('maxLength: ', maxLength);
        }
    }
    // css에서 클래스 지정하는 함수 
    let container = document.querySelector('.container');
    
    // 삭제하는 기능

    // 템플릿 리터럴 적용
    container.style.width = `${450 + (maxLength * 10)}px`;
    container.style.height = `${80 + ((array.length+1) * 20)}px`;
    
    console.log('array:', array);

    array.forEach(function(item, index){
        // 새로운 리스트 아이템 생성  
        let listItem = document.createElement('li'); 
        // li를 만들고 이를 참조하는 리스트 생성
        let checkbox = document.createElement('input');
        checkbox.type = "checkbox";
        

        let label = document.createElement('label');
        label.textContent = item;

        let deleteButton = document.createElement('button');
        deleteButton.type = "button";
        deleteButton.classList.add('deleteButton');
        deleteButton.textContent = 'x';
        deleteButton.addEventListener('click', function(){
            deleteValue(index);

        });

        listItem.appendChild(label)
        listItem.appendChild(checkbox)
        listItem.appendChild(deleteButton)
        // 리스트에 추가 
        list.appendChild(listItem);
    });
}

function deleteValue(index){

    console.log('hi', index);
    let storedArray = JSON.parse(window.localStorage.getItem('todo')) || [];
    storedArray.splice(index, 1);
    window.localStorage.setItem('todo', JSON.stringify(storedArray));
    displayArray(storedArray);

}

 

 

[babel을 통해 변경된 코드]

"use strict";

// window.onload = function(){ ES6 적용전 코드 
window.onload = function () {
  // ES6 적용 코드 
  // 페이지 로드시 localStorage에서 값을 가져와서 출력 
  // 동일한 기능을 하는 걸 함수로 묶어서 개발하는게 좋다. 
  // 나중에 개발하고나서 코드 리뷰를 하면면서 함수 묶으면 좋음
  try {
    // Array.isArray
    var todo = JSON.parse(localStorage.getItem('todo')) || [];
    var check = 0;
    // todo값이 배열인지 아닌지만 확인하는 코드도 추가돼야 할거같음 
    if (Array.isArray(todo) == true) {
      // 아래는 배열 순회 코드 
      for (var key in todo) {
        // key 의 타입은 String 임 
        if (typeof todo[key] != "undefined" && todo[key].length > 0) {
          if (typeof todo[key] != "undefined" && todo[key].length > 0) {
            check = 0;
          } else {
            check = 1;
          }
        }
      }
      if (check == 0) {
        displayArray(todo);
      } else {
        console.error('정상적인 접근이 아닙니다.');
      }
    } else {
      console.error('정상적인 접근이 아닙니다.');
    }
  } catch (error) {
    console.error('Error parsing JSON from localStorage:', error.message);
    // 이 경우에는 새로운 배열로 초기화할 수 있음
    var _todo = [];
    displayArray(_todo);
  }
};
function showValue() {
  var inputValue = document.getElementById('inputData').value;
  console.log('inputValue:', inputValue);
  var inputLength = inputValue.length;

  // 로컬스토리지에서 'todo' 키로 저장된 배열 가져오기 
  var storedArray = JSON.parse(window.localStorage.getItem('todo')) || [];
  var maxLength = 0;
  storedArray.forEach(function (item, index, storedArray) {
    if (maxLength < item.length) {
      maxLength = item.length;
      console.log('maxLength: ', maxLength);
    }
  });
  var container = document.querySelector('.container');
  if (inputLength >= maxLength) {
    container.style.width = "".concat(80 + inputLength * 10, "px");
  } else {
    container.style.width = "".concat(80 + maxLength * 10, "px");
  }
  container.style.height = "80 + ".concat((storedArray.length + 1) * 20, "px");
  console.log('storedArray:', storedArray);

  // 입력값을 배열에 추가함
  storedArray.push(inputValue);

  // localStorage에 값을 저장 
  window.localStorage.setItem('todo', JSON.stringify(storedArray));

  // 입력 필드 초기화 
  document.getElementById('inputData').value = '';

  // 배열 화면에 출력
  displayArray(storedArray);
}
function displayArray(array) {
  console.log('displayArray');
  var list = document.getElementById('todoList');
  list.innerHTML = ''; // 기존 리스트 초기화 

  var maxLength = 0;
  for (var i = 0; i < array.length; i++) {
    if (maxLength < array[i].length) {
      maxLength = array[i].length;
      console.log('maxLength: ', maxLength);
    }
  }
  // css에서 클래스 지정하는 함수 
  var container = document.querySelector('.container');

  // 삭제하는 기능

  // 템플릿 리터럴 적용
  container.style.width = "".concat(450 + maxLength * 10, "px");
  container.style.height = "".concat(80 + (array.length + 1) * 20, "px");
  console.log('array:', array);
  array.forEach(function (item, index) {
    // 새로운 리스트 아이템 생성  
    var listItem = document.createElement('li');
    // li를 만들고 이를 참조하는 리스트 생성
    var checkbox = document.createElement('input');
    checkbox.type = "checkbox";
    var label = document.createElement('label');
    label.textContent = item;
    var deleteButton = document.createElement('button');
    deleteButton.type = "button";
    deleteButton.classList.add('deleteButton');
    deleteButton.textContent = 'x';
    deleteButton.addEventListener('click', function () {
      deleteValue(index);
    });
    listItem.appendChild(label);
    listItem.appendChild(checkbox);
    listItem.appendChild(deleteButton);
    // 리스트에 추가 
    list.appendChild(listItem);
  });
}
function deleteValue(index) {
  console.log('hi', index);
  var storedArray = JSON.parse(window.localStorage.getItem('todo')) || [];
  storedArray.splice(index, 1);
  window.localStorage.setItem('todo', JSON.stringify(storedArray));
  displayArray(storedArray);
}

 

 

 

 

 

HTML이 웹 표준에 맞춰 작성 돼있나?

 

웹페이지를 만든후, 배포하기 위해서는 웹 표준검사와 웹접근성 검사가 필요하다. 이를 위해서 아래의 도구를 위해 웹 표준 검사를 해보도록 하겠다. 

 

 

HTML 표준 검사 도구를 활용해 확인 해보기

 

 

 

나도 임시로 만든 html 코드를 넣어봤다. 찾아보니 잘못된 위치에 닫는 코드가 있다고 문제가 된다고 했다.

HTML 표준에 따라 input태그는 자체 닫힘 태그이므로 <input>또는 <input /> 형태로 쓰여야 한다고 한다.
그래서 닫는태그를 아래와 같이 변경후 다시 코드를 체크했다.

 

 

 

다시 돌렸다. 

 

 

다시 좀 찝찝한 결과가 나왔다. 확인해보니 input태그 뒤에 슬래시도 없애도 별 문제가 없다고 한다.

뒤의 슬래시를 제거후 다시 코드를 체그해봤다.

 

결과는 성공이다 ! 

 

 

 

CSS 코드 중 다른 브라우저에서 지원하지 않는 코드가 있는지 확인해보기 

Can I Use 에서 내가 사용한 코드가 어디까지 지원하는지 확인할 수 있다.  

 

Can I use... Support tables for HTML5, CSS3, etc

 

caniuse.com

 

 

 

 

해당 페이지에서 사용하길 원하는 css 기능을 입력해보면된다. (나는 아직 이렇다할 css기능을 사용하지 않아서 별건없다. )

 

 

해당 기능이 이렇게 다양한 브라우저에서 지원하고 있음을 알 수 있다. 

 

 

자바스크립트 코드 중 다른 브라우저에서 지원하지 않는 코드가 있는지 확인해보기 

 

W3Schools.com

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

+ Recent posts