ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [우아한테크코스 - 프리코스] 4주차 로또 게임 회고 🤑
    ⭐️ 우아한테크코스 2023. 12. 7. 12:24

     

    이번에도 늦은 회고록...작성 😨😨

     

    ⭐ 지난 미션 피드백

    1️⃣ 내가 구현하는 방식에서 왜 그 방법을 사용했는지 생각하며 사용하자

    • 다른 분들의 리뷰와 회고록을 보다보니 많은 디자인 패턴을 사용하고 개발을 위한 여러 방법을 사용하는 것을 볼 수 있었다.
    • 사용하게된 이유들을 보면서 내가 놓친 부분에 대해서 많이 생각할 수 있었다.
    • 나 또한 많은 개발 방식을 무턱대고 사용하지 말고 사용할 때의 장점과 단점들을 생각하고 요구 사항을 해결하는데 어떤 것이 더욱 효율적인지를 고려하며 구현해나가는 연습을 할 필요가 있다고 느꼈다.

    2️⃣ 요구 사항…

    • 코드를 최종적으로 제출하고 디스코드방을 보니 기능 요구 사항에 대한 내용으로 많은 분들이 의견을 나누고 있었다.
    • 이야기를 슬쩍보니.. 출력을 하는 요구 사항에서 1,000 단위로 쉼표를 붙여주어야 했다.

    ❗❗❗ 이때, 충격을 받았다…

    • 나름 요구 사항을 꼼꼼하게 체크했다고 생각했는데.. 요구 사항 꼭 작은 부분도 확인하고 또 확인하자

     

    🤔 고민


    💰 할인을 어떤 식으로 적용하는 것이 좋을까?

    이번 미션을 하면서 12월 이벤트에서 많은 할인 정책이 있어 이를 상황에 맞게 처리를 해주어야 했다.

    이 할인 정책들은 결국 할인이 가능한지 확인하고 가능하다면 할인된 가격을 계산해주는 기능이 공통적인 부분이라고 생각했다.

    이를 어떤 방식을 사용해서 구현할지 고민을 하다 전략 패턴을 사용하도록 했다.

     

    전략 패턴 (Strategy Pattern)❓

    전략 패턴이란, 비슷한 동작을 하지만 다르게 구현되는 전략들을 공통의 인터페이스를 구현하는 클래스로 구현하고 동적으로 바꿀 수 있도록 하는 패턴이다.

     

    💡전략 패턴 사용 이유

    • 전략 패턴을 사용해 각 할인 정책들에 대한 할인 적용 관련 로직을 캡슐화 할 수 있다.
    • 할인 정책을 추가 및 수정을 할 때 코드 수정이 최소화할 수 있어서 확장성을 높일 수 있다고 생각했다.

     

    🧑🏻‍💻 적용해보기

     

    📍 할인을 적용할 전략에 대한 인터페이스를 구현

    public interface DiscountStrategy {
        BigDecimal applyDiscount(int day);
        String getDiscountType();
        Boolean isCanApply(int day);
    }

     

     

    📍각 할인 정책별로 할인 전략을 클래스로 구현

    public class ChristmasDDayDiscount implements DiscountStrategy {
    
        private static final int BASE_DISCOUNT_AMOUNT = 1000;
        private static final int DAILY_DISCOUNT_INCREASE = 100;
    
        @Override
        public BigDecimal applyDiscount(int day) {
            ...
        }
    
        @Override
        public String getDiscountType() {
            ...
        }
    
        @Override
        public Boolean isCanApply(int day) {
            ...
        }
    
        ...
    }

     

     

    📍 할인 정책 사용

    private void applyDiscountAndRecord(DiscountStrategy discountStrategy,
                                            Order order, int day,
                                            List<DiscountRecord> discountRecords) {
        BigDecimal discountAmount = discountStrategy.applyDiscount(day);
        ...
    }
    • 각 상황에 맞는 할인 정책을 통해 할인 금액을 계산

     

    🔧 아쉬운 점


    💣 예외가 발생했을 경우 다시 입력을 받는 로직을 어떻게 처리할까?

    이번 미션을 진행하면서 예외가 발생하는 입력이 들어왔을 경우 잘못된 입력이 들어오는 부분에서 다시 입력을 받는 요구사항이 있었다.

    요구 사항을 위해 while문 과 try-catch 문을 이용해 예외가 발생했을 경우 while문을 다시 돌며 입력을 받는 방법을 사용했다.

     

    ⚠️ 이렇게 예외를 처리하다보니 다양한 예외 상황에 대해서 모두 while문과 try-catch문을 작성해주어야 하는 문제점이 발생했고 예외 상황이 점점 늘어감에 따라 작성해야 하는 코드의 양이 많아지고 이는 매우 귀찮고 비효율적이였다.

     

    ❗이번 미션이 끝난 후, 다른 분들의 코드를 보며 함수형 인터페이스를 통해 처리한 코드를 볼 수 있었다.

     

    private <T> T getValidInput(Supplier<T> supplier) {
        while (true) {
            try {
                return supplier.get();
            } catch (IllegalArgumentException error) {
                OutputView.printErrorMessage(error.getMessage());
            }
        }
    }
    

     

     

    Supplier라는 함수형 인터페이스와 Lambda를 지원하면서 간단하고 우아한 코드를 작성할 수 있다는 것을 알게 되었다.

    📖 Supplier

    • 매개값 ❌
    • 반환값 ⭕

    실행 후 데이터를 공급(Supply)

     

    이를 통해 한 번의 try-catch로 모든 함수를 감쌀 수 있게 되었고 이런 함수를 메서드 선언형으로 작성해 미션의 요구사항을 만족할 수 있다

    private Order orderMenu() {
        return getValidInput(() -> orderService.order(InputView.askMenu()));
    }
    • 주문 내용을 입력으로 받기

     

    ➡️ 프리코스가 끝나고 앞으로..

    이번 프리코스에 참여하여 미션을 하나하나하면서 정말 좋은 경험을 했다고 생각한다.

    매주 공통 피드백을 통해 내가 앞으로 코드를 작성하는데 있어서 지켜야할 가이드라인이 생긴 것 같다.

    이를 잘 지켜서 요구 사항을 잘 지키고 스스로 만족할만한 코드를 작성하기 위해 노력해야겠다.

    많은 동료들과 함께 하면서 좋은 영향도 많이 받고 자극도 받아서 정말 재미있게 코스에 참여할 수 있었다.

    또한, 다른 분들의 코드 리뷰나 회고록을 통해서 다양한 관점을 많이 볼 수 있었고 이를 통해 부족한 점을 많이 배울 수 있었다.

    역시 여러 사람들과 함께 무언가를 한다는 것은 배울 점도 많고 더 재미있고 의욕이 생기는 것 같다.

    코스가 끝나고 지금 부족한 실력을 더 채우고자 더 열심히 해야겠다는 생각이 가장 크다.

    목표를 위해서 느리더라도 지치지 말고 꾸준하게 역량을 높이고자 노력해야겠다❗

     

    댓글

Designed by Tistory.