7장: jQuery - JavaScript를 쉽게 사용하기

📋 강의 개요


📚 7.1 jQuery란?

강의 포인트

jQuery의 역할

Vanilla JavaScript  →  복잡하고 길어질 수 있음
jQuery             →  간결하고 쉬움

jQuery를 배워야 하는 이유

  1. 레거시 프로젝트: 많은 기존 프로젝트가 jQuery 사용 중
  2. 빠른 프로토타이핑: 간단한 인터랙션을 빠르게 구현
  3. 플러그인 생태계: 수많은 jQuery 플러그인 존재
  4. 학습 곡선: JavaScript를 배우기 전 입문용으로 좋음

⚠️ 중요한 점

최신 프로젝트에서는?
- React, Vue, Angular 등 모던 프레임워크 사용 추세
- Vanilla JS도 많이 발전하여 jQuery 없이 충분

그럼 왜 배우나?
- 기존 코드 유지보수
- 레거시 시스템 작업
- jQuery 코드 이해 능력

📚 7.2 jQuery 설치 및 사용법

강의 포인트

1. CDN 방식 (권장) ⭐

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>jQuery 예제</title>
</head>
<body>
    <h1 id="title">안녕하세요</h1>
    
    <!-- jQuery CDN - body 끝부분에 추가 -->
    <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
    
    <!-- 내 스크립트 - jQuery 다음에 로드 -->
    <script>
        // jQuery가 로드된 후 실행
        $(document).ready(function() {
            $('#title').css('color', 'red');
        });
    </script>
</body>
</html>

💡 강의 팁:

2. 다운로드 방식

<!-- 다운로드한 파일 사용 -->
<script src="js/jquery-3.7.1.min.js"></script>

장점:

단점:

3. npm 방식 (Node.js 프로젝트)

npm install jquery
// ES6 모듈
import $ from 'jquery';

📚 7.3 $ 기호 - jQuery의 핵심

강의 포인트

$ 기호의 의미

// 이 둘은 완전히 같습니다
jQuery('div');
$('div');

// $는 함수입니다
typeof $;  // "function"

// jQuery 버전 확인
console.log($.fn.jquery);  // "3.7.1"

$ 함수의 다양한 용도

1. 요소 선택

$('div')           // 모든 div 선택
$('.box')          // class="box" 선택
$('#header')       // id="header" 선택

2. HTML 생성

$('<div>')                      // 빈 div 생성
$('<p>안녕</p>')                // p 태그 생성
$('<button>클릭</button>')      // button 생성

3. 문서 준비 이벤트

$(document).ready(function() {
    // DOM이 준비된 후 실행
});

4. jQuery 객체 생성

$(domElement)  // DOM 요소를 jQuery 객체로 변환

📚 7.4 $(document).ready() - 문서 준비 이벤트

강의 포인트

3가지 작성 방법

1. 전체 버전 (권장 - 명확함)

$(document).ready(function() {
    // DOM이 준비된 후 실행될 코드
    console.log('문서 준비 완료!');
    $('#title').css('color', 'red');
});

2. 단축 버전 (많이 사용됨)

$(function() {
    // 동일한 기능
    console.log('문서 준비 완료!');
});

3. ES6 화살표 함수 버전

$(() => {
    // 최신 문법
    console.log('문서 준비 완료!');
});

ready() vs load() 차이

// $(document).ready() - DOM 구조만 로드되면 실행 (빠름!) ⚡
$(document).ready(function() {
    console.log('DOM 준비 완료');
});

// window.onload - 이미지, CSS 등 모든 리소스 로드 후 실행 (느림) 🐢
$(window).on('load', function() {
    console.log('모든 리소스 로드 완료');
});

실행 순서:

1. HTML 파싱 시작
2. DOM 트리 구축 완료 → $(document).ready() 실행 ⚡
3. CSS, 이미지 등 로드 중...
4. 모든 리소스 로드 완료 → window.onload 실행 🐢

📚 7.5 jQuery 선택자

강의 포인트

1. 기본 선택자

// 태그 선택자
$('p')              // 모든 p 태그
$('div')            // 모든 div 태그

// 클래스 선택자
$('.box')           // class="box"
$('.btn-primary')   // class="btn-primary"

// ID 선택자
$('#header')        // id="header"
$('#main-content')  // id="main-content"

// 전체 선택자
$('*')              // 모든 요소

// 다중 선택자
$('h1, h2, h3')     // h1, h2, h3 모두
$('.box, .card')    // .box와 .card 모두

2. 계층 선택자

// 자손 선택자 (모든 하위)
$('div p')          // div 안의 모든 p

// 자식 선택자 (직접 자식만)
$('div > p')        // div의 직접 자식 p만

// 인접 형제
$('h2 + p')         // h2 바로 다음의 p

// 일반 형제
$('h2 ~ p')         // h2 이후의 모든 형제 p

예제로 이해하기:

<div>
    <p>자손 ⭕ 자식 ⭕</p>  <!-- $('div p'), $('div > p') -->
    <section>
        <p>자손 ⭕ 자식 ❌</p>  <!-- $('div p')만 선택 -->
    </section>
</div>

3. 속성 선택자

// 속성 존재
$('[href]')              // href 속성이 있는 요소

// 속성 값 일치
$('[type="text"]')       // type이 "text"
$('[class="box"]')       // class가 정확히 "box"

// 속성 값 시작
$('[href^="https"]')     // https로 시작

// 속성 값 끝
$('[href$=".pdf"]')      // .pdf로 끝남

// 속성 값 포함
$('[class*="btn"]')      // class에 btn 포함

실무 예제:

// 외부 링크에 아이콘 추가
$('a[href^="http"]').addClass('external-link');

// 이메일 링크 스타일
$('a[href^="mailto"]').css('color', 'blue');

// PDF 링크 표시
$('a[href$=".pdf"]').prepend('📄 ');

📚 7.6 필터 선택자 (jQuery 특화)

강의 포인트

위치 기반 필터

// 첫 번째
$('li:first')           // 첫 번째 li
$('p:first')            // 첫 번째 p

// 마지막
$('li:last')            // 마지막 li

// n번째 (0부터 시작!)
$('li:eq(0)')           // 첫 번째 (인덱스 0)
$('li:eq(2)')           // 세 번째 (인덱스 2)

// n번째보다 큰 인덱스
$('li:gt(2)')           // 인덱스 2보다 큰 (3, 4, 5...)

// n번째보다 작은 인덱스
$('li:lt(2)')           // 인덱스 2보다 작은 (0, 1)

// 짝수 (0, 2, 4...)
$('tr:even')            // 짝수 번째 행

// 홀수 (1, 3, 5...)
$('tr:odd')             // 홀수 번째 행

⚠️ 주의:

// :even은 인덱스 0부터 시작이므로
$('tr:even')  // 0, 2, 4번째 = 1, 3, 5번째 행
$('tr:odd')   // 1, 3, 5번째 = 2, 4, 6번째 행

// CSS :nth-child()와 다름!

실무 예제 - 테이블 줄무늬:

// 홀수 행에 배경색
$('table tr:odd').css('background', '#f5f5f5');

// 첫 번째와 마지막에 강조
$('ul li:first').css('font-weight', 'bold');
$('ul li:last').css('color', 'red');

제외 필터

// 특정 요소 제외
$('li:not(.active)')           // active 클래스가 없는 li
$('input:not([type="hidden"])') // hidden이 아닌 input

콘텐츠 기반 필터

// 텍스트 포함
$('div:contains("안녕")')      // "안녕"을 포함하는 div

// 자식이 있는 요소
$('div:has(p)')               // p를 포함하는 div

// 비어있는 요소
$('div:empty')                // 내용이 없는 div

// 부모 요소
$('div:parent')               // 자식이 있는 div

가시성 필터

// 보이는 요소
$('div:visible')              // display:none이 아닌 div

// 숨겨진 요소
$('div:hidden')               // display:none인 div

📚 7.7-7.8 DOM 조작 메소드

강의 포인트

1. 텍스트/HTML 조작

text() - 텍스트 가져오기/설정하기

// Getter - 텍스트 가져오기
let txt = $('#title').text();
console.log(txt);  // "안녕하세요"

// Setter - 텍스트 설정하기
$('#title').text('새로운 텍스트');

// HTML 태그는 문자열로 처리됨
$('#title').text('<strong>굵게</strong>');  // <strong>굵게</strong> 그대로 출력

html() - HTML 가져오기/설정하기

// Getter
let html = $('#content').html();

// Setter
$('#content').html('<strong>굵은 텍스트</strong>');

// HTML 태그가 적용됨
$('#content').html('<p>문단</p>');  // 실제 p 태그로 렌더링

val() - 입력 값 가져오기/설정하기

// input 값 가져오기
let userName = $('#name').val();

// input 값 설정하기
$('#name').val('홍길동');

// select 값
$('#country').val('kr');

// checkbox 값
$('#agree').val();

// 여러 input 값 한번에 설정
$('#name').val('홍길동');
$('#email').val('hong@example.com');

text() vs html() vs val() 비교:

// HTML 구조
<div id="box">안녕하세요</div>
<input id="name" value="홍길동">

// text() - 텍스트만
$('#box').text()        // "안녕하세요"
$('#box').text('Hi')    // 텍스트 변경

// html() - HTML 포함
$('#box').html()                    // "안녕하세요"
$('#box').html('<b>안녕하세요</b>') // HTML 변경

// val() - 입력 값
$('#name').val()        // "홍길동"
$('#name').val('김철수') // 값 변경

2. 요소 추가/삭제

append() - 마지막 자식으로 추가

// 텍스트 추가
$('#list').append('<li>새 항목</li>');

// 여러 개 추가
$('#list').append('<li>항목1</li>')
         .append('<li>항목2</li>');

// 한번에 여러 개
$('#list').append('<li>항목1</li><li>항목2</li>');

prepend() - 첫 번째 자식으로 추가

$('#list').prepend('<li>맨 앞 항목</li>');

after() - 요소 뒤에 추가 (형제로)

$('#title').after('<p>제목 뒤에 추가</p>');

before() - 요소 앞에 추가 (형제로)

$('#title').before('<p>제목 앞에 추가</p>');

append vs after 차이:

<!-- 원본 -->
<div id="box">
    <p>내용</p>
</div>

<!-- append() 사용 -->
<div id="box">
    <p>내용</p>
    <span>추가됨</span>  <!-- 자식으로 추가 -->
</div>

<!-- after() 사용 -->
<div id="box">
    <p>내용</p>
</div>
<span>추가됨</span>  <!-- 형제로 추가 -->

remove() - 요소 제거

// 특정 요소 제거
$('#title').remove();

// 선택자로 제거
$('.box').remove();

// 조건부 제거
$('li:odd').remove();  // 홀수 번째 제거

empty() - 자식 요소만 제거

// 내용물만 비움
$('#box').empty();

// remove vs empty
$('#box').remove();  // #box 자체를 제거
$('#box').empty();   // #box는 남기고 내용만 제거

3. 속성 조작

attr() - 속성 가져오기/설정하기

// Getter
let src = $('img').attr('src');
let href = $('a').attr('href');

// Setter
$('img').attr('src', 'new-image.jpg');
$('a').attr('href', 'https://www.google.com');

// 여러 속성 동시 설정
$('img').attr({
    'src': 'image.jpg',
    'alt': '이미지 설명',
    'width': '300'
});

removeAttr() - 속성 제거

$('img').removeAttr('width');
$('a').removeAttr('target');

addClass() - 클래스 추가

$('.box').addClass('active');
$('.box').addClass('active highlight');  // 여러 개 추가

removeClass() - 클래스 제거

$('.box').removeClass('active');
$('.box').removeClass();  // 모든 클래스 제거

toggleClass() - 클래스 토글

// 있으면 제거, 없으면 추가
$('.box').toggleClass('active');

// 클릭할 때마다 토글
$('.btn').click(function() {
    $(this).toggleClass('active');
});

hasClass() - 클래스 확인

if ($('.box').hasClass('active')) {
    console.log('active 클래스가 있습니다');
}

🎯 Vanilla JS vs jQuery 비교

강의 포인트

예제 1: 요소 선택

// Vanilla JS
document.getElementById('box');
document.querySelector('.box');
document.querySelectorAll('.box');

// jQuery
$('#box');
$('.box');
$('.box');  // 항상 배열 형태로 반환

예제 2: 텍스트 변경

// Vanilla JS
document.getElementById('title').textContent = '새 제목';

// jQuery
$('#title').text('새 제목');

예제 3: 이벤트 핸들링

// Vanilla JS
document.querySelector('.btn').addEventListener('click', function() {
    alert('클릭!');
});

// jQuery
$('.btn').click(function() {
    alert('클릭!');
});

예제 4: 여러 요소에 스타일 적용

// Vanilla JS
let boxes = document.querySelectorAll('.box');
boxes.forEach(function(box) {
    box.style.color = 'red';
});

// jQuery
$('.box').css('color', 'red');  // 한 줄!

예제 5: AJAX

// Vanilla JS
fetch('https://api.example.com/data')
    .then(response => response.json())
    .then(data => console.log(data));

// jQuery
$.get('https://api.example.com/data', function(data) {
    console.log(data);
});

💡 실무 팁

1. 메소드 체이닝 활용

// ❌ 비효율적
$('#box').css('color', 'red');
$('#box').addClass('active');
$('#box').fadeIn();

// ✅ 체이닝 사용
$('#box')
    .css('color', 'red')
    .addClass('active')
    .fadeIn();

2. 변수에 저장 (캐싱)

// ❌ 매번 DOM 검색
$('#box').css('color', 'red');
$('#box').addClass('active');
$('#box').text('내용');

// ✅ 한번만 검색
let $box = $('#box');
$box.css('color', 'red');
$box.addClass('active');
$box.text('내용');

// 💡 jQuery 객체는 변수명 앞에 $를 붙이는 관례

3. 존재 여부 확인

// 요소가 있는지 확인
if ($('#box').length > 0) {
    $('#box').css('color', 'red');
}

// 더 간단하게
if ($('#box').length) {
    $('#box').css('color', 'red');
}

📝 자주하는 실수

실수 1: jQuery 로드 전에 사용

<script>
    $('#title').text('안녕');  // jQuery가 아직 로드 안됨!
</script>
<script src="jquery.js"></script><script src="jquery.js"></script>
<script>
    $(function() {
        $('#title').text('안녕');
    });
</script>

실수 2: $(document).ready() 없이 사용

 $('#title').text('안녕');  // DOM이 아직 준비 안됨!

 $(function() {
    $('#title').text('안녕');  // 안전!
});

실수 3: 선택자 오타

 $('#titel').text('안녕');  // title 오타!
 $('.bxo').css('color', 'red');  // box 오타!

 $('#title').text('안녕');
 $('.box').css('color', 'red');

🎯 강의 진행 팁

1교시: jQuery 소개 (1시간)

2교시: 선택자 (1.5시간)

3교시: DOM 조작 (2시간)

4교시: 종합 실습 (1.5시간)


🎓 다음 단계 예고

7장을 마스터한 후:

  1. 이벤트 핸들링 (click, hover, on)
  2. 효과와 애니메이션 (fadeIn, slideDown)
  3. AJAX ($.ajax, $.get, $.post)

7장 jQuery 기초를 완료했습니다! 다음은 이벤트와 AJAX입니다! 💎