실전 JAVA 소프트웨어 개발 | 입출금 내역 분석기 확장 실습하기

2022. 4. 6. 21:48·JAVA

지난 학습 :

2022.03.26 - [JAVA/자바 학습] - 실전 Java 소프트웨어 개발 | 입출금 내역 분석기 실습하기

 

 

이번에는 지난시간(챕터2)의 입출금내역 분석기를 확장하면서, JAVA소프트웨어 개발의 다른 원칙을 배운다.

 

[ 입출금 내역 분석기 - 확장 ]

정리 내용

1. 확장된 프로젝트 구조

2. 실습에서 배운 것

3. 도전과제 해결

4. 앞으로 더 알아가야 할 것

 


1. 확장된 프로젝트 구조

 

 

기존 클래스의 구조도 개선하긴 했는데 일단 덮어두고,

아예 새롭게 추가한 클래스는 이렇다.

 

Validator : 읽어온 데이터에 대한 검증(예외처리)을 하는 Validator

Notification : 예외 내용은 여기에 기록해둔다.

 

함수형 인터페이스 Filter : 비슷한 메서드(month월에 amount이상 거래 내역 리턴)들의 코드 중복을 피하고,  Filter 인터페이스를 상속해서 특정 거래내역을 선택하는 filter를 구현해 쓰도록 한다.

=> 개방/폐쇄 원칙 적용 & 반복로직과 비즈니스로직의 결합도 제거

BankTransactionsInFebruaryAndExpensive : 딱봐도 너무 장황한 클래스다. 함수형 인터페이스 Filter를 구현한 클래스인데, 굳이 이렇게 기능마다 일일이 구현 클래스를 두는 건 장황하다. 그래서 실습에서는 그런 방식 말고, 람다식으로 위 함수형 인터페이스를 구현했다. (내용 참고 : https://xxxelppa.tistory.com/48)

 

Summarizer 인터페이스 : 그냥 Processor에서 어떤 결과를 요약해서 보여줄 때 사용하는 인터페이스다. summary() 메서드가 아주 간단하게 정의되어있어서, 만약 메서드에 double이 들어오면 그냥 double을 반환한다.

SummaryStatistics : 위 Summarizer 인터페이스의 summary()를 이용할 때의 문제점이, 원시적으로 double을 그대로 반환해 사용한다는 것이다. 그래서 SummaryStatistics 클래스라는 '새로운 도메인 클래스'개념을 만들어서 요약정보를 보여주기로 한다.

 

Exporter : 요약 정보를 어떠한 데이터 형식으로 '내보내기'하기 위하여 정의한 인터페이스다.

HtmlExporter : 위 인터페이스의 구현클래스로, Html형식으로 요약정보를 내보내기하는 기능이다.

 

 


2. 실습에서 배운 것

 

- 개방 폐쇄 원칙

- 인터페이스를 '잘' 정의하는 방법에 대한 약간의 이야기

- 예외 처리 관련 좋은 방법, 나쁜 방법

- 빌드 도구 사용의 이유

 

핵심 : 개방 폐쇄 원칙의 중요성을 직접 실습해보았다.

아직까지는 그 의미가 아주 크게 와닿지는 않는데, 개방 폐쇄 원칙이 무엇인지 감은 잡힌다.

 

.

.

 

 

+ 실습 흐름 정리

 

▶ 비슷한 기능을 하는 메서드를 복붙해서 파라미터 등만 조금조금 수정했을 때의 문제점을 배웠다. 이전 챕터에서도 이런 코드중복문제는 피하라고 강조했다. 만약 해당 코드들의 로직을 변경하고 싶을 때, 손봐야 할 것들이 너무 많아지기 때문이다. 이런 상황에 개방 폐쇄 원칙을 적용해야 한다. 코드를 유지보수할 때, 코드를 직접 건들지 않고 동작을 변경할 수 있도록 인터페이스를 이용해주자. 복붙한 메서드들에는 반복로직과 비즈니스로직이 결합되어 있는데, 인터페이스를 중간에 끼워넣으면 그런 결합도를 제거할 수 있다! 결국, 변경 없이도 (closed) 확장성은 개방된다 (open). 

 

 

▶ 개방 폐쇄 원칙을 지키고자 인터페이스를 정의할 때, 어느 선에서 정의해야 하는가도 고민해야할 문제다. 너무 세밀하게 정의하면 anti-cohesion이게 된다! 또한 너무 여러 인터페이스로 쪼개면 필요한 기능을 찾기도 어려워서 유지보수가 힘들다. 적정 수준으로 알아서 잘 결정하도록 하자!

또한 메서드를 어느 정도로 구체적으로 정의할 것이냐도 판단 문제다. "명시적 API제공 vs 암묵적 API제공" 양측 모두 장단점이 있으니, 합리적으로 잘 판단하도록 하자. 예를 들면 자주 사용하는 세부기능은 유저가 쉽게 이해하면서 사용할 수 있도록 명시적 API로 처리하는 것이 합리적일 것이다.

 

 

▶ 반환하는 데이터 형식에 관한 이야기다. 만약 원시값인 double을 그대로 반환할 경우 활용도가 낮고 유지보수도 번거로워질 수 있다. 해결책은 새로운 도메인 클래스를 만들어 쓰는 것이다. 도메인의 다양한 개념간 결합을 줄이고, 요구사항이 바뀔 때 연쇄적으로 코드가 바뀌는 일도 최소화할 수 있다. 도메인 객체를 만들었다면, 이러한 객체의 내용을 어떤 형식으로 내보내기할지도 생각해볼 수 있다. 내보내기는 다양한 데이터 형식으로 할 수 있고, 필요에 맞게 내보내기 기능을 구현해 쓰면 된다! 이때, 인터페이스를 사용해서 개방폐쇄원칙을 지키고, 다양한 내보내기 기능을 편하게 구현할 수 있도록 하자. 

 

 

▶ 예외 처리에 대해서도 배웠다. 나는 메서드에서 던지는 throws 또는 try/catch문 정도의 개념, 그리고 RuntimeException에 대해서만 알고 있었다. 그런데 여기서는 조금 더 자세하고 실무적인 이야기를 하는 것 같다. 대다수의 예외는 미확인 예외로 지정하고, 꼭 필요할 때만 확인된예외로 지정해서 불필요한 코드를 줄여야 한다고 이야기한다. 그리고 데이터를 검증할 때 예외처리 하는 또다른 방법을 배웠다. 단순히 검증코드를 이곳저곳에 추가하기보다는 전용 Validator 클래스를 만들기를 권하고 있다 (∵SRP를 따른다). 이때 Validator 클래스에서 항상 과도히 세밀하거나 과도히 러프하게 예외처리하지 않도록 주의해야 한다. 그걸 돕는 것이 Notification pattern이다. 이 패턴에서는 '도메인 클래스'로 오류를 수집한다. 실습에서는 Notification 클래스에 addError() 메서드를 만들어서 Validator 클래스에서 오류를 수집하도록 구현했다. 

 

 

 


3. 도전과제 해결

1. JSON, XML 등 다양한 데이터 형식으로 내보내는 기능을 추가해보자.

2. 입출금 내역 분석기에 기본 GUI를 추가해보자.

 

아직 해결 전이다.

1번을 해결하자니 JSON과 XML에 무식해서 당장 해결하는 건 시간을 너무 크게 쓸 것 같다.

2번은 실자소 책을 끝내고 생각해보아도 좋을 것 같다.

 

 


4. 앞으로 더 알아가야 할 것

도전과제에서 기본 GUI를 추가해보라고 했는데, 아예 기반지식이 없어서 방법을 모르겠다. 언제끔 내가 구현한 소프트웨어에 GUI를 추가해볼 수 있을까? 

 

실전 JAVA 소프트웨어 개발 책을 따라하며 실습하기가 어느새 2번째이다. 

첫번째 실습할때는 이해가 다소 느렸다. 프로젝트 구조도 눈에 한번에 안 들어오고..

두번째 실습해보니까 이제는 프로젝트 구조가 전보다 빠르고 쉽게 다가온다.

첫번째 실습을 겪은 뒤로 10일이나 지났는데도 살짝 익숙하게 남아있나보다!

 

하지만 아직 초보인 건 확실하고 스스로 프로젝트 구조를 구성해보지도 않았다.

학기중에 실자소 책을 한권 다 실습해보고,

여름방학 초입에는 실자소에서 배운 원칙들을 잘 지켜가며 어떤 프로젝트를 구성해보고싶다. 

내 희망은 Spring으로 웹프로젝트를 하나 간단하게 해보는 것이다. 종강 직후에!!

 

 

코로나 확진으로 격리중이라 대면수업을 가지 못했다 ㅠㅠ

 

반응형

'JAVA' 카테고리의 다른 글

웹개발 집중학습용으로 블로그 개설  (0) 2022.07.19
오버라이딩 반환타입 불일치? 상속관계면 반환타입이 달라도 된다  (0) 2022.07.19
JAVA 코테 | Scanner, println → BufferedReader/Writer | 시간초과로 입출력 변경  (0) 2022.03.28
실전 Java 소프트웨어 개발 | 입출금 내역 분석기 실습하기  (0) 2022.03.26
열거 타입, 열거 상수란? | 열거타입(enum) 변수 | enum, enumeration type  (0) 2021.07.03
'JAVA' 카테고리의 다른 글
  • 웹개발 집중학습용으로 블로그 개설
  • 오버라이딩 반환타입 불일치? 상속관계면 반환타입이 달라도 된다
  • JAVA 코테 | Scanner, println → BufferedReader/Writer | 시간초과로 입출력 변경
  • 실전 Java 소프트웨어 개발 | 입출금 내역 분석기 실습하기
히어로맛쿠키
히어로맛쿠키
  • 히어로맛쿠키
    yeny_lab
    히어로맛쿠키
  • 전체
    오늘
    어제
    • 분류 전체보기 (389)
      • 미분류글 (32)
        • ㅇ (2)
      • JAVA (84)
        • Effective Java (1)
        • Application (21)
      • 컴퓨터구조 & OS (28)
      • 자료구조 + 알고리즘 (43)
      • Database (12)
      • 컴파일러 (10)
      • 수학 (33)
        • 미분방정식 (12)
      • 데이터분석과 머신러닝 (38)
      • 기타 (59)
      • yyeeennyy (25)
  • 공지사항

    • ^o^/♡
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
히어로맛쿠키
실전 JAVA 소프트웨어 개발 | 입출금 내역 분석기 확장 실습하기
상단으로

티스토리툴바