3주차 프리코스 목표

이번 3주차에는 Call-Back Template 디자인 패턴 구현하는 것과 서버 - 클라이언트 형태의 코드로 설계하는 것을 목표로 잡았다.

일단 Call-Back Template란 무엇이며, 어떤 것을 해결하고자 나온 디자인 패턴일까?

Callback Template: 모듈화의 필요성과 구현

개발 중 반복적이지만 모듈화하기 어려운 코드가 종종 등장합니다. 대표적으로 try-catch 문과 같은 예외 처리가 그렇습니다.

public Api<MoneyDto> purchaseMoney() {
    while(true) {
    	try {
            String money = input.getPurchaseMoney();
            return apiHandler.transformMoneyDto(money);
        } catch (IllegalArgumentException e){
            output.viewExceptionMessage(e.getMessage());
        }
    }
}

이처럼 try-catch 문은 반복되지만, 내용이 달라 모듈화가 어렵습니다. 이를 해결하기 위한 방법이 바로 Callback Template입니다.

public class CallBackTemplate {
    public <T> T retry(Supplier<T> callback, Consumer<MyException> exceptionHandler) {
    while (true) {
        try {
            return callback.get();
        } catch (MyException e) {
            exceptionHandler.accept(e);
        }
    }
}

이 코드에서 Supplier<T>는 함수형 인터페이스 중 하나로, 특정 기능을 추상화하여 람다 표현식으로 구현할 수 있도록 합니다.

함수형 인터페이스란?

함수형 인터페이스는 단 하나의 추상 메서드만 가지는 인터페이스로, Java 8에서 람다 표현식과 함께 도입되었습니다. 이는 개발자가 모듈화된 코드를 간결하게 작성할 수 있도록 해줍니다.

추가 설명: 함수형 인터페이스는 오라클에 따르면 Object의 메서드를 제외하고 하나의 추상 메서드만 가져야 하며, 이를 통해 람다 표현식 사용이 가능해집니다. 이에 대한 자세한 설명은 별도의 글로 다루겠습니다.

Callback Template 사용법과 장단점

Callback Template는 아래와 같이 람다식을 활용해 호출됩니다.

public Api<MoneyDto> purchaseMoney() {
    return retry.retry(() -> {
                String money = input.getPurchaseMoney();
                return apiHandler.transformMoneyDto(money);
             },
             e -> output.viewExceptionMessage(e.getMessage())
    );
}
  • 장점: 반복 코드를 줄여 가독성을 높이고, 코드 오류를 줄입니다.
  • 단점: 모듈화가 성능 저하를 초래할 수 있으며, 람다식에 익숙하지 않은 개발자에게는 가독성이 떨어질 수 있습니다. 하지만 성능이 극도로 중요한 경우가 아니라면, 이 정도의 저하는 거의 무시해도 됩니다.

 

클라이언트 - 서버 관계와 API 설계

클라이언트와 서버의 관계를 정의하는 것은 API 설계에서 핵심입니다. 클라이언트는 요청을 하고, 서버는 이 요청을 받아 비즈니스 로직을 처리하여 응답을 반환합니다.

지난주 MVC 패턴 구현 시 고민했던 주제는 캐싱 주체였습니다. 일반적으로 Controller가 캐싱을 담당하는 것은 역할상 어색하다고 느꼈습니다. 이에 따라 UserRequest라는 클래스를 생성하여 캐싱을 전담하게 하고, 컨트롤러는 비즈니스 로직과 데이터 흐름을 관리하는 구조로 수정했습니다

3주차 회고

이번 3주차 프리코스에서는 Callback Template클라이언트-서버 구조를 구현하며 아직 더 공부가 필요하다는 것을 실감했습니다. 특히, 함수형 인터페이스와 같은 개념을 단순히 이해하는 것과 실제로 구현하는 것의 차이를 느낀 주이기도 했습니다. 이 과정에서 개발은 단순한 지식이 아닌 능력이라는 것을 다시 한번 깨달았습니다.

 

다음 4주차에는 Config를 도입하여 DI를 적용하는 클래스를 구현하는 것을 목표로 삼고 있습니다. 이를 통해 보다 유연하고 확장 가능한 구조를 만들어보고자 합니다.

 

3주차 TDD 결과

TDD 결과

3주차 깃 주소

https://github.com/woowacourse-precourse/java-lotto-7/pull/242

참고문헌

Infa 블로그 - 함수형 인터페이스

Oracle - Functional Interface

 

+ Recent posts