<colbgcolor=#0769ad><colcolor=#fff> 제이쿼리 jQuery |
|
제작자 | 존 레식(John Resig) |
분류 | 자바스크립트 라이브러리 |
출시 | 2006년 8월 26일 |
언어 | JavaScript |
버전 | 3.7.1 (4.0.0 Beta) |
라이선스 | MIT 라이선스 |
링크 |
공식 사이트 jQuery UI jQuery Mobile |
[clearfix]
1. 개요
write less, do more.
HTML 속
클라이언트 사이드
스크립트 언어를 단순화하도록 설계된
브라우저 호환성이 있는
JavaScript
라이브러리이다. 존 레식(John Resig)에 의해
2006년
뉴욕 시 바캠프(Barcamp NYC)에서 공식적으로 소개되었다.JavaScript의 지속적인 개선으로 대부분은 바닐라 JavaScript로 구현할 수 있게 되었고, Virtual DOM을 이용하는 React와 같은 좋은 대안들의 등장 등의 이유로 현재는 출시 초기의 위상에 비하면 입지가 많이 낮아진 상태이다. Template Engine을 활용한 구식 SSR과 함께 사실상 레거시 용도.
2. 특징
jQuery는 다음과 같은 기능을 갖고 있다.- DOM 엘리먼트 선택
- DOM 트래버설 및 수정(CSS 1-3 지원. 기본적인 XPath를 플러그인 형태로 지원)
- 이벤트
- CSS 조작[1]
- 특수효과 및 애니메이션[2]
- AJAX 및 JSON, XML 파싱
- JavaScript 플러그인을 통한 확장성
- 유틸리티 - 브라우저 종류와 버전,[3][4] "each" 함수[5]
기능적으로야 더 좋은 라이브러리들도 많지만, jQuery가 순식간에 업계를 장악한 특장점은 바로 무지하게 쉽고 간편하다는 점이다. 'write less, do more.'가 모토로서 비프로그래머인 웹디자이너들도 어렵지 않게 이해할 수 있을 만큼 쉬운 편이다. DOM 구조와 CSS에 대한 지식만 있다면 애니메이션 같은 건 바로 이해가 가능할 정도다. 실제로 저자인 존 레식은 프로그래머들의 칭찬보다 순수 웹디자이너들의 감사 인사가 더 특별한 기쁨이라고 한다.
출시되었을 당시 좀 더 근본적인 목표는 모든 웹 브라우저에서 동일한 방법으로 자바스크립트를 구현하는 것이었다. 이것은 동시기에 나온 다른 자바스크립트 라이브러리도 마찬가지였다. jQuery가 나왔던 2000년대 중반은 웹 브라우저들간의 자바스크립트 호환성이 낮아서 개발자들이 골치를 썩던 시절이었다[6]. 따라서 라이브러리에서 제공하는 별도의 API를 통해 자바스크립트 코드를 작성하고, 라이브러리에서 이 코드를 사용자들이 접속한 웹 브라우저에 맞게 변환하여 실행하는 여러 라이브러리가 나왔고, 그 중 가장 쉽고 간편한 API 문법을 제공했던 jQuery가 살아남은 것이다.
jQuery는 Behavioral model(행동 모델)에 기초한 아키텍처를 따른다. 특히 jQuery는 메서드 체이닝을 통해 DOM 엘리먼트를 조작한다. 예를 들어 기존에 이렇게 했다면[7],
#!syntax javascript
const textNode = document.querySelector("#textNode");
textNode.style.color = "red";
document.querySelector("#someDiv").appendChild(textNode);
jQuery에선 이렇게 한다. 대신에 속도가 좀 더 느리다. 속도가 느린 이유는 jQuery 라이브러리를 거치면서 브라우저에 맞는 네이티브 자바스크립트로 변환된 뒤 실행되기 때문이다.
#!syntax javascript
$("#textNode").css("color","red").appendTo("#someDiv");
-
$("#textNode")
$라는 함수에 인자로 "#textNode"[8]를 넘겨주겠다는 JavaScript 구문이다. jQuery는 기본적으로 $를 함수 이름으로 사용한다.[9] $() 함수에 인자로 DOM selector를 넣어주면 해당하는 DOM 요소를 찾아 리턴해준다. (정확히는 DOM요소를 0번째로 가진 특정한 배열을 반환하는데, id는 특정한 상황이 아니라면 무리 없이 쓸 수 있지만 여러 개의 class를 한 번에 셀렉팅 할 경우 javascript의 document.getElementsByClassName()를 생각 없이 쓸 때와 같은 상황이 발생한다.)
-
$("...").css("color","red") / $("...").css({"color":"red"})
jQuery의 메소드들은 기본적으로 리턴하는 데이터의 자료형이 jQuery이고, 메소드를 사용할 때는 자료형이 jQuery인 값에 붙여서 호출하도록 설계되어 있다. 즉, $("...")를 호출하여 찾고자 하는 DOM 요소를(여기서는 id가 textNode인 요소) jQuery형으로 리턴받고 .css() 메소드를 호출하여 작업을 수행하는 것. 메소드 이름을 보면 알겠지만 .css("color","red") 메소드는 대상의 css를 변경한다[10]. 그리고 변경한 DOM 요소를 jQuery형으로 리턴한다. 후자의 경우는 JSON 문법으로 여러 속성을 한꺼번에 지정할 때 사용한다.
-
$("...").css("...","...").appendTo("#someDiv") / $("...").css({"...":"..."...}).appendTo("#someDiv")
앞서 .css() 메소드로 색을 바꾸고 리턴한 요소에 .appendTo() 메소드를 적용하는 구문이다. 이게 가능한 이유는 플루언트(Fluent) 인터페이스 때문이다. 메서드의 반환값이 자기 자신의 참조가 되어 무한히 메서드를 이어붙일 수 있는 게 특징.
jQuery는 MIT 허가서와 GPL v2의 듀얼 라이선스를 가진 자유 소프트웨어이다. jQuery의 문법은 코드 보기, 문서 객체 모델 찾기, 애니메이션 만들기, 이벤트 제어, AJAX 개발이 쉽도록 디자인 되었다. 또한, jQuery는 개발자가 플러그인을 개발할 수 있는 기능을 제공한다. 덕분에 수많은 jQuery 플러그인들이 개발되어 있다!
마이크로소프트와 노키아는 자사 플랫폼에 jQuery를 포함하는 계획을 발표한 바 있다. 마이크로소프트는 Visual Studio의 ASP.NET AJAX 프레임워크와 ASP.NET MVC 프레임워크에 적용했고, 노키아는 자사의 런타임 웹 위젯 개발 플랫폼에 통합하였다.
jQuery를 기반으로 하는 라이브러리가 많은데, HTML5 Boilerplate나 트위터 Bootstrap 버전 4 이하[11]도 jQuery 기반으로 작동한다.
jQuery Mobile도 있었는데, 모바일 웹페이지나 HTML5 웹앱 등의 제작에 사용하는 웹 개발 프레임워크다.[12] HTML5 웹앱 프레임워크들이 대개 그렇듯 iOS, 안드로이드는 당연히 지원하고, Windows Phone, 블랙베리, 심비안 등 웬만한 기기는 다 지원했다. 2014년 이후 업데이트 없었고 2018년에 중단되었다. 현재로써는 거의 사양세.
3. 현황
여전히 웹 프론트엔드에서 막강한 영향력을 차지하고 있는 jQuery이지만 최근 웹 개발의 트렌드는 React, Vue.js, Svelte 같은 SPA용 프레임워크나 라이브러리로 옮겨가고 있다. 프레임워크를 통해 컴포넌트, MVC, 양방향 데이터 바인딩 등의 고수준적인 개념을 활용하는 것에 반해 jQuery는 여전히 밑바닥 DOM을 건드리는 데 지나지 않는지라...[13]하지만 프레임워크를 쓰면서도 jQuery의 기능을 사용할 수 있고, 프레임워크가 모든 경우에 정답은 아니기 때문에 jQuery에 대한 수요는 앞으로도 있을 것이다.[14]( 참고) 다만 2000년대 중반 거의 JS가 나온지 5~6년 남짓 된 웹 초창기 시절부터 2010년대 중반까지의 무려 10년간 확고한 위치를 고수했던 관계로 레거시가 많아서 그런 것이지, 현재로써는 신규 프로젝트, 신규 인력만 놓고 본다면 Angular도 한 물 가고 있고, React, Vue.js가 대다수다. 십중팔구 React. 레거시가 많고 아예 자체 프레임워크/라이브러리를 가진 대기업이 아닌 대부분의 중소기업, 스타트업, 중견기업의 신규 웹 프로젝트도 React, Vue.js다. 원티드 또는 로켓펀치의 채용공고나, 오키 등의 개발자 커뮤니티 등을 찾아보면 신규 프로젝트, 신규 인력 기준으로는 React : Vue.js : Angular : 기타 == 5 : 3 : 1 : 1 정도의 비율을 보인다. 구글 검색 통계만 봐도 React가 압도적이다. 리액트 관련 기술문서, 자료의 조회수의 1/3~절반 정도가 Vue.js의 통계와 유사하고, Angular는 1/5정도, jQuery는 10% 정도이다. 물론, 기술문서나 자료를 검색하고 찾아보는 사람들이 전부 해당 스택으로 개발 중이라는 보장은 없고, jQuery는 나온지 15년이나 되었으니 개발자들도 충분히 숙련되고 정석 수준으로 사내 매뉴얼, 각종 도서 등이 정리가 돼서 구글링의 빈도가 줄어드는 효과도 있고 대부분 커뮤니티 등에서 조언을 구해도 "대충 jQuery코드 읽을줄만 알면 된다." 라는 반응이 대부분이다.
아무래도 진부화 및 노후화로 jQuery는 결국 저물 수밖에 없다. 5년이면 강산이 바뀌는 웹이기에 2020년대 중후반만 되어도 레거시 마저 점차 프레임워크/React/ES6 이후의 최신 표준 바닐라 JS로 부분부분 대체되거나 아예 서비스 종료 또는 밑바닥부터 재개발 등의 이유로 사멸할 것이라는 의견도 종종 보인다. 당장 그 대표적인 네이버 포탈마저 일반 JS였다가 jQuery로 바뀌었다가 네이버카페등 일부 서비스에서 Vue.js 를 사용한다.
실제로 jQuery로 짜다가 ECMAScript 6 이상의 표준으로 네이티브 자바스크립트 코딩을 해 보면 예전과 달리 jQuery와 개념이 많이 유사해졌다는 것을 알 수 있다. 자바스크립트가 그 동안 발전이 안 된 것이 아니라서 예전처럼 복잡하게 코딩을 할 필요성이 많이 줄어들었기 때문이다. 단, 이렇게 하려면 Internet Explorer를 과감히 버려야 한다. 인터넷 익스플로러의 가장 최신 버전인 11이 나온 것이 2013년이라서 그 이후에 나온 자바스크립트 표준, 특히 구문을 jQuery와 비슷한 개념으로 짤 수 있는 기능은 지원 안 되는 것 투성이다. 2022년 상반기 부터 정부에서 웹 표준 검사기준 브라우저가 크롬으로 변경됨에 따라 앞으로는 IE 고려를 전혀 하지 않아도 될 것이다.
물론 이렇게 하려면 프론트엔드와 백엔드를 모두 새로 개발하는 프로젝트여야 하며, 백엔드를 기존의 오픈소스 솔루션을 사용한다면 여전히 jQuery가 유효하다. 특히 아직도 많은 점유율을 차지하는 CMS인 워드프레스나 그누보드, XpressEngine 등은 서버에서 프론트엔드(스킨, 테마 등)로 뿌려주는 결과물이 HTML이라 React 같은 것을 사용하기에 곤란한 점이 많다. 프레임워크를 이용한 서버가 아닌 CMS로된 서버들은 코어 소스를 수정하거나 플러그인 등을 사용해서[15] 결과물을 JSON 같은 것으로 오가게 하는 방법이 있지만 사이트를 프레임워크 기반으로 갈아엎어야한다. 물론 NuxtJS 등을 이용하여 SPA를 SSR로 돌린다는 선택지도 있고, 바닐라 JS를 쓰는 방법도 있다. Vue.js의 경우에는 <script> 태그로 인라인 임포트하여 JQuery처럼 페이지 내에서만 사용하는 것도 가능하다. 이는 SPA[16]와 MPA[17], CSR[18] 과 SSR[19]을 혼동하기 때문이다. 물론 대부분의 SPA는 CSR로 작동하고, 대부분의 MPA는 SSR로 작동하지만, 반대로 엮어 쓰는 것도 불가능하진 않기 때문이다. React를 적용하기는 어려운 게 있긴 하지만,
2023년 9월 기준으로 전체 웹 사이트의 77.6%는 jQuery를 사용하고 있다. # 지난 10년간은 국내 기업이 가장 많이 사용하는 오픈소스도 jQuery다.[20]
2021년 하반기 기준, 추세를 보면 JavaScript의 기능 자체가 좋아지면서 jQuery 의존도가 점차 낮아지는 경향이 있다. 차세대 프로젝트로 갈아엎어짐과 동시에 그누보드, XE의 점유율 자체가 낮아진 효과로 보인다. 워드프레스는 SPA 기반 소스가 있다.
4. 여담
- 덕분에 대한민국의 국가기술자격인 웹디자인기능사 실기시험에서 기존에는 애니메이션 효과를 Flash로 주다가 2017년부터는 jQuery로 바꿔서 출제되고 있다. 웹디자인기능사 자격증을 취득하려는 사람들은 의무적으로 jQuery를 사용해서 서브메뉴와 팝업창을 숨겼다 띄웠다 할 줄 알아야 하고, 대형 이미지 슬라이드를 움직일 줄 알아야 하는 것이다.
- 여기저기서 많이 쓰다 보니 JavaScript로 웹 개발을 하는 개발자라면 당연히 jQuery를 쓴다고 생각하는 모양. 실제로도 경험이 부족한 개발자들이 jQuery가 없으면 간단한 DOM 조작도 어려워한다. jQuery는 JavaScript를 편하게 사용할 수 있게 지원하는 라이브러리이지 언어가 아니다! 언제까지나 기초는 JavaScript임을 명심하고 기초를 튼튼히 하자. jQuery만 쓰게 되면 이렇게 된다. 부연설명을 하자면, JavaScript에서 덧셈을 하는 방법을 묻고 있는데 댓글들은 뜬금없이 jQuery 사용하라고, jQuery가 최고라고 찬양하는 상황이고 그런 댓글들에 추천이 달려 있다. “jQuery요법을 썼더니 10kg가 빠졌어요!”라는 말도 하고 맨 밑의 올바른 설명을 한 댓글은 jQuery 사용을 안했다고 비추천이 달려 있다. 다만 답변자들의 평판이 1234, 4321인 걸 보면 알겠지만 웃자고 만들어진 유머짤이며 Stack Overflow 규정 상 이럴 일은 없다.
- 서버 사이드 JavaScript 엔진인 Node.js에서도 jQuery를 사용할 수 있다. 단 Node.js에는 window 전역 객체가 없기 때문에 jsDom이라는 라이브러리를 추가로 설치해야 한다. 역시 DOM 조작에 사용한다. 보통 복잡한 템플릿 코드를 서버 쪽에서 생성하거나 웹 크롤러를 만들 때 사용한다.
- jQuery의 DOM API만을 구현한 cheerio라는 라이브러리도 있다. 이외에도 대부분의 기능을 지원하면서도 훨씬 용량이 작은 Cash와 같은 대체용 라이브러리들이 존재한다.
- 나무위키에서는 the seed 4.12.0(2019년 9월 말 전)까지 jQuery 2.1.4 버전을 사용했다.
- 최신 버전으로 갈수록 구형 브라우저 지원을 위한 레거시 코드를 삭제하여 용량이 작고 속도도 더 빠르다. Internet Explorer 8 이전 버전의 호환이 필요하다면 1.x를 사용해야 한다. 1.x 버전 중에서도 특히 1.9 버전은 하위 호환성이 떨어지는데, 1.9에서 삭제된 것들이 많기 때문이다. 이 때문에 연식이 오래된 툴일 경우에는 호환성 문제 때문에 1.8 버전에서 머무는 경우가 많다. 1.9 버전 이상을 사용하면서 1.8 이하 버전의 호환성을 유지하려면 jQuery Migrate라는 플러그인을 사용하면 된다. 하지만 구형 브라우저는 jQuery뿐만 아니라 HTML5에만 있는 태그와 CSS에서도 문제를 일으키는 데다가[21] 보안 문제 때문에 강제업그레이드가 이루어지며 사용자가 거부할 수 없게 되어 있다.[22] 따라서 2020년 현재는 3.x버전을 쓰는 게 정답이고, 오래된 코드 때문에 하위 호환성을 필요로 한다면 추가로 jQuery Migrate를 같이 쓰면 된다.
[1]
어디까지나 브라우저가 지원하는 것까지만. IE8 이하에서는 죽어라 border-radius 등을 줘도 안먹는다.
[2]
간단한 것만 가능하며 복잡한 애니메이션이 필요하다면 jQuery UI라는 확장기능을 사용해야 한다.
[3]
IE,
모질라 파이어폭스,
오페라,
WebKit 등을 판별할 수 있다. 다만 1.9 버전 이후부터 삭제되었다. 굳이 사용하고 싶다면 jQuery Migrate라는 플러그인을 사용해야 한다. 이 플러그인은 구형 버전에서 지원되었으나 최신 버전에서 삭제된 함수를 사용 가능하게 해 준다.
[4]
삭제되었다기 보다는 플러그인으로 분리되어 나갔다고 보는게 더 옳다. migrate는 말 그대로 삭제된 기능을 되살리는 플러그인이고, 브라우저를 구분해주는 플러그인은 따로 있다. 플러그인으로 분리해 두지 않으면, 메인 jQuery자체가 버전업 되기 전까지는 새로 출시된 브라우저들을 지원할 수 없고, 역으로 브라우저 정보만 업데이트 되고 기능상 변경이 거의 없는데도 메인 버전이 올라가는 사태를 방지하기 위해서 분리되었다고 보는게 옳다.
[5]
배열이나 객체 등의 집합에서 요소를 차례로 훑는다. native JS에서는 "forEach" 함수가 비슷한 역할을 한다.
[6]
특히 표준과 따로 노는 IE가 가장 악명높았다. 이쪽은 아예 명칭부터가 JScript였다. IE가 하도 따로 노는 데다 점유율도 높다 보니 파이어폭스에서도 document.all 같이 IE 전용 문법을 도입할 지경이었다.
[7]
사실 jQuery가 각광을 받았던 2000년대 말~2010년대 초중반 때는 이렇게 쓸 수 없었다. const 는 크롬21(2012년), IE11(2013년) 이상 등에서 지원하며 querySelector 는 IE 8이상에서만 실행됐기 때문에 하위호환성을 위해 쓰기 어려운 getElementsByID 같은 구문을 써야 했다.
[8]
CSS 선택자와 동치이다. 해당 선택자는 HTML 태그 중 id="textNode"라는 값이 있는 맨 첫번째 요소를 가리킨다(id는 HTML 문서 내에서 유일한 값이어야 한다).
[9]
기적의 호이스팅(변수나 함수를 먼저 사용하고 후에 선언문을 추가해도 제대로 돌아간다)이 생겨서 쥐도 새도 모르게 $를 재선언한다면 jQuery.noConflict()를 호출해서 $대신 jQuery()라는 함수를 사용해도 된다. 또한 제이쿼리로 쓰는 모듈을 (function($){○○○○○○})(jQuery)로 감싸기도 한다.
[10]
해당 DOM 요소에 style = "color:red;"를 적용
[11]
버전 5부터는 jQuery가 제외되었다.
[12]
즉, 모바일 웹페이지에서 jQuery를 사용하려면 그냥 jQuery를 사용하는 것이지 jQuery Mobile를 사용하는 것이 아니다.
[13]
ES6등장 이후 DOM을 직접 건드리는 개발 방식은 안티패턴(나쁜패턴)을 양산할 수 있기 때문에 기피되는 분위기이다.
[14]
실제로 전세계 트래픽 상위 1만 개 사이트 중 jQuery 의 점유율은 2020년에도 여전히 과반인 54%나 차지 하고 있다.
[15]
워드프레스는 JSON 형태로만 데이터를 제공하는 Rest API가 있고, 이걸 이용해서
Frontity라는 React 기반 오픈소스 프론트엔드가 있다. 그누보드나 XE 등은 오픈소스임을 이용해서 유저들이 이런저런 시도를 하고 있지만 유의미한 결과물이 나오지 않고 있다.
[16]
Single Page Application. HTML 파일 하나에서 JS로 동적으로 DOM을 변경하여 여러 화면을 지지고 볶는 방식
[17]
Multi Page Application. 화면 하나 또는 여러개를 묶어서 각각의 HTML을 할당하는 방식. 화면 리프레시(깜빡임)가 일어난다. 다만 모달창이나 결제 플러그인 등의 경우는 SPA 방식을 일부 섞어 쓰기도 한다.
[18]
Client Side Rendering. 클라이언트 사이드 렌더링. 화면 요소를 JS를 이용하여 브라우저단에서 그리는 것
[19]
Server Side Rendering. 클라이언트 사이드 렌더링. 화면 요소를 Java, C# 등 다양한 언어의 Templete Engine을 이용하여(Themeleaf, JSP 등) 서버단에서 그리는 것
[20]
국내 기업이 가장 많이 사용하는 오픈소스는 j쿼리, 2021-03-08, 지디넷코리아
[21]
특히 10 버전 이전의
Internet Explorer가 그렇다.
[22]
강제업그레이드를 하는 이유는, 구형 브라우저 취약점이 악용돼 감염된 컴퓨터는
DDoS 봇이나
랜섬웨어의 배포 경유지로 악용돼 남들까지 피해를 입히기 때문이다. 다만 구버전의 OS는 강제 업그레이드에서 비껴가는 경우가 많다. 대표적으로
Windows XP는 IE 8까지만 지원한다.