Skip to Content
Suffering builds character
아카이브10.Java실습5. Phase 3 - 관심사 분리하기

5. Phase 3 - 관심사 분리하기

1. BankStatementAnalyzer의 3가지 관심사

현재 BankStatementAnalyzer.java는 3가지 관심사를 가지고 있음

1. TSV 확장자(bank-data-simple.txt)로 작성된 입출금 내역 파일을 읽어들임
2. 조건에 따라 입출금 내역을 처리
3. 처리된 결과를 콘솔에 출력

→ 하나의 클래스가 너무 많은 기능(책임, Responsibility)을 담당하고 있는 상황

이처럼 혼자서 모든 일을 처리하고 있는 클래스를 God Class 라고 하며, 피해야 할 안티 패턴

1-1. 해결 방법

  1. 소프트웨어 설계 원칙(SOLID) 중 단일 책임 원칙(Single Responsibility Principle) 활용
    하나의 클래스나 메서드는 단 하나의 기능(책임)만 가질수록 좋음
💡
Tip

관심사
프로그램이 마주하고 있는 문제 상황 or 해결하고자 하는 문제

관심사의 분리(Seperate of Concern, SoC)
프로그램의 증가하는 복잡도를 최소화하기 위해 각 코드들을 공통된 관심사끼리 모듈화(분리)하는 방식
Java의 경우 클래스나 메서드가 수행해야 하는 역할이나 기능끼리 모아서 전체 구조를 작성하는 방식으로 적용할 수 있음

1-2. 단일 책임 원칙(SRP)을 활용하여 BankStatementAnalyzer 클래스의 관심사를 분리

  1. 주어진 입출금 내역 파일(bank-data.txt) 읽기
  2. 주어진 형식(.TSV 확장자)으로 입력 변환(Parsing)
  3. 입출금 내역 결과 처리
  4. 콘솔에 결과 출력

→ 먼저 2번째 관심사인 TSV 파일을 파싱하는 로직을 현재 클래스에서 별도의 클래스로 책임을 분리

TSV 파일을 파싱하는 로직을 BankStatementAnalyzer.java에서 별도의 클래스인 BankDataTSVParser.java로 분리하였음

1-3. 적용 결과

적용 결과 개선된 포인트는 다음과 같음

명확한 역할 분리
클래스를 분리한 결과, Main 클래스인 BankStatementAnalyzer.java의 책임은 줄어들었고,
TSV 파일을 파싱하는 역할은 BankDataTSVParser.java가 담당하게 되었음

BankDataTSVParser는 .tsv 확장자 형태의 입출금 내역 데이터를 프로그램에서 읽어들일 수 있는 형태의 타입으로 변환(파싱)해주는 단 하나의 역할만 담당하고 있음
→ 단일 책임 원칙(SRP)이 적용되었고, 응집도(Cohesion) 또한 높은 상태

Note

응집도(Cohesion)
클래스 맥락에서 사용될 경우, 해당 클래스 내에 작성된 필드나 메서드가 서로 각각 하나의 역할에만 관련되어 있는 정도

현재 BankDataTSVParser는 입출금 내역 데이터를 파싱해주는 역할만 담당하고 있기 때문에 응집도가 높다고 볼 수 있음

높아진 재사용성
BankDataTSVParser는 독립적으로 구현되어있기 때문에 추후 다른 클래스에서도 파싱 로직이 필요할 경우 캡슐화된 이 클래스를 가져다가 재사용할 수 있음

높아진 결합도(Side effect)
하지만 Main에서는 TSV 파일을 파싱하는 로직이 사라졌기 때문에, 해당 기능을 수행하기 위해서는 BankDataTSVParser에게 의존(dependent)하는 구조로 변화됨
→ BankStatementAnalyzer와 BankDataTSVParser 간 결합도(Coupling) 증가

Note

결합도(Coupling)

어떤 클래스가 다른 클래스에 의존하고 있는 정도

기본적으로 하나의 클래스에서 new 키워드를 사용하여 다른 클래스의 인스턴스를 생성하는 코드가 많을수록 두 클래스 간의 결합도가 높다고 볼 수 있음

서로 다른 클래스 간에는 낮은 결합도를 가지는 것이 이상적인 구조라고 볼 수 있으며, 이는 다른 구현체로의 교체가 편하기 때문
→ interface를 활용하여 어느 정도 해소 가능

응집도(Cohesion)

코드의 품질과 관련된 특성, 클래스나 메서드의 책임, 관심사가 서로 강하게 연결, 연관되어 있는 정도

→ BankDataTSVParser.java의 내부 메서드 및 필드들은 서로 응집도가 높다고 볼 수 있으며, 내부 응집도가 높다고 표현

이렇게 하나의 클래스 내부에 있는 멤버(Member)들끼리는 높은 응집도를 가지는 것이 이상적인 구조이며, 관리가 더 편리하기 때문

Last updated on