-
[우아한테크코스 - 프리코스] 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())); }
- 주문 내용을 입력으로 받기
➡️ 프리코스가 끝나고 앞으로..
이번 프리코스에 참여하여 미션을 하나하나하면서 정말 좋은 경험을 했다고 생각한다.
매주 공통 피드백을 통해 내가 앞으로 코드를 작성하는데 있어서 지켜야할 가이드라인이 생긴 것 같다.
이를 잘 지켜서 요구 사항을 잘 지키고 스스로 만족할만한 코드를 작성하기 위해 노력해야겠다.
많은 동료들과 함께 하면서 좋은 영향도 많이 받고 자극도 받아서 정말 재미있게 코스에 참여할 수 있었다.
또한, 다른 분들의 코드 리뷰나 회고록을 통해서 다양한 관점을 많이 볼 수 있었고 이를 통해 부족한 점을 많이 배울 수 있었다.
역시 여러 사람들과 함께 무언가를 한다는 것은 배울 점도 많고 더 재미있고 의욕이 생기는 것 같다.
코스가 끝나고 지금 부족한 실력을 더 채우고자 더 열심히 해야겠다는 생각이 가장 크다.
목표를 위해서 느리더라도 지치지 말고 꾸준하게 역량을 높이고자 노력해야겠다❗
'⭐️ 우아한테크코스' 카테고리의 다른 글
[우아한테크코스 - 프리코스] 늦은 3주차 로또 게임 회고 😓 (0) 2023.11.28 [우아한테크코스-프리코스] 2주차 경주게임 회고를 해보자🏁 (0) 2023.11.02 [우아한테크코스-프리코스] 1주차 숫자야구 회고를 해보자 ⚾️ (0) 2023.10.26