μνμ£Όλ¬Έ νλ‘κ·Έλ¨ ν΅μ¬: μ¬μ©μκ° μνλ μνμ λ¬Έμ μμ΄ μ£Όλ¬Έν μ μμ΄μΌ νλ€.
- Java version: jdk-11.0.18
- Gradle version: 8.0
- lombok version: 1.18.28
- μνμ£Όλ¬Έ νλ‘κ·Έλ¨ κΈ°λ₯ μΆλ°μ§ - ProductController#run()
- νλ‘κ·Έλ¨ κ°μ²΄ μ€λΉ - ProductController#ready()
- νλ‘κ·Έλ¨ κΈ°λ₯ μμ - ProductController#orderPlay()
- μν μ μ₯μ
- μν λ°μ΄ν° κ°μ Έμ€κΈ° - ProductRepository#getCSVData()
- μ½€λ§(,) κΈ°μ€ λΆν - ProductRepository#splitToComma()
- μν λ°μ΄ν° κ²μ¦ - ProductRepository#validateTokens()
- μν λ°μ΄ν° μ λͺ© κ²μ¦ - ProductRepository#validateTitle()
- μν λ°μ΄ν° μΆκ° - ProductRepository#addProductMap()
- μν λ°μ΄ν° νμΌ μ½κΈ° μ’ λ£ - ProductRepository#fileReaderClose()
- μν μ£Όλ¬Έ
- μ£Όλ¬Έ λλ μ’ λ£ μ λ ₯ - InputView#orderORQuit()
- μνλ²νΈ μ λ ₯ - InputView#orderOfNumber()
- μλ μ λ ₯ - InputView#orderOfVolume()
- μ£Όλ¬Έ μ²λ¦¬
- μν μ£Όλ¬Έ λ²νΈ κ²μ¦ - OrderService#validateOrderNumber()
- μν λ©λ΄ λ²νΈλ€ νμΈ - OrderService#hasMenuNumbers()
- μν μ£Όλ¬Έ λ²νΈ λΉκ΅ - OrderService#isOrderNumber()
- μνμλ κ²μ¦ - OrderService#validateOrderVolume()
- μν μλκ³Ό μ¬κ³ μ νμΈ - Menu#volumeInStock()
- μν μ£Όλ¬Έ λ²νΈ κ²μ¦ - OrderService#validateOrderNumber()
- μ£Όλ¬Έ λ΄μ
- μ΄ μν μ 보 μΆλ ₯ - OutputView#printToTotalProduct()
- μν μ£Όλ¬Έ λ΄μ μΆλ ₯ - OutputView#printToOrderResult()
- μν λ°μ΄ν° μ²λ¦¬
- csv νμΌμμ κ°μ Έμ¨ μν λ°μ΄ν° κ°μ Έμ€κ° μ±κ³΅ - ProductRepositoryTest#getCSVDataSuccess()
- μν μ£Όλ¬Έ μ²λ¦¬
- μ£Όλ¬Έ μν λ²νΈ μ‘΄μ¬νλ κ²½μ° μ±κ³΅ - OrderServiceTest#orderNumberToExist()
- μ£Όλ¬Έ μν λ²νΈ μ‘΄μ¬νμ§ μλ κ²½μ° μμΈ λ°μ - OrderServiceTest#orderNumberToNotExist()
- μ£Όλ¬Έ μν μ¬κ³ λΆμ‘± μ¬λΆ νμΈ - OrderServiceTest#orderVolumeInStock()
- μ£Όλ¬Έ μν μ¬κ³ λΆμ‘± μμΈ λ°μ - OrderServiceTest#orderVolumeNotInStock()
π¦src
β£ πmain
β β πjava
β β β πkr
β β β β πco
β β β β β π_29cm
β β β β β β πhomework
β β β β β β β£ πconstant
β β β β β β β β£ πexception
β β β β β β β β β πmessageException.java
β β β β β β β β£ πservice
β β β β β β β β β£ πOrderConstant.java
β β β β β β β β β πResultNameConstant.java
β β β β β β β β πview
β β β β β β β β β£ πInputViewConstant.java
β β β β β β β β β πOutputViewConstant.java
β β β β β β β£ πexception
β β β β β β β β πhandlerException.java
β β β β β β β£ πmodel
β β β β β β β β£ πMenu.java
β β β β β β β β£ πOrder.java
β β β β β β β β πProduct.java
β β β β β β β£ πrepository
β β β β β β β β πProductRepository.java
β β β β β β β£ πservice
β β β β β β β β πOrderService.java
β β β β β β β£ πvalidate
β β β β β β β β£ πInputViewValidator.java
β β β β β β β β πOutputViewValidator.java
β β β β β β β£ πview
β β β β β β β β£ πConsole.java
β β β β β β β β£ πInputView.java
β β β β β β β β πOutputView.java
β β β β β β β£ πMain.java
β β β β β β β πProductController.java
β πtest
β β πjava
β β β πkr
β β β β πco
β β β β β π_29cm
β β β β β β πhomework
β β β β β β β£ πmodel
β β β β β β β β£ πMenuTest.java
β β β β β β β β πOrderTest.java
β β β β β β β£ πrepository
β β β β β β β β πProductRepositoryTest.java
β β β β β β β£ πservice
β β β β β β β β πOrderServiceTest.java
β β β β β β β£ πvalidate
β β β β β β β β£ πInputViewValidatorTest.java
β β β β β β β β πOutputViewValidatorTest.java
β β β β β β β£ πview
β β β β β β β β πOutputViewTest.java
β β β β β β β πMultiThreadRequestTest.java
WorkFlow μμ 보μ¬μ§λ νλ¦κ³Ό κ°μ΄ μ¬μ©μκ° μ£Όλ¬Έμ λν κ²°μ λ₯Ό μ§νν λ λ€λ₯Έ μ°λ λμμλ μ£Όλ¬Έ κ²°μ λ₯Ό κΈ°λ€λ¦¬κ³ μμ΄μΌνλ€. κ·Έλ μ§ μμΌλ©΄ μνλ²νΈ:213341 μ μ¬κ³ κ° λΆμ‘±ν¨μλ μ£Όλ¬Έ κ²°μ κ° μ§νλμ΄ μ¬μ©μλ μλ μνμ μ£Όλ¬Έμ νκ²λλ€.
μ¬κΈ°μ κ³ λ―Όν΄μΌλλ Point κ° DB Transaction Level κ³Ό method Level 2κ°μ§μ΄λ€. ν΄κ²°λ°©λ²μ κ²°μ κ° λ°μν λ Lock μ κ±Έμ΄μ£Όλ κ²μ΄λ€.
μ΄ νλ‘μ νΈμμλ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ¬μ©νμ§ μμκΈ° λλ¬Έμ method Level μμ Lock μ κ±Έμ΄μ£Όμλ€.
μ°λ λκ° getOrderComplete() μμ μ μνν λ λ€λ₯Έ μ°λ λκ° μ κ·Ό νμ§ λͺ»νκ² νκ³ μμ μ΄ λ§λ¬΄λ¦¬ λ νμ λ€λ₯Έ μ°λ λκ° μ κ·Όν μ μλ€.
μκ° λ³΅μ‘λλ ν¨μμ μ€ν μκ°μ νννλ κ²
μ£Όλ‘ μ κ·Όμ λΆμμ ν΅ν΄ μ€ν μκ°μ λ¨μνκ² νννλ©°
μ΄ λ μ κ·Όμ νκΈ°λ²μΌλ‘ ννν¨
main μμ μ€νλλ method κ° 2κ° μλ€.
main μ μ μΈλ method 2κ°λ₯Ό μ€ννλ©΄ λλκΈ° λλ¬Έμ λΉ
μ€ νκΈ°λ²μΌλ‘ νννλ©΄ O(1) μμμκ°μ μκ°λ³΅μ‘λλ₯Ό κ°μ§λ€.
νμ§λ§, μ€νλλ method μ λ΄λΆ λ‘μ§μ νμΈν΄ 보μμΌ νλ€.
productRepository.getData() λ‘μ§μ νμΈν΄λ³΄λ©΄
while((line=file.readLine())!=null){
/* Service Logic */
}while λ°λ³΅λ¬Έ 1κ°κ° λκ³ μλ€. μ΄ λ°λ³΅λ¬Έμ CSV νμΌμ μ‘΄μ¬νλ νμ κ°μλ§νΌ λ°λ³΅νκ³ μ’
λ£νλ€.
νμ¬λ 20κ° νμ΄ μ‘΄μ¬νκΈ° λλ¬Έμ 20λ² λ°λ³΅νκ³ μ’
λ£λ κ²μ΄λ€.
νμ§λ§, μν μλ μ¦κ° ν μ μλ μ±κ²©μ κ°μ§κΈ° λλ¬Έμ μ°ΎμΌλ €λ μν μ λ§νΌ νμνλ€κ³ ν μ μμ΄ O(N) μκ° λ³΅μ‘λλ₯Ό κ°μ§λ€.
μ΄μ productSale.run() λ‘μ§μ νμΈν΄λ³΄μ
while(true){ // μ’
λ£ μ
λ ₯ μ κΉμ§ 'μ£Όλ¬Έ'μ λ°λ³΅μ μΌλ‘ μ
λ ₯ λ°λ λ°λ³΅λ¬Έ
/* Service Logic */
while(true){ // 'μνλ²νΈ', 'μλ'μ λ°λ³΅μ μΌλ‘ μ
λ ₯ λ°λ λ°λ³΅λ¬Έ
/* Service Logic */
}
}while λ°λ³΅λ¬Έ 2κ°κ° λκ³ μλ€.
첫 λ²μ§Έ λ°λ³΅λ¬Έμ μν μ μ¬μ©μκ° 'μ£Όλ¬Έ' or 'μ’
λ£' λ₯Ό μ ννλ λ°λ³΅λ¬Έμ΄λ€.
λ λ²μ§Έ λ°λ³΅λ¬Έμ μν μ μ¬μ©μκ° 'μ£Όλ¬Έ' μ νμ μ£Όλ¬Έν 'μνλ²νΈ' and 'μλ' μ λ°λ³΅μ μΌλ‘ μ
λ ₯λ°λ λ°λ³΅λ¬Έμ΄λ€.
μ¬μ©μμ μ λ ₯μ΄ 1λ²μΌλ‘ λλ μλ μκ³ 100λ²μΌλ‘ λλ μλ μμ΄ μμΈ‘μ΄ λΆκ°νμ§λ§ κ²°κ΅μλ μ¬μ©μκ° μ λ ₯νλ νμλ§νΌ λ°λ³΅ν κ²μ΄λ€.
μ¬κΈ°μ λ°λ³΅λ¬Έ λ΄λΆμ μ‘΄μ¬νλ method λ€λ νμΈν΄λ³΄μ
첫 λ²μ§Έ λ°λ³΅λ¬Έμμ λμνλ method κ° 2κ° μ‘΄μ¬νλ€.
- productRepository.getCurrentProductInfo()
- productRepository.getOrderComplete(productNumbers, productStocks)
// getCurrentProductInfo()
productMap.forEach((k,v)->
/* Service Logic */
)
// getOrderComplete(productNumbers, productStocks)
for(int i=0;i<productNumbers.size();i++){
/* Service Logic */
}getCurrentProductInfo() λ μ μ₯λ μν μ 보λ₯Ό νλμ© μΆλ ₯νκ³ μλ€.
νμ¬λ 19κ°μ μνμ 보λ₯Ό κ°μ§κ³ μμ΄ O(19) μμ μκ°λ§ λ°λ³΅νμ§λ§ μ΄ κ²½μ°λ μν λ°μ΄ν°κ° μ¦κ°ν μ μλ μ±κ²©μ λκΈ° λλ¬Έμ μ‘΄μ¬νλ μν μ λ§νΌ νμνλ€κ³ ν μ μμ΄ O(N)
μκ°λ³΅μ‘λλ₯Ό κ°μ§λ€.
getOrderComplete(productNumbers, productStocks) λ μ¬μ©μκ° μ£Όλ¬Έν λ§νΌ λ°λ³΅μ΄ μ§νλλ€.
μ¬μ©μ μ£Όλ¬Έμ΄ 1λ²μΌ μ λ μκ³ 100λ² μΌ μλ μκΈ° λλ¬Έμ κ²°κ΅ μ¬μ©μ μ£Όλ¬Έλ§νΌ λ°λ³΅νκ²λ O(N) μκ° λ³΅μ‘λλ₯Ό κ°μ§λ€.
λ λ²μ§Έ λ°λ³΅λ¬Έμμ λμνλ method λ 2κ° μ‘΄μ¬νλ€.
- productRepository.getStockCheck(orderNumber, orderStock)
- productRepository.getProductCheck(orderNumber)
// getStockCheck(orderNumber, orderStock)
if(product!=null){
/* Service Logic */
if(currentStock<orderStock){
/* Service Logic */
}
}
// getProductCheck(orderNumber)
if(productExist!=null){
/* Service Logic */
}getStockCheck(orderNumber, orderStock) λ νμ¬ μ‘΄μ¬νλ μ¬κ³ μμ μ£Όλ¬Έν μ¬κ³ μλ₯Ό νμΈνλ κΈ°λ₯μ΄λ€.
μ΄μ€ 쑰건문μ μ¬μ©νμ§λ§ 쑰건문μ O(1) μμ μκ°μ μκ°λ³΅μ‘λλ₯Ό κ°μ§λ€.
getProductCheck(orderNumber) λ μ¬μ©μκ° μ£Όλ¬Έν μνμ΄ μ‘΄μ¬νλ μνμΈμ§ νμΈνλ κΈ°λ₯μ΄λ€.
쑰건문 νλλ₯Ό μ¬μ©νκ³ μμ΄ O(1) μμ μκ°μ μκ°λ³΅μ‘λλ₯Ό κ°μ§λ€.
κ²°λ‘ μ μΌλ‘, μ΅κ³ μ°¨νλ§μ λ¨κΈ°λ μ κ·Όμ νκΈ°λ²μΈ λΉ
μ€(Big-O) νκΈ°λ²μΌλ‘ νννλ€λ©΄
λ λ²μ§Έ λ°λ³΅λ¬Έμμ λμνλ ν¨μλ μ€νμκ°μμ μ μΈν μ μκ³ ,
첫 λ²μ§Έ λ°λ³΅λ¬Έμμλ λ°λ³΅λ¬Έμ΄ 1κ° μ€μ²©λμ΄ μ¬μ©λλκ±Έ νμΈν μ μκΈ° λλ¬Έμ
μ΄ νλ‘κ·Έλ¨μ O(N^2) μκ°λ³΅μ‘λλ₯Ό κ°μ§λ€κ³ ν μ μλ€.

















