지난 학습 :
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 |