성공하는 코드 서비스들의 숨겨진 철학 (대신하고, 숨기고, 드러나게)

주싱·2023년 2월 16일
0

더 나은 코드

목록 보기
8/14

Image by Freepik

성공하는 코드 서비스들은 사용자가 복잡해 하는 기술적인 영역을 대신 구현하고, 그것을 구현한 자신은 서비스 뒤에 숨기며, 사용자가 자신의 비지니스 로직 구현에 집중하고, 비지니스 로직만 코드에 드러날 수 있게 함을 목표한다는 공통된 철학을 가지고 있는 것 같습니다.

몇 일 전에 '비지니스 로직에 집중하는, 비동기 테스트 코드 만들기 (Awaitility)' 라는 글을 쓰고 집으로 걸어가는 밤길에 생각이 났습니다.

서비스 받은 경험

비동기 시스템을 테스트 하는 코드를 작성하며 테스트하려는 비지니스 로직과 비동기적인 처리를 위한 기술적인 코드가 뒤섞여 있어 불편했습니다.

@Test
void inventory_reflects_requested_value() {
    // 1. When - 상태 변경 명령 전송
    store.requestAsync(new ChangeInventory(100));

    // 2. Then - 일정 시간 동안 상태 변경 여부 확인
    long startMillis = System.currentTimeMillis();
    while (System.currentTimeMillis() - startMillis < 2000) {
        if (store.getInventory() == 100) { // condition 
            // success
            return;
        }
    }

    // 3. (실패 시) 실패 판정에 사용된 값 출력
    log.info("status : {}", store.getInventory());
    fail();
}

여러 시도를 하던 중에 알게 된 Awaitility 라는 서비스의 도움으로 코드를 간결하게 만들 수 있었습니다. Awaitility 서비스는 제가 직접 작성하던 비동기 처리를 위한 기술적인 코드를 대신 작성해 주었고(더 멋지게), 복잡했던 기술적인 코드를 자신 뒤에 숨겨주었습니다. 그리고 사용자가 비지니스 로직을 테스트하는 코드에 집중하고, 비지니스 로직과 관련된 코드만 궁극적으로 드러나게 해주었습니다.

@Test
void inventory_reflects_requested_value_awaitility() {
    // 1. When - 상태 변경 명령 전송
    store.requestAsync(new ChangeInventory(100));

    // 2. Then - 일정 시간 동안 상태 변경 여부 확인
    with().conditionEvaluationListener(condition -> log.info("status on failure : {}", store.getInventory())) // 테스트 조건 확인 시, 상태 값을 출력합니다
          .await() // 기다립니다
          .atMost(500, MILLISECONDS) // 500 msec 동안
          .pollInterval(ofMillis(100)) // 100 msec 간격으로
          .until(() -> store.getInventory() == 100); // 다음 조건을 통과할 때까지
}

스프링의 철학

문득 토비의 스프링 책에서 배웠던 스프링의 감동적인 철학이 떠올랐습니다. 스프링은 엔터프라이즈 환경에서 기술적인 복잡함과 비지니스의 복잡함을 분리하려 했고, 기술적인 복잡함은 자신이 구현하고, 스스로는 프레임워크 뒤에 숨겼으며, 사용자가 비지니스 로직 구현에 집중하고 비지니스 로직과 관련된 코드만 드러나게 노력했다는게 설명의 요지였습니다. 오늘 만난 Awaitility 그리고 Spring 뿐만 아니라 Netty, JUnit 같은 많은 좋은 프레임워크들이 이와 같은 공통된 철학을 가졌다는 생각이 걸어가는 길에 떠오릅니다.

나도 나아갈 길

사용자가 어려움을 겪고 있는 복잡한 기술 영역을 서비스하고, 기술의 존재는 숨기며, 사용자가 각자의 비지니스를 잘할 수 있게 돕는, 그래서 사용자의 영역이 드러나게 하는 서비스를 만들면 Spring처럼 Awaitility처럼 유익한 서비스가 될 수 있겠다는 생각이 듭니다. 내가 할 수 있는 일은 어떤 것이 있을지 생각해 봅니다.

profile
소프트웨어 엔지니어, 일상

0개의 댓글