Portfolio
내 가게만의 영수증 만들기!
결과물
아키텍처
Order Client
- 배민 주문 접수 프로그램, 쿠팡 주문 프로그램 등을 말한다.
- COM 인터페이스를 통해 이 프로그램과 일방적으로 Raw Order Data를 전달한다.
Serial Port
import { SerialPort } from 'serialport' const port = new SerialPort({ path: 'COM30', baudRate: 9600, autoOpen: true })
- serialport 모듈을 통해 COM 인터페이스를 이용한다.
- 여러 주문 접수 프로그램으로부터 COM30 포트로 주문 데이터를 전달받는다.
Interpreter Factory
class InterpreterFactory { getInterpreter (data: string): Interpreter { const detector = new PlatformDetector() switch (detector.detect(data)) { case Platform.BAEMIN: return new BaeminInterpreter() } // case Platform.BAEMIN_1: // return new BaeminOneInterpreter() // } throw new Error('Unhandled Interpreter') } }
- 주문 데이터를 받아, 이를 해석할 수 있는 Interpreter를 return한다.
Interpreter (Interface)
export interface Interpreter { interpret(rawData: string): ReceiptInfo }
- Interpreter는 data를 받아 이를 ReceiptInfo 객체로 만들 수 있는 기능을 갖추어야 한다.
ReceiptInfo
export class ReceiptInfo { platform: Platform orderMetaInfo: OrderMetaInfo deliveryInfo: DeliveryInfo requestInfo: RequestInfo }
Printer
async print (receiptInfo: ReceiptInfo) { const tempPDF = this.updateReceiptPDFByReceiptInfo(new PDFDocumentWithTables({ size: [600, 5000], margin: 0 }), receiptInfo) const receipt = new PDFDocumentWithTables({ size: [600, tempPDF.y + 50], margin: 0 }) receipt.pipe(fs.createWriteStream(this.outputPath)) this.updateReceiptPDFByReceiptInfo(receipt, receiptInfo) receipt.end() setTimeout(async () => { const printer = new WinPrinter() printer.setPrinter(this.printerID) await printer.print(this.outputPath) fs.unlinkSync(this.outputPath) }, 1000) }
- Interpreter가 해석한 주문 정보를 ReceiptInfo로 받아 프린터를 이용해 출력한다.
- 임시 PDF 문서를 만든 뒤, Receipt Info를 바탕으로 영수증을 작성하여 완성될 영수증의 세로 길이를 확인한다.
- 임시 PDF의 영수증의 세로 길이를 바탕으로 그 길이에 맞는 PDF 문서를 생성한다.
- PDF 문서에 영수증을 작성한다.
- 이를 node-native-printer 모듈을 이용하여 하드웨어 프린터로 출력한다.
Core Logic
const interpreter = InterpreterFactory.getInterpreter(decodedData) const printer = new Printer() printer.print(interpreter.interpret(decodedData))
- 주문 정보를 받아 ⇒ 이를 해석하여 ⇒ 프린터로 출력한다.
- 이 부분의 코드는 가장 높은 추상으로써 새로운 플랫폼의 추가, 프린트 방식의 변경과 같은 변화에 안전하다.