안녕하세요! 오늘은 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 코드 기능이 필요하다면 이 방법을 활용해보세요!
댓글