init()과 resize()

Kiyun·2025년 1월 15일

js

목록 보기
20/20

init()과 resize() 의 상관관계

init()resize()는 일반적으로 상관관계가 없지만 특정 상황에서는 함께 사용될 수 있습니다. 둘 다 애플리케이션이나 UI 컴포넌트를 초기화하거나 동작하도록 하는 함수들이지만, 그 목적과 역할은 다릅니다. 그러나 UI 컴포넌트나 화면 크기 변화에 반응해야 하는 웹 애플리케이션에서는 이 두 함수가 서로 보완적인 역할을 할 수 있습니다.

init()과 resize()의 역할

init():

  • 보통 객체나 애플리케이션이 처음 생성될 때 실행되는 함수로, 초기화 작업을 수행합니다.

  • 예를 들어, 데이터를 로드하거나 UI 요소를 설정하는 등의 초기화 작업이 이루어집니다.

  • 애플리케이션이나 컴포넌트의 초기 상태를 설정하는 데 사용됩니다.
    resize():

  • 주로 화면 크기(브라우저 창 크기나 UI 요소의 크기)가 변경될 때 호출됩니다.

  • 화면 크기 변화에 따른 레이아웃 조정이나 스타일 변경을 처리하는 데 사용됩니다.

  • 예를 들어, 창 크기가 변경되었을 때 레이아웃을 재조정하거나, 요소들의 크기를 다시 계산하는 데 사용됩니다.

상관관계가 있는 경우

두 함수는 UI 또는 레이아웃 관련 작업에서 상호작용할 수 있습니다. 예를 들어, 애플리케이션이 처음 로드될 때 init() 함수로 기본 레이아웃을 설정하고, 이후 resize() 함수에서 화면 크기에 따라 레이아웃을 동적으로 조정하는 방식으로 결합될 수 있습니다.

예시: init()resize()를 함께 사용하는 경우

class ResponsiveApp {
    constructor() {
        this.container = document.getElementById('container');
    }

    // 초기화 작업 (init)
    init() {
        console.log('애플리케이션 초기화 중...');
        this.setInitialLayout();
        window.addEventListener('resize', this.handleResize.bind(this));  // 창 크기 변경 시 resize 처리
        console.log('초기화 완료!');
    }

    // 초기 레이아웃 설정 (창 크기에 맞게 레이아웃 설정)
    setInitialLayout() {
        this.container.style.width = `${window.innerWidth}px`;  // 초기 창 크기에 맞게 설정
        this.container.style.height = `${window.innerHeight}px`;
    }

    // 창 크기 변경 처리 (resize)
    handleResize() {
        console.log('창 크기 변경됨');
        this.container.style.width = `${window.innerWidth}px`;  // 크기 조정
        this.container.style.height = `${window.innerHeight}px`;
    }
}

// 애플리케이션 인스턴스 생성 및 초기화 호출
const app = new ResponsiveApp();
app.init();  // 초기화 시 init() 호출

설명:

  • init()에서 애플리케이션이 시작될 때 기본적인 레이아웃을 설정합니다.
  • resize()는 사용자가 브라우저 창 크기를 변경할 때마다 handleResize() 메서드가 호출되어 UI 요소의 크기를 동적으로 조정합니다

상호작용 예시

  • init()은 애플리케이션이 처음 로드될 때 실행되어 기본적인 레이아웃을 설정합니다.
  • resize()는 창 크기가 변할 때마다 실행되어 레이아웃을 동적으로 재조정합니다.

결론
init()resize()는 본질적으로 다른 목적을 가진 함수이지만, 애플리케이션의 초기화와 동적 레이아웃 조정이라는 점에서 서로 협력할 수 있습니다. 예를 들어, init()을 통해 초기 레이아웃을 설정하고, resize()는 화면 크기 변화에 따라 UI를 조정하는 역할을 맡을 수 있습니다. 따라서 사용자 경험을 개선하기 위해 두 함수가 함께 사용될 수 있습니다.

init()에도, handleResize() 에도 같은 이벤트가 작성되어있다면 ?

init()handleResize() 함수에서 같은 이벤트를 다룬다면, 이벤트 처리에 있어서 중복이 발생할 수 있습니다. 특히, resize 이벤트와 같은 UI 변경 관련 이벤트가 두 함수에서 각각 처리되고 있다면, 이벤트가 여러 번 실행되거나 불필요한 로직이 반복될 수 있습니다. 이 문제를 해결하려면, 이벤트를 한 곳에서만 처리하도록 정리하는 것이 중요합니다.

예시: 중복 이벤트 처리 문제

class ResponsiveApp {
    constructor() {
        this.container = document.getElementById('container');
    }

    // 초기화 작업 (init)
    init() {
        console.log('애플리케이션 초기화 중...');
        this.setInitialLayout();
        window.addEventListener('resize', this.handleResize.bind(this));  // resize 이벤트 추가
        console.log('초기화 완료!');
    }

    // 초기 레이아웃 설정 (init에서 처리)
    setInitialLayout() {
        this.container.style.width = `${window.innerWidth}px`;  // 초기 창 크기에 맞게 설정
        this.container.style.height = `${window.innerHeight}px`;
    }

    // 창 크기 변경 처리 (resize)
    handleResize() {
        console.log('창 크기 변경됨');
        this.container.style.width = `${window.innerWidth}px`;  // 크기 조정
        this.container.style.height = `${window.innerHeight}px`;
    }
}

// 애플리케이션 인스턴스 생성 및 초기화 호출
const app = new ResponsiveApp();
app.init();  // 초기화 시 init() 호출

이 예시에서 resize 이벤트는 init()에서 처음 등록되고, 이후 창 크기가 변경될 때마다 handleResize() 메서드가 호출됩니다. handleResize()는 창 크기 변경에 맞춰 UI를 업데이트하는 역할을 합니다. 그러나 만약 init() 내에서 resize와 관련된 다른 작업을 추가하거나 처리하고, 그와 동시에 handleResize()에서 동일한 작업을 한다면 중복된 작업이 발생할 수 있습니다.

해결 방법
1. 이벤트 처리 로직을 하나로 통합하기

  • resize 이벤트에 대한 처리를 하나의 메서드에만 두는 것이 좋습니다. init()에서 resize를 설정할 때, 이미 초기화와 크기 조정까지 포함하여 처리하도록 할 수 있습니다.
  1. resize 이벤트를 한 번만 처리하도록 하기
  • 이벤트가 여러 번 중복되어 처리되지 않도록 최적화하거나 이벤트 리스너를 한 번만 등록하는 방법을 고려해야 합니다.

방법 1: resize 처리 로직을 handleResize()에만 두기

class ResponsiveApp {
    constructor() {
        this.container = document.getElementById('container');
    }

    // 초기화 작업 (init)
    init() {
        console.log('애플리케이션 초기화 중...');
        this.setupEventListeners();  // resize 이벤트 리스너만 설정
        this.handleResize();  // 초기 크기 설정 (창 크기에 맞게 설정)
        console.log('초기화 완료!');
    }

    // resize 이벤트 리스너 설정
    setupEventListeners() {
        window.addEventListener('resize', this.handleResize.bind(this));  // resize 이벤트 리스너 추가
    }

    // 창 크기 변경 처리 (resize)
    handleResize() {
        console.log('창 크기 변경됨');
        this.container.style.width = `${window.innerWidth}px`;  // 크기 조정
        this.container.style.height = `${window.innerHeight}px`;
    }
}

// 애플리케이션 인스턴스 생성 및 초기화 호출
const app = new ResponsiveApp();
app.init();  // 초기화 시 init() 호출

설명:

  • init()에서 setupEventListeners()를 호출하여 resize 이벤트 리스너만 설정합니다.
  • handleResize()는 창 크기를 변경할 때마다 호출되어 UI 요소의 크기를 업데이트합니다.
  • resize 이벤트에 대한 처리를 한 번만 하게 되므로, 중복되는 코드나 불필요한 처리 없이 깔끔하게 관리됩니다.

방법 2: resize 이벤트 중복 처리 방지 (최적화)
resize 이벤트는 브라우저 창 크기 변경 시 자주 발생할 수 있기 때문에, 너무 자주 호출되지 않도록 디바운싱(debouncing) 기법을 적용할 수 있습니다. 디바운싱은 이벤트가 연속적으로 발생할 때 마지막 이벤트만 처리하도록 하여 성능을 최적화하는 기법입니다.

class ResponsiveApp {
    constructor() {
        this.container = document.getElementById('container');
        this.resizeTimeout = null;  // 디바운싱을 위한 타이머 변수
    }

    // 초기화 작업 (init)
    init() {
        console.log('애플리케이션 초기화 중...');
        this.setupEventListeners();  // resize 이벤트 리스너 설정
        this.handleResize();  // 초기 크기 설정
        console.log('초기화 완료!');
    }

    // resize 이벤트 리스너 설정
    setupEventListeners() {
        window.addEventListener('resize', this.debounce(this.handleResize.bind(this), 200));  // 200ms 디바운스
    }

    // 창 크기 변경 처리 (resize)
    handleResize() {
        console.log('창 크기 변경됨');
        this.container.style.width = `${window.innerWidth}px`;
        this.container.style.height = `${window.innerHeight}px`;
    }

    // 디바운싱 함수
    debounce(func, wait) {
        return () => {
            clearTimeout(this.resizeTimeout);
            this.resizeTimeout = setTimeout(func, wait);
        };
    }
}

// 애플리케이션 인스턴스 생성 및 초기화 호출
const app = new ResponsiveApp();
app.init();  // 초기화 시 init() 호출

설명:

  • debounce() 함수를 통해 resize 이벤트가 너무 자주 실행되지 않도록 합니다. 이 경우, 창 크기 변경이 끝날 때까지 기다린 후 handleResize()를 실행합니다.
  • debounce 함수는 이벤트가 연속으로 발생하는 것을 방지하고, 마지막 이벤트만 처리하게 해줍니다.
    결론
  • 중복 처리를 피하려면, resize 이벤트 처리 로직을 한 곳에서만 관리하는 것이 좋습니다.
  • resize 이벤트는 UI 크기를 동적으로 조정하는 데 중요한 역할을 하므로, 초기화(init())와 크기 변경 처리(resize)를 적절히 분리하거나, 최적화 기법(예: 디바운싱)을 사용하여 성능을 관리하는 것이 중요합니다.

0개의 댓글