>백엔드 개발 >Golang >시스템 설계: Go로 주차장 시스템 구축

시스템 설계: Go로 주차장 시스템 구축

DDD
DDD원래의
2024-11-11 22:03:02933검색

이 글에서는 Go에서 주차장 시스템의 LLD(Low Level Design) 구현을 살펴보겠습니다. 시스템의 다양한 측면을 살펴보고 각 구성 요소가 나머지 구성 요소와 어떻게 상호 작용하는지 살펴보겠습니다. 이 구현은 명확성과 실제 유용성에 중점을 두므로 더 많은 차량 유형, 다양한 결제 옵션 또는 현장 예약과 같은 기능을 추가하려는 경우 쉽게 확장할 수 있습니다.

이 시스템은 주차 층 및 공간 관리, 차량 주차 및 주차 해제, 결제 처리 등의 작업을 처리합니다. 또한 동시 액세스에 대해 스레드로부터 안전한지 확인하므로 더 큰 시스템으로 확장해야 하는 경우에도 압력이 가해지지 않습니다.


핵심 구성요소

저희 디자인에는 6가지 주요 구성요소가 포함됩니다.

  1. 주차장 - 층수와 주차운영을 관리하는 주요 진입점
  2. 주차층 - 각 층에는 다양한 종류의 차량을 주차할 수 있는 여러 주차 공간이 있습니다.
  3. 주차장 - 특정 유형의 차량을 주차할 수 있는 주차 공간을 나타냅니다.
  4. 주차권 - 입출차 시간, 주차 요금, 관련 차량을 추적합니다.
  5. 결제 시스템 - 주차요금 정산 및 결제 처리를 담당합니다.
  6. 차량 유형 - 다양한 유형의 차량(자동차, 밴, 트럭, 오토바이)을 지원합니다. 유형별로 시간당 요금이 다릅니다.

싱글턴 주차장

저희 ParkingLot은 싱글톤 패턴을 사용합니다. 즉, 한 번 생성되어 애플리케이션 전체에서 재사용되는 주차장 인스턴스가 하나만 있다는 의미입니다. 이를 작동시키는 코드는 다음과 같습니다.

var (
    parkingLotInstance *ParkingLot
    once               sync.Once
)

type ParkingLot struct {
    Name   string
    floors []*ParkingFloor
}

func GetParkingLotInstance() *ParkingLot {
    once.Do(func() {
        parkingLotInstance = &ParkingLot{}
    })
    return parkingLotInstance
}

sync.Once를 사용하면 여러 고루틴에서 액세스하더라도 하나의 인스턴스만 생성되도록 합니다.

주차장 층 관리

주차장은 여러 층으로 구성되어 있으며 각 층에는 다양한 차량 유형(예: 자동차, 밴, 트럭, 오토바이)을 위한 지정된 주차 공간이 있습니다. 주차장에 층을 추가하려면 AddFloor 메서드를 사용합니다.

func (p *ParkingLot) AddFloor(floorID int) {
    p.floors = append(p.floors, NewParkingFloor(floorID))
}

각 층은 차량 유형별로 자리를 정리하는 NewParkingFloor 기능을 사용하여 생성됩니다.

주차 장소

각 ParkingSpot은 특정 차량 유형(예: 자동차 또는 오토바이)과 연결되어 있습니다. 이를 통해 시스템은 각 지점에 주차할 수 있는 차량을 관리하고 제한할 수 있습니다. ParkingSpot 구조와 ParkVehicle 메서드는 다음과 같습니다.

type ParkingSpot struct {
    SpotID         int
    VehicleType    vehicles.VehicleType
    CurrentVehicle *vehicles.VehicleInterface
    lock           sync.Mutex
}

func (p *ParkingSpot) ParkVehicle(vehicle vehicles.VehicleInterface) error {
    p.lock.Lock()
    defer p.lock.Unlock()

    if vehicle.GetVehicleType() != p.VehicleType {
        return fmt.Errorf("vehicle type mismatch: expected %s, got %s", p.VehicleType, vehicle.GetVehicleType())
    }
    if p.CurrentVehicle != nil {
        return fmt.Errorf("parking spot already occupied")
    }

    p.CurrentVehicle = &vehicle
    return nil
}

저희는 한 번에 한 지점에 한 대의 차량만 주차할 수 있도록 Mutex 잠금 장치를 사용합니다.

주차권

모든 차량에는 출입 시간, 주차 공간, 총 요금이 포함된 티켓이 제공됩니다. 이 티켓은 차량 하차 시 갱신되며, 주차 시간을 기준으로 요금이 계산됩니다.

var (
    parkingLotInstance *ParkingLot
    once               sync.Once
)

type ParkingLot struct {
    Name   string
    floors []*ParkingFloor
}

func GetParkingLotInstance() *ParkingLot {
    once.Do(func() {
        parkingLotInstance = &ParkingLot{}
    })
    return parkingLotInstance
}

CalculateTotalCharge 메소드는 차량 유형 및 기간을 기준으로 주차 요금을 계산합니다.

결제 시스템

PaymentSystem 클래스는 결제를 처리하고 필요한 금액이 결제되었는지 여부에 따라 결제 상태를 업데이트합니다.

func (p *ParkingLot) AddFloor(floorID int) {
    p.floors = append(p.floors, NewParkingFloor(floorID))
}

ProcessPayment 기능은 금액을 확인하고 결제 상태를 완료 또는 실패로 업데이트합니다.

차량 유형 추가

저희 시스템은 다양한 유형의 차량(자동차, 밴, 트럭, 오토바이)을 지원합니다. 각 유형마다 시간당 요금이 다릅니다. 이는 별도의 차량 패키지에 VehicleType 및 VehicleInterface를 설정하여 달성됩니다.

type ParkingSpot struct {
    SpotID         int
    VehicleType    vehicles.VehicleType
    CurrentVehicle *vehicles.VehicleInterface
    lock           sync.Mutex
}

func (p *ParkingSpot) ParkVehicle(vehicle vehicles.VehicleInterface) error {
    p.lock.Lock()
    defer p.lock.Unlock()

    if vehicle.GetVehicleType() != p.VehicleType {
        return fmt.Errorf("vehicle type mismatch: expected %s, got %s", p.VehicleType, vehicle.GetVehicleType())
    }
    if p.CurrentVehicle != nil {
        return fmt.Errorf("parking spot already occupied")
    }

    p.CurrentVehicle = &vehicle
    return nil
}

각각 VehicleInterface를 구현하는 NewCar, NewVan, NewTruck 등을 호출하여 새로운 차량을 생성할 수 있습니다.


모든 것을 하나로 모으기

조각들이 흐름에서 어떻게 조화를 이루는지 살펴보겠습니다.

  • 주차장 만들기: GetParkingLotInstance()를 호출하고 AddFloor를 사용하여 층을 추가합니다.
  • 주차장 찾기 및 차량 주차: ParkVehicle 메소드는 이용 가능한 주차 공간을 찾아 차량 유형과 비교하여 검증한 후 티켓을 생성합니다.
  • 차량 주차 해제 및 결제 처리: UnparkVehicle이 총 요금을 생성하고 결제 시스템을 시작하며 거래를 완료합니다.

이 주차장 시스템은 더욱 복잡한 시스템을 구축하기 위한 단순화된 출발점입니다. 층별 및 스팟 관리, 차량 주차 및 출차, 기본 결제 과정에 대한 기본 사항을 다루었습니다.

전체 코드 구현을 보려면 다음 저장소를 확인하세요.

System Design: Building a Parking Lot System in Go thesaltree / 로우레벨 디자인 골랑

Golang의 저수준 시스템 설계 솔루션

Go에서의 저수준 시스템 설계

Go의 하위 수준 시스템 설계 저장소에 오신 것을 환영합니다! 이 저장소에는 다양한 하위 수준 시스템 설계 문제와 Go로 구현된 솔루션이 포함되어 있습니다. 주요 목표는 실제 사례를 통해 시스템의 설계와 아키텍처를 보여주는 것입니다.

목차

  • 개요
  • 주차장 시스템
  • 엘리베이터 시스템
  • 도서관 관리 시스템
  • 자판기 시스템
  • 소셜 미디어 플랫폼

개요

낮은 수준의 시스템 설계에는 시스템 아키텍처의 핵심 개념을 이해하고 확장 가능하고 유지 관리가 가능하며 효율적인 시스템을 설계하는 작업이 포함됩니다. 이 저장소에서는 Go를 사용하여 다양한 문제와 시나리오에 대한 솔루션을 다루려고 합니다.

주차장 시스템

이 저장소의 첫 번째 프로젝트는 주차장 시스템입니다. 이 시스템은 차량을 주차하고 주차 해제할 수 있는 주차장을 시뮬레이션합니다. 다음을 보여줍니다.

  • 주차장 인스턴스 관리를 위한 싱글톤 디자인 패턴
  • 다양한 유형의 차량(예: 승용차, 트럭)을 취급합니다.
  • 다층에 걸친 주차공간 관리
  • 결제 처리 중…


GitHub에서 보기


위 내용은 시스템 설계: Go로 주차장 시스템 구축의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.