효율적이고 안정적인 바코드 생성 API 구축이 필요하신가요? 이 가이드에서는 Java의 Spring Boot와 인기 있는 ZXing 라이브러리를 활용해 빠르고 가벼운 바코드 생성 API를 구축하는 방법을 설명합니다. Code 128 바코드를 다양한 크기로 생성하여 웹페이지에서 바로 표시할 수 있도록 설정하며, 대량의 바코드 생성에도 무리가 없도록 최적화된 구조를 소개합니다.
이 API는 이미지의 로딩 속도가 빨라서 다수의 바코드를 동시 생성해야 하는 경우에도 성능 이슈를 최소화합니다. 본 가이드를 통해 사용하기 쉬운 바코드 생성 API를 직접 구현하고, 더 나은 사용자 경험을 제공해 보세요.
ZXing 라이브러리로 빠른 바코드 생성 API 구현하기
라이브러리 설정: Maven 의존성 추가
먼저, Maven Repository에서 ZXing Core와 MatrixToImageWriter
클래스를 사용할 수 있도록 필요한 의존성을 추가합니다.
<!-- ZXing Core 라이브러리 --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.5.0</version> </dependency> <!-- ZXing JavaSE 라이브러리 --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.5.0</version> </dependency>
리팩토링된 API 코드: 바코드 생성 컨트롤러
아래의 코드에서 generateBarcodeImage
메서드를 별도로 분리하여, 바코드 이미지 생성 로직을 가독성 있게 분리했습니다. 또한, 예외 처리와 코드를 간결하게 유지하여 유지보수가 용이하도록 개선했습니다.
import java.io.ByteArrayOutputStream; import java.util.EnumMap; import org.apache.commons.lang3.StringUtils; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.ResponseBody; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.WriterException; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.oned.Code128Writer; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; @Controller public class BarcodeController { private static final int BARCODE_WIDTH = 300; private static final int BARCODE_HEIGHT = 25; @GetMapping("/api/barcode/{barcode}") public @ResponseBody ResponseEntity<byte[]> getBarcodeImage(@PathVariable String barcode) { if (StringUtils.isBlank(barcode)) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null); } try { byte[] barcodeImage = generateBarcodeImage(barcode); return ResponseEntity.ok().body(barcodeImage); } catch (WriterException | IllegalArgumentException e) { e.printStackTrace(); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null); } } private byte[] generateBarcodeImage(String barcode) throws WriterException { EnumMap<EncodeHintType, ErrorCorrectionLevel> hintMap = new EnumMap<>(EncodeHintType.class); hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L); Code128Writer barcodeWriter = new Code128Writer(); BitMatrix bitMatrix = barcodeWriter.encode(barcode, BarcodeFormat.CODE_128, BARCODE_WIDTH, BARCODE_HEIGHT); try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) { MatrixToImageWriter.writeToStream(bitMatrix, "png", byteArrayOutputStream); return byteArrayOutputStream.toByteArray(); } catch (Exception e) { throw new WriterException("Failed to generate barcode image", e); } } }
코드 설명
- 모듈화된 바코드 생성 로직:
generateBarcodeImage
메서드로 바코드 생성 로직을 별도로 분리하여, 가독성과 재사용성을 높였습니다. - 상수 사용:
BARCODE_WIDTH
와BARCODE_HEIGHT
를 상수로 정의하여 이미지 크기를 한눈에 알아볼 수 있게 했습니다. - 향상된 에러 처리: 입력이 비어 있을 때
BAD_REQUEST
상태를 반환하며, 이미지 생성 실패 시INTERNAL_SERVER_ERROR
를 반환하도록 개선했습니다. - 자원 자동 해제:
ByteArrayOutputStream
을 try-with-resources 구문으로 자동 해제하여 자원 누수를 방지합니다.
결과: 빠르고 안정적인 바코드 생성 API 구현
이 API는 Code 128 바코드를 다양한 크기로 생성하여 웹페이지에서 빠르게 로딩할 수 있습니다. 또한, 향상된 에러 처리와 모듈화된 코드 구조 덕분에 유지보수가 쉬우며, 대량의 바코드를 동시에 생성할 때도 성능 저하 없이 안정적으로 작동합니다.