[javascript] 프로미스를 활용한 이미지 로딩 및 리소스 관리

웹 애플리케이션에서 이미지 로딩과 관련된 작업은 중요한 부분입니다. 대용량 이미지를 효율적으로 로딩하고, 로딩이 완료된 후에 적절히 관리해야 합니다. 이를 위해서 프로미스를 사용하여 비동기 작업을 처리할 수 있습니다.

프로미스란?

프로미스는 JavaScript의 비동기 작업을 처리하기 위한 객체입니다. 비동기 작업은 일반적으로 AJAX 요청, 타이머, 파일 로딩 등이 있습니다. 프로미스는 이러한 비동기 작업이 완료되었을 때 결과를 반환하거나 실패 정보를 알려줍니다.

이미지 로딩에 프로미스 활용하기

function loadImage(url) {
  return new Promise((resolve, reject) => {
    const image = new Image();

    image.onload = function() {
      resolve(image);
    };

    image.onerror = function() {
      reject(new Error(`Failed to load image ${url}`));
    };

    image.src = url;
  });
}

const imageUrl = "https://example.com/image.jpg";
loadImage(imageUrl).then(image => {
  // 이미지 로딩이 완료되었을 때 실행되는 로직
  document.body.appendChild(image);
}).catch(error => {
  // 이미지 로딩이 실패했을 때 실행되는 로직
  console.error(error);
});

위 코드는 loadImage 함수를 통해 이미지를 로딩하는 기능을 구현한 예시입니다. loadImage 함수는 URL을 파라미터로 받고, 로딩이 성공한 경우에는 resolve 함수를 호출하여 프로미스를 이행합니다. 그리고 로딩이 실패한 경우에는 reject 함수를 호출하여 프로미스를 거부합니다.

이렇게 구현된 loadImage 함수를 호출하고, then 메서드를 통해 이미지 로딩이 완료된 후 실행되어야 하는 로직을 작성할 수 있습니다. 또한, catch 메서드를 통해 이미지 로딩이 실패했을 때 실행되어야 하는 로직도 작성할 수 있습니다.

이미지 리소스 관리

웹 애플리케이션에서 이미지를 로딩할 때에는 메모리 누수 등의 문제를 고려해야 합니다. 이미지가 계속해서 로딩되는 상황이 발생하면 성능 저하가 발생할 수 있습니다. 이러한 문제를 해결하기 위해서는 로딩된 이미지를 적절히 관리해야 합니다.

이미지 리소스 관리를 위해서는 로딩된 이미지를 적절한 자료구조에 저장하고, 필요할 때마다 해당 이미지를 재사용하도록 해야 합니다. 이는 일반적으로 캐싱(Caching) 기법을 활용하여 구현할 수 있습니다.

const imageCache = new Map();

function loadImage(url) {
  if (imageCache.has(url)) {
    return Promise.resolve(imageCache.get(url));
  }

  return new Promise((resolve, reject) => {
    const image = new Image();

    image.onload = function() {
      imageCache.set(url, image);
      resolve(image);
    };

    image.onerror = function() {
      reject(new Error(`Failed to load image ${url}`));
    };

    image.src = url;
  });
}

위 코드는 이미지 리소스를 캐싱하는 imageCache 변수를 도입하여 이미지를 캐싱하고 필요할 때마다 캐싱된 이미지를 사용하도록 개선한 예시입니다. 이미지가 로딩되는 시점에 imageCache에 이미지를 저장하고, 이미지 로딩이 완료되면 해당 이미지를 캐싱합니다. 이미지를 다시 로딩해야 할 경우에는 이미지 캐시에서 가져와 사용합니다.

결론

프로미스를 활용하여 이미지 로딩과 관련된 비동기 작업을 처리하고, 이미지 리소스를 효율적으로 관리할 수 있습니다. 이를 통해 웹 애플리케이션의 성능을 향상시킬 수 있고, 사용자 경험을 개선할 수 있습니다.