[클린 코드] 관심사 분리(Separation of Concerns)

김지섭·2025년 7월 10일
0

소프트웨어 개발 과정에서 기능 구현만큼이나 중요한 요소는 코드의 가독성유지보수성입니다. 간단한 작업이라도 어떻게 구성하느냐에 따라 코드의 품질은 크게 달라질 수 있습니다. 이 글에서는 displayItems() 메서드를 예시로 들어, 관심사 분리(Separation of Concerns) 원칙이 실제 코드에 어떻게 반영될 수 있는지 살펴봅니다.

문제 상황

다음은 장바구니의 상품 목록과 합계를 출력하는 코드입니다. 두 코드 모두 동일한 기능을 수행하지만 구성 방식에서 차이를 보입니다.

// 첫 번째 코드
public void displayItems(){
    System.out.println("장바구니 상품 출력");
    int sum = 0;
    for (int i = 0; i < itemCount; i++) {
        System.out.println("상품명:" + items[i].getName() + ", 합계:" + items[i].getTotalPrice());
        sum += items[i].getTotalPrice();
    }
    System.out.println("전체 가격 합:" + sum);
}
// 두 번째 코드
public void displayItems() {
    System.out.println("장바구니 상품 출력");
    for (int i = 0; i < itemCount; i++) {
        Item item = items[i]; // 명확한 객체 참조
        System.out.println("상품명:" + item.getName() + ", 합계:" + item.getTotalPrice());
    }
    System.out.println("전체 가격 합:" + calculateTotalPrice()); // 별도 메서드 분리
}

핵심 차이: 관심사 분리

1. 명확한 변수로의 분리

두 번째 코드에서는 items[i]를 반복적으로 호출하는 대신, Item item = items[i];를 통해 해당 객체에 의미 있는 이름을 부여합니다. 이로 인해 다음과 같은 이점이 생깁니다.

  • 각 라인의 의미가 즉시 이해된다.
  • 코드 반복을 줄이고, 실수 가능성을 줄인다.
  • '값을 꺼내오는 행위'와 '값을 사용하는 행위'를 시각적으로 구분할 수 있다.

이러한 구조는 코드의 명료성을 높이고, 유지보수 과정에서도 실수를 줄이는 데 도움을 줍니다.

2. 계산 로직의 분리

두 번째 코드에서는 가격 합계를 직접 계산하지 않고 calculateTotalPrice()라는 별도 메서드로 책임을 분리합니다. 이 방식은 다음과 같은 장점을 가집니다.

  • 출력 로직과 계산 로직이 명확히 분리되어 각자 역할에만 집중한다.
  • 계산 방식이 변경될 경우, 출력 메서드의 수정 없이 계산 메서드만 변경하면 된다.
  • 테스트와 재사용이 용이하다.

이처럼 로직을 역할에 따라 나누는 것은 관심사 분리 원칙을 지키는 기본적인 접근 방식입니다.

회고

작은 코드 차이가 전체 구조에 주는 영향은 결코 작지 않습니다. Item item = items[i];와 같은 사소한 습관은 코드의 가독성을 높이고, 실수를 줄이며, 궁극적으로 더 나은 유지보수성을 제공합니다.

또한 출력과 계산을 구분하는 방식은 단순한 메서드 분리를 넘어, 하나의 함수가 하나의 책임만 갖도록 설계하는 데 기반이 됩니다.

잘 정돈된 코드란 단순히 작동하는 것이 아니라, 이해하기 쉽고, 변경하기 쉬우며, 함께 일하기 쉬운 코드를 말합니다. 관심사 분리를 고려한 작고 명확한 리팩토링이 그러한 코드를 만드는 출발점이 됩니다.

profile
백엔드 행 유도 미사일

0개의 댓글