본문 바로가기
Spring Boot/QRCode 만들기

Google zxing 을 이용하여 QRCode 만들기!

by pswamazing 2024. 12. 24.

안녕하세요! 오늘은 Spring 프로젝트에서 QR 코드를 쉽게 생성하는 방법을 알아보겠습니다. Google의 ZXing 라이브러리를 활용하면 정말 간단하게 구현할 수 있어요!

여러분은 프로젝트에 QR 코드 기능을 추가해보신 적 있으신가요? 댓글로 경험을 공유해주세요!

 

1. Maven 의존성 추가하기

먼저 pom.xml에 ZXing 라이브러리를 추가해야 합니다. ZXing은 Google에서 만든 강력한 바코드 및 QR 코드 처리 라이브러리입니다.

<!-- zxing QR Code Generator -->
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.5.3</version>
</dependency>

최신 버전을 사용하고 싶다면 Maven Repository에서 확인해보세요!


2. QR 코드 생성기 클래스 만들기

이제 실제로 QR 코드를 생성하는 클래스를 만들어봅시다. 텍스트나 URL을 입력하면 이미지로 변환해주는 핵심 기능입니다.

QRCodeGenerator.java

import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import java.awt.*;
import java.awt.image.BufferedImage;

public class QRCodeGenerator {
    
    public static BufferedImage generateQRCodeImage(String text) throws WriterException {
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        
        // QR 코드 생성 (크기: 100x100)
        BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, 100, 100);
        
        // BitMatrix를 BufferedImage로 변환
        int width = bitMatrix.getWidth();
        int height = bitMatrix.getHeight();
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        
        // 픽셀 단위로 QR 코드 그리기
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                image.setRGB(x, y, bitMatrix.get(x, y) ? Color.BLACK.getRGB() : Color.WHITE.getRGB());
            }
        }
        
        return image;
    }
}

코드 설명

QRCodeWriter는 ZXing의 핵심 클래스로 텍스트를 QR 코드로 인코딩합니다. BitMatrix는 QR 코드의 2D 비트 배열 표현이고, 이중 for문을 통해 각 픽셀을 검정(QR 코드) 또는 흰색(배경)으로 설정합니다. 크기는 100x100으로 설정했지만 필요에 따라 조정 가능합니다.


3. Base64 변환 유틸리티 만들기

생성된 이미지를 웹 페이지에서 바로 사용하려면 Base64로 인코딩해야 합니다. 이렇게 하면 별도의 이미지 파일 없이 HTML의 img 태그에서 직접 사용할 수 있습니다.

QRCodeUtil.java

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.util.Base64;

public class QRCodeUtil {
    
    public static String convertToBase64(BufferedImage image) {
        try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
            // 이미지를 PNG 형식으로 스트림에 쓰기
            ImageIO.write(image, "png", outputStream);
            
            // 바이트 배열을 Base64로 인코딩
            byte[] imageBytes = outputStream.toByteArray();
            return Base64.getEncoder().encodeToString(imageBytes);
            
        } catch (Exception e) {
            throw new RuntimeException("Failed to convert image to Base64", e);
        }
    }
}

왜 Base64를 사용할까요?

Base64를 사용하면 이미지 파일을 서버에 저장할 필요가 없고, HTML이나 CSS에서 직접 사용할 수 있으며, 별도의 HTTP 요청이 필요 없습니다. QR 코드처럼 작은 이미지는 Base64가 매우 효율적입니다.


4. 컨트롤러에서 사용하기

이제 실제로 웹 페이지에서 QR 코드를 생성하고 표시해봅시다.

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import com.google.zxing.WriterException;
import java.awt.image.BufferedImage;

@Controller
public class QRCodeController {
    
    @GetMapping("/print")
    public String printQrCode(Model model, @UserSession UserSessionDTO session) throws WriterException {
        
        // 1. QR 코드로 만들 텍스트 또는 URL 지정
        String qrContent = "https://your-website.com/ticket/" + session.getUserId();
        
        // 2. QR 코드 이미지 생성
        BufferedImage qrImage = QRCodeGenerator.generateQRCodeImage(qrContent);
        
        // 3. Base64로 변환
        String qrCodeBase64 = QRCodeUtil.convertToBase64(qrImage);
        
        // 4. Model에 추가 (data URI scheme 형식)
        model.addAttribute("qrCode", "data:image/png;base64," + qrCodeBase64);
        
        return "qrcode/print";
    }
}

컨트롤러 작성 포인트

qrContent 변수에는 URL이나 일반 텍스트 모두 가능합니다. 예를 들어 "회원번호: 12345" 같은 텍스트도 QR 코드로 만들 수 있습니다. data URI scheme 형식으로 변환하면 JSP에서 img 태그의 src 속성에 바로 사용할 수 있습니다.


5. JSP에서 QR 코드 표시하기

컨트롤러에서 전달받은 QR 코드를 화면에 표시합니다.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
    <title>QR 코드 출력</title>
    <style>
        .qr-container {
            text-align: center;
            padding: 20px;
        }
        .qr-container img {
            border: 2px solid #333;
            padding: 10px;
            background: white;
        }
    </style>
</head>
<body>
    <div class="qr-container">
        <h2>입장권 QR 코드</h2>
        <img src="${qrCode}" alt="QR Code" />
        <p>위 QR 코드를 입구에서 스캔해주세요.</p>
    </div>
</body>
</html>

정말 간단하죠? img 태그의 src 속성에 컨트롤러에서 전달한 qrCode 변수를 넣기만 하면 됩니다.


실전 활용 예제

QR 코드 크기 조정하기

기본 100x100 크기가 작다면 크기를 조정할 수 있습니다.

public class QRCodeGenerator {
    
    public static BufferedImage generateQRCodeImage(String text, int width, int height) 
            throws WriterException {
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);
        
        int matrixWidth = bitMatrix.getWidth();
        int matrixHeight = bitMatrix.getHeight();
        BufferedImage image = new BufferedImage(matrixWidth, matrixHeight, BufferedImage.TYPE_INT_RGB);
        
        for (int x = 0; x < matrixWidth; x++) {
            for (int y = 0; y < matrixHeight; y++) {
                image.setRGB(x, y, bitMatrix.get(x, y) ? Color.BLACK.getRGB() : Color.WHITE.getRGB());
            }
        }
        
        return image;
    }
}

// 사용 예시
BufferedImage smallQR = QRCodeGenerator.generateQRCodeImage("텍스트", 150, 150);
BufferedImage largeQR = QRCodeGenerator.generateQRCodeImage("텍스트", 300, 300);

한글 인코딩 문제 해결

QR 코드에 한글을 넣었는데 깨진다면 인코딩 힌트를 추가하세요.

import com.google.zxing.EncodeHintType;
import java.util.HashMap;
import java.util.Map;

public static BufferedImage generateQRCodeImage(String text) throws WriterException {
    QRCodeWriter qrCodeWriter = new QRCodeWriter();
    
    // UTF-8 인코딩 힌트 추가
    Map<EncodeHintType, Object> hints = new HashMap<>();
    hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
    
    BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, 100, 100, hints);
    
    // 나머지 코드는 동일
}

여러 개 QR 코드 한 번에 생성

티켓이나 쿠폰을 여러 개 만들어야 한다면 반복문을 활용하세요.

@GetMapping("/tickets")
public String generateTickets(Model model) throws WriterException {
    List<String> qrCodes = new ArrayList<>();
    
    // 티켓 10개 생성
    for (int i = 1; i <= 10; i++) {
        String ticketUrl = "https://event.com/ticket/" + i;
        BufferedImage qrImage = QRCodeGenerator.generateQRCodeImage(ticketUrl);
        String base64 = QRCodeUtil.convertToBase64(qrImage);
        qrCodes.add("data:image/png;base64," + base64);
    }
    
    model.addAttribute("qrCodes", qrCodes);
    return "tickets/list";
}

 

JSP에서는 JSTL의 forEach를 사용해 반복 출력합니다.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<c:forEach items="${qrCodes}" var="qr" varStatus="status">
    <div class="ticket">
        <h3>티켓 #${status.index + 1}</h3>
        <img src="${qr}" alt="Ticket QR Code" />
    </div>
</c:forEach>

파일로 저장하기

QR 코드를 서버에 이미지 파일로 저장하고 싶다면 다음과 같이 구현합니다.

import java.io.File;
import javax.imageio.ImageIO;

public class QRCodeUtil {
    
    public static void saveQRCodeToFile(BufferedImage image, String filePath) {
        try {
            File outputFile = new File(filePath);
            ImageIO.write(image, "png", outputFile);
        } catch (Exception e) {
            throw new RuntimeException("Failed to save QR code", e);
        }
    }
}

// 사용 예시
BufferedImage qrImage = QRCodeGenerator.generateQRCodeImage("https://example.com");
QRCodeUtil.saveQRCodeToFile(qrImage, "/upload/qrcode.png");

QR 코드 활용 분야

QR 코드는 다양한 곳에서 활용할 수 있습니다.

이벤트 및 티켓팅 - 공연이나 행사 입장권에 고유 번호를 QR 코드로 삽입하여 빠른 입장 처리가 가능합니다.

모바일 결제 - 결제 URL을 QR 코드로 생성하여 간편 결제 시스템을 구축할 수 있습니다.

출석 체크 - 학생이나 직원의 출석을 QR 코드 스캔으로 간편하게 관리할 수 있습니다.

제품 인증 - 정품 인증이나 제품 정보 조회를 QR 코드로 구현할 수 있습니다.

WiFi 공유 - WiFi 접속 정보를 QR 코드로 만들어 손님에게 쉽게 공유할 수 있습니다.

전자 명함 - 연락처 정보를 QR 코드로 만들어 빠르게 저장할 수 있습니다.

 


마무리

이제 Spring 프로젝트에서 QR 코드를 자유롭게 생성할 수 있게 되었습니다!

정리하면:

1단계 - ZXing 라이브러리 의존성 추가

2단계 - QRCodeGenerator 클래스로 QR 코드 생성

3단계 - QRCodeUtil 클래스로 Base64 변환

4단계 - 컨트롤러에서 Model에 담아 JSP로 전달

5단계 - JSP의 img 태그로 간단하게 표시

정말 간단하죠? 프로젝트에 QR 코드 기능이 필요하다면 이 방법을 활용해보세요!

댓글