Spring Boot와 Vue.js를 활용한 Base64 이미지 처리

 

Spring Boot와 Vue.js를 활용한 Base64 이미지 처리

Spring Boot와 Vue.js를 활용한 Base64 이미지 처리

이미지 파일을 웹 클라이언트에 전송하는 방법에는 여러 가지가 있습니다. 그중 Base64 인코딩을 활용한 이미지를 전송하고 처리하는 방식은 간단하면서도 효율적인 경우가 많습니다. 이 글에서는 Spring Boot WAS(웹 애플리케이션 서버)에서 Base64로 인코딩된 이미지를 제공하고, Vue.js 기반 웹 서버에서 이를 처리해 웹 브라우저에 이미지를 표시하는 방법을 자세히 설명하겠습니다.

Base64 인코딩이란?

Base64는 바이너리 데이터를 텍스트로 변환하는 인코딩 방식입니다. 이미지 파일을 Base64로 변환하면 텍스트 문자열 형태로 전송할 수 있기 때문에 REST API 응답 본문에 포함하거나 JSON 형식으로 데이터를 주고받기에 유용합니다. 다만, Base64는 바이너리 데이터보다 약 33% 더 많은 용량을 차지한다는 점을 고려해야 합니다.

Spring Boot에서 Base64 이미지 제공하기

Spring Boot에서 이미지 파일을 읽고 Base64로 인코딩한 문자열로 반환하는 방법을 살펴보겠습니다.

1. 이미지 파일 읽기 및 Base64 인코딩

import org.springframework.core.io.ClassPathResource;
import org.springframework.util.Base64Utils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

@RestController
@RequestMapping("/api/images")
public class ImageController {

    @GetMapping("/base64")
    public String getImageAsBase64() throws IOException {
        // 이미지 파일 경로 설정 (예: resources/static/images/sample.jpg)
        Path imagePath = Paths.get(new ClassPathResource("static/images/sample.jpg").getURI());
        byte[] imageBytes = Files.readAllBytes(imagePath);
        return Base64Utils.encodeToString(imageBytes);
    }
}

위 코드는 sample.jpg 파일을 읽어 Base64 문자열로 변환한 후 반환합니다. 이 문자열은 JSON 응답으로 클라이언트에 전달됩니다.

Vue.js에서 Base64 이미지 처리

Vue.js에서 Spring Boot API로부터 전달받은 Base64 이미지를 처리하고 웹 브라우저에 표시하는 방법은 다음과 같습니다.

1. Base64 문자열 요청 및 처리

<template>
  <div>
    <h1>Base64 이미지 표시</h1>
    <img v-if="imageSrc" :src="imageSrc" alt="Base64 이미지" />
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      imageSrc: ''
    };
  },
  mounted() {
    this.fetchImage();
  },
  methods: {
    async fetchImage() {
      try {
        const response = await axios.get('/api/images/base64');
        this.imageSrc = `data:image/jpeg;base64,${response.data}`;
      } catch (error) {
        console.error('이미지 로드 오류:', error);
      }
    }
  }
};
</script>


2. Blob URL로 변환하여 처리 (선택 사항)

Base64 대신 Blob 객체로 변환하여 이미지 URL을 생성할 수도 있습니다. 이는 메모리 사용량을 줄이고 더 효율적으로 이미지를 렌더링할 수 있습니다.

async fetchImageAsBlob() {
  try {
    const response = await axios.get('/api/images/base64');
    const base64String = response.data;
    const binary = atob(base64String);
    const array = new Uint8Array(binary.length);
    for (let i = 0; i < binary.length; i++) {
      array[i] = binary.charCodeAt(i);
    }
    const blob = new Blob([array], { type: 'image/jpeg' });
    this.imageSrc = URL.createObjectURL(blob);
  } catch (error) {
    console.error('Blob 이미지 로드 오류:', error);
  }
}


Base64와 Blob URL 비교

Base64는 텍스트 형태로 데이터를 전송하기 때문에 API 간 데이터 교환에 편리하지만, 이미지 크기가 커질수록 성능 이슈가 발생할 수 있습니다. 반면, Blob URL은 브라우저의 메모리에 객체를 저장해 더 효율적으로 이미지 파일을 관리할 수 있습니다.

장단점 요약

방식 장점 단점
Base64    데이터 전송이 간단하고 JSON과 호환 가능    데이터 크기가 증가하고 메모리 부담
Blob URL    브라우저 메모리 사용으로 성능이 더 우수    Blob 객체 생성 및 관리 코드가 필요


결론

Spring Boot와 Vue.js를 활용하여 Base64 이미지를 처리하는 방법은 간단한 설정과 코드로 빠르게 구현할 수 있는 장점이 있습니다. 그러나 성능과 데이터 크기를 고려하여 적합한 방식(Base64 또는 Blob)을 선택하는 것이 중요합니다. 이 글의 내용을 바탕으로 여러분의 프로젝트에서 효율적으로 이미지를 전송하고 표시할 수 있기를 바랍니다.

Comments