PROGRAMING/API
[API] 효율적인 바코드 생성 API 구축 가이드
Popix
2024. 11. 4. 21:51
효율적이고 안정적인 바코드 생성 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 바코드를 다양한 크기로 생성하여 웹페이지에서 빠르게 로딩할 수 있습니다. 또한, 향상된 에러 처리와 모듈화된 코드 구조 덕분에 유지보수가 쉬우며, 대량의 바코드를 동시에 생성할 때도 성능 저하 없이 안정적으로 작동합니다.