QR Code 만들기

2025. 3. 7. 21:31·Java/Spring Boot
목차
  1. ✅ QrCodeController
  2. ✅ QrCodeService
  3. ✅ JS
  4. ✅ 테스트
728x90

얼마 전 사이드 프로젝트로 URL 단축 서비스를 만들다가 QR Code도 같이 적용시키면 재밌을 것 같아서

적용해 보았다. 어려울 줄 알았는데 생각보다 엄청 간단해서 놀랐다.

 

✅ QrCodeController

Controller는 URL을 전달받아서 URL을 qrCode로 변형시킨 뒤 돌려준다.

package sideproject.cutly.controller;

import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import sideproject.cutly.service.QrCodeService;

import java.io.IOException;

@RestController
@RequiredArgsConstructor
@RequestMapping("/qrcode")
public class QrCodeController {

    private final QrCodeService qrCodeService;

    @GetMapping
    public void getQrCode(@RequestParam String url, HttpServletResponse response) throws IOException {
        byte[] qrCodeImage = qrCodeService.generateQrCode(url, 250, 250);
        response.setContentType("image/png");
        response.getOutputStream().write(qrCodeImage);
    }
}

✅ QrCodeService

실질적으로 전달 받은 URL을 qrCode로 변형하는 역할을 담당한다.

package sideproject.cutly.service;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import org.springframework.stereotype.Service;

import java.io.ByteArrayOutputStream;
import java.util.HashMap;
import java.util.Map;

@Service
public class QrCodeService {

    /**
     * 주어진 URL을 기반으로 지정된 크기의 QR 코드를 생성하여 바이트 배열로 반환합니다.
     *
     * @param url QR 코드로 생성할 URL
     * @param width QR 코드의 너비 (픽셀 단위)
     * @param height QR 코드의 높이 (픽셀 단위)
     * @return 생성된 QR 코드의 PNG 이미지 바이트 배열
     * @throws RuntimeException QR 코드 생성 중 오류 발생 시 예외 발생
     */
    public byte[] generateQrCode(String url, int width, int height) {
        try {
            Map<EncodeHintType, Object> hints = new HashMap<>();
            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");

            BitMatrix bitMatrix = new MultiFormatWriter().encode(
                    url, BarcodeFormat.QR_CODE, width, height, hints);

            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            MatrixToImageWriter.writeToStream(bitMatrix, "PNG", outputStream);
            return outputStream.toByteArray();
        } catch (Exception e) {
            throw new RuntimeException("QR 코드 생성 실패", e);
        }
    }
}

✅ JS

Service와 Controller가 작성이 되었다면 JS에서 호출하여 qrCode를 받아본다.

$(document).ready(function () {
    $('#qrForm').on('submit', function (e) {
        e.preventDefault();

        const url = $('#url').val();
        const qrCodeApi = `https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=${encodeURIComponent(url)}`;
        // const qrCodeApi = `/qrcode/generate?url=${encodeURIComponent(url)}`;

        // 로딩 아이콘 표시 및 기존 QR 코드 숨김
        $('#qrCodeResult').fadeIn();
        $('#qrLoading').show();
        $('#qrCodeImage').hide();

        // QR 코드 이미지 로드
        const qrImg = new Image();
        qrImg.src = qrCodeApi;
        qrImg.onload = function () {
            $('#qrLoading').hide();  // 로딩 아이콘 숨김
            $('#qrCodeImage').attr('src', qrCodeApi).fadeIn(); // QR 코드 표시
        };
    });
});

✅ 테스트

이제 실제로 URL을 기반으로 qrCode가 생성되는지 확인해 본다.

 

qrCode 생성

 

정상적으로 생성되는 것을 볼 수 있다!

https://github.com/Kimmingki/cutly

 

GitHub - Kimmingki/cutly: URL 단축 웹 만들기~👍

URL 단축 웹 만들기~👍. Contribute to Kimmingki/cutly development by creating an account on GitHub.

github.com

 

저작자표시 비영리 (새창열림)

'Java > Spring Boot' 카테고리의 다른 글

Spring Security + JWT + Mybatis 인증/인가 구현  (0) 2024.10.08
Spring boot @RestController 유효성 검사  (0) 2024.09.22
HttpSessionListener를 이용한 중복 로그인 방지  (0) 2024.04.30
Bean Validation  (1) 2024.02.26
Thymeleaf 스프링 통합과 폼  (0) 2024.02.15
  1. ✅ QrCodeController
  2. ✅ QrCodeService
  3. ✅ JS
  4. ✅ 테스트
'Java/Spring Boot' 카테고리의 다른 글
  • Spring Security + JWT + Mybatis 인증/인가 구현
  • Spring boot @RestController 유효성 검사
  • HttpSessionListener를 이용한 중복 로그인 방지
  • Bean Validation
요술공주밍키
요술공주밍키
조금씩이라도 꾸준히..
삽질의흔적조금씩이라도 꾸준히..
  • 요술공주밍키
    삽질의흔적
    요술공주밍키
  • 전체
    오늘
    어제
    • 분류 전체보기 (130)
      • Java (42)
        • Spring Boot (14)
        • Spring Boot 게시판 (14)
        • 공중화장실 찾기 (4)
        • 쇼핑몰 (8)
      • JavaScript (8)
        • NodeJS (2)
      • Python (5)
        • Django (4)
      • Server (10)
        • Docker (4)
        • K8S (0)
        • Jenkins (1)
      • 알고리즘 (22)
        • 프로그래머스 (17)
        • 백준 (5)
      • Etc (21)
        • 개발 팁 (1)
      • 일상 (21)
        • 독서 포스트 (19)
        • 회고록 (2)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
요술공주밍키
QR Code 만들기

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.