기본 콘텐츠로 건너뛰기

자바스크립트 클로저(Closure) 완벽 가이드: 원리부터 jQuery 실전 패턴까지

JAVASCRIPT / ENGINEERING

자바스크립트 클로저(Closure) 완벽 가이드: 원리부터 jQuery 실전 패턴까지

클로저의 핵심 원리인 스코프 체인과 상태 유지를 이해하고, 메모리 누수 방지법과 jQuery 플러그인 확장 등 실무 레거시 코드 분석에 필요한 핵심 패턴을 정리합니다.

1. 클로저(Closure)의 핵심 개념과 원리

자바스크립트에서 클로저는 함수와 그 함수가 선언될 당시의 렉시컬 환경(Lexical Environment)의 조합을 의미합니다. 쉽게 정의하면, 내부 함수가 외부 함수의 변수(스코프)를 기억하고, 외부 함수가 종료된 후에도 계속 접근할 수 있는 메커니즘입니다.

다음은 가장 기본적인 클로저의 형태입니다.

function test(name) {
    var text = name + ' 님';

    // 내부 함수(클로저)가 외부 변수 text를 참조
    var tk = function() {
        console.log(text);
    };

    return tk;
}

var myFunc = test('개발자');
myFunc(); // 출력: "개발자 님"

위 코드에서 test 함수는 실행이 끝났지만, 반환된 tk 함수는 여전히 text 변수를 기억하고 있습니다. 이는 함수가 생성될 때의 스코프 체인을 유지하기 때문입니다.

2. 상태 유지와 캡슐화: 카운터 예제

클로저는 전역 변수를 오염시키지 않고 데이터(상태)를 은닉(Private)하고 유지하는 데 매우 유용합니다. 대표적인 예로 카운터 함수가 있습니다.

function makeCounter() {
    var count = 0; // 은닉된 지역 변수

    return function() {
        count++;
        console.log(count);
        return count;
    };
}

var counter = makeCounter();
counter(); // 1
counter(); // 2

이 패턴을 사용하면 외부에서 count 변수에 직접 접근하거나 수정할 수 없으며, 오직 반환된 함수를 통해서만 제어할 수 있습니다. 이는 모듈 패턴(Module Pattern)의 기초가 됩니다.

3. 메모리 누수(Memory Leak) 관리

과거 IE(Internet Explorer) 환경에서는 클로저와 DOM 요소 간의 순환 참조(Circular Reference)로 인해 심각한 메모리 누수가 발생하곤 했습니다. 현대 브라우저는 가비지 컬렉션(GC) 알고리즘이 개선되어 대부분의 문제를 처리하지만, 엔터프라이즈 환경에서는 여전히 주의가 필요합니다.

메모리 누수 방지를 위한 체크리스트:

  • DOM 요소를 클로저 내부 변수에 불필요하게 오래 저장하지 않습니다.
  • 이벤트 핸들러 사용이 끝나면 반드시 removeEventListener 또는 jQuery의 off()로 해제합니다.
  • 필요 없는 전역 변수 생성을 지양하고, 사용이 끝난 객체는 null을 할당해 참조를 끊습니다.

4. 실전 응용: jQuery 플러그인과 IIFE 패턴

레거시 시스템이나 jQuery 라이브러리 코드에서는 IIFE(즉시 실행 함수)와 클로저를 결합하여 플러그인을 안전하게 확장하는 패턴이 자주 사용됩니다. 외부 변수와의 충돌을 막기 위해 아래와 같은 구조를 가집니다.

4-1. 기존 함수 래핑(Wrapping) 및 확장

다음은 기존 fullCalendar 플러그인의 기능을 유지하면서, 특정 옵션을 강제로 주입하거나 동작을 가로채는 패턴입니다.

(function($) {
    // 1. 원본 함수를 클로저 공간에 백업
    var fullCalendarOrg = $.fn.fullCalendar;

    // 2. 함수 재정의
    $.fn.fullCalendar = function(options) {
        if (typeof options === "object") {
            // 기본 옵션 강제 주입
            options = $.extend(true, options, {
                isRTL: false,
                firstDay: 1
            });
        }

        // 3. 원본 함수 호출 (apply 사용하여 this 컨텍스트 유지)
        var args = Array.prototype.slice.call(arguments, 0);
        return fullCalendarOrg.apply(this, args);
    };
})(jQuery);

이 코드의 핵심은 var fullCalendarOrg 변수입니다. 이 변수는 IIFE 내부(클로저)에 숨겨져 있어 외부에서 접근할 수 없지만, 재정의된 $.fn.fullCalendar 함수 내부에서는 계속 접근하여 원본 기능을 수행할 수 있습니다.

💡 Tip: 이러한 패턴은 React의 HOC(Higher-Order Components)나 데코레이터 패턴과 유사한 목적을 가지며, "기존 코드를 건드리지 않고 기능을 확장"할 때 필수적인 테크닉입니다.

댓글

이 블로그의 인기 게시물

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 (Request Parameter 전체보기)

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 Java Servlet Request Parameter 완전 정복 웹 애플리케이션에서 클라이언트로부터 전달되는 Request Parameter 를 확인하는 것은 필수입니다. 이 글에서는 Java Servlet 과 JSP 에서 GET/POST 요청 파라미터를 전체 출력하고 디버깅하는 방법을 다양한 예제와 함께 소개합니다. 1. 기본 예제: getParameterNames() 사용 Enumeration<String> params = request.getParameterNames(); System.out.println("----------------------------"); while (params.hasMoreElements()){ String name = params.nextElement(); System.out.println(name + " : " + request.getParameter(name)); } System.out.println("----------------------------"); 위 코드는 요청에 포함된 모든 파라미터 이름과 값을 출력하는 기본 방법입니다. 2. HTML Form과 연동 예제 <form action="CheckParamsServlet" method="post"> 이름: <input type="text" name="username"><br> 이메일: <input type="email" name="email"><b...

PostgreSQL 달력(일별,월별)

SQL 팁: GENERATE_SERIES로 일별, 월별 날짜 목록 만들기 SQL 팁: GENERATE_SERIES 로 일별, 월별 날짜 목록 만들기 데이터베이스에서 통계 리포트를 작성하거나 비어있는 날짜 데이터를 채워야 할 때, 특정 기간의 날짜 목록이 필요할 수 있습니다. PostgreSQL과 같은 데이터베이스에서는 GENERATE_SERIES 함수를 사용하여 이 작업을 매우 간단하게 처리할 수 있습니다. 1. 🗓️ 일별 날짜 목록 생성하기 2020년 1월 1일부터 12월 31일까지의 모든 날짜를 '1 day' 간격으로 생성하는 쿼리입니다. WITH date_series AS ( SELECT DATE(GENERATE_SERIES( TO_DATE('2020-01-01', 'YYYY-MM-DD'), TO_DATE('2020-12-31', 'YYYY-MM-DD'), '1 day' )) AS DATE ) SELECT DATE FROM date_series 이 쿼리는 WITH 절(CTE)을 사용하여 date_series 라는 임시 테이블을 만들고, GENERATE_SERIES 함수로 날짜를 채웁니다. 결과 (일별 출력) 2. 📅 월별 날짜 목록 생성하기 동일한 원리로, 간격을 '1 MONTH' 로 변경하면 월별 목록을 생성할 수 있습니다. TO...

CSS로 레이어 팝업 화면 가운데 정렬하는 방법 (top·left·transform 완전 정리)

레이어 팝업 센터 정렬, 이 코드만 알면 끝 (CSS 예제 포함) 이벤트 배너나 공지사항을 띄울 때 레이어 팝업(center 정렬) 을 깔끔하게 잡는 게 생각보다 어렵습니다. 화면 크기가 변해도 가운데에 고정되고, 모바일에서도 자연스럽게 보이게 하려면 position , top , left , transform 을 정확하게 이해해야 합니다. 이 글에서는 아래 내용을 예제로 정리합니다. 레이어 팝업(center 정렬)의 기본 개념 자주 사용하는 position: absolute / fixed 정렬 방식 질문에서 주신 스타일 top: 3.25%; left: 50%; transform: translateX(-50%) 의 의미 실무에서 바로 쓰는 반응형 레이어 팝업 HTML/CSS 예제 1. 레이어 팝업(center 정렬)이란? 레이어 팝업(레이어 팝업창) 은 새 창을 띄우는 것이 아니라, 현재 페이지 위에 div 레이어를 띄워서 공지사항, 광고, 이벤트 등을 보여주는 방식을 말합니다. 검색엔진(SEO) 입장에서도 같은 페이지 안에 HTML이 존재 하기 때문에 팝업 안의 텍스트도 정상적으로 인덱싱될 수 있습니다. 즉, “레이어 팝업 센터 정렬”, “레이어 팝업 만드는 방법”과 같이 관련 키워드를 적절히 넣어주면 검색 노출에 도움이 됩니다. 2. 질문에서 주신 레이어 팝업 스타일 분석 질문에서 주신 스타일은 다음과 같습니다. <div class="layer-popup" style="width:1210px; z-index:9001; position:absolute; top:3.25%; left:50%; transform:translateX(-50%);"> 레이어 팝업 내용 <...