* 한빛미디어+O'REILLY의 Real-World Software Development (실전 자바 소프트웨어 개발)의
실습내용을 정리한 것이다.
책택배를 받고나서 바로 다음날이 마침 주말이라, 바로 실습해봤다.
이 책을 한마디로 표현하자면 멈출 수 없는 맛...🤣
첫번째 실전 자바 소프트웨어 실습,
[ 입출금 내역 분석기 ]
정리 내용
1. 프로젝트 구조
2. 실습에서 배운 것
3. 도전과제 해결
4. 앞으로 더 알아가야 할 것
1. 프로젝트 구조
이번 실습한 입출금내역 분석기의 큰 구조다.
.
.
[ 큰 실습 흐름 ]
맨 처음에는 하나의 메인클래스에 모든 기능을 넣어보는 실습을 했다. (KISS)
이때, god class 문제와 코드 중복 문제를 만나보았다.
단일책임원칙(SRP)에 따라서, '파싱기능'과 '계산기능'을 메인에서 분리해주었다.
이때, '파싱기능'을 하는 클래스에 기능이 비슷한 메서드를 그룹화했다. 응집도(cohesion)↑
그 다음에는 결합도(coupling)을 제거하기 위해서, 인터페이스를 사용했다.
=> Main클래스와 CSVParser클래스의 결합도를 제거하여 유지보수를 용이하게 했다.
테스트코드의 이유를 알고, 테스트 실습을 했다.
이 과정에서 JUnit 프레임워크의 Assertion 구문을 이용해봤다.
실습에 사용 : Assert.fail(), Assert.assertEquals()
2. 실습에서 배운 것
좋은 소프트웨어 개발 기반 중에서
- 단일 책임 원칙
- 코드의 품질을 유지하기 위한 응집도, 결합도
이것들은 단순히 줄글로만 만났던 개념이었는데,
직접 구현하며 실습해보니까 의미가 더 체감되었다.
+ 실습에서 만나본 것들
▶ 클라이언트의 요구사항을 구현하면서,
프로젝트 동작 구조가 조금 더 익숙해지는 실습이었다!
- CSV파일을 처리하기 위한 파싱인터페이스, 파싱구현클래스
- Analyzer 클래스에서 analyze()는 내부에서 분석을 진행한다.
1. 파싱 처리 / 2. 계산결과 부르기
파싱을 처리하기 위해 Parser 객체를 처음부터 매개변수로 받는다.
또한 내부적으로는 collectSummary()를 부르고 있는데,
이 메서드는 계산을 처리하는 Processor 객체를 인자로 받고 있다.
Processor 객체는 생성할 때 파싱결과를 넘겨받으며 new로 생성된다.
▶ 메인클래스에 모든 것(입력, 파싱, 결과출력)이 혼합되어 있을 때, 단일책임 원칙을 적용했다.
이때, 책임은 다음과 같이 분리했다.
1. 입력 읽기 (Analyzer의 analyze()에서 처리)
2. 주어진 형식의 입력 파싱 (analyze()내부에서 Parser 인터페이스를 불러서 처리)
3. 결과 처리 (parsing된 결과는 Processor 객체에 저장)
4. 결과 요약 리포트
(analyze()내부에서 collectSummary(Processor)를 불러서 Processor를 통해 처리)
▶ CRUD를 구현하는 DAO(data access object) 클래스!
아직 DAO클래스를 사용해보지는 않았지만,
CRUD 구현을 DAO에서 했구나..! 정도를 인식했다.
▶ 테스트 자동화의 장점
(요약: 확신이 서고, 프로젝트를 이해, 변화 대처에 강함)
- JUnit 프레임워크의 Assert 이용해보기
- 유닛테스트 설정해보기
- 코드커버리지라는 것
상세한 내용은 개인 원노트에 정리해두었다.
3. 도전과제 해결
이건 내일 해봐야지
4. 앞으로 더 알아가야 할 것
실습하면서 더 해봐야겠다 싶었던 것 or 다음에 배우게 될 것들은..
* 메이븐, 그레이들로 프로젝트 구성하기 (실습 중 언급됨)
* 테스트 코드 실습은 더 다양하게 해보고 싶다. 아직 2개밖에 못해봤다.
* 결합도를 제거하는 다른 다양한 경우도 만나보고 싶다.
* 커버리지는 아주 간단하게 개념만 접했는데, 실제로 확인해보고 싶다.
또한 분기커버리지, 구문커버리지가 아직은 체감까지 안 된다.
2022. 03. 26. 토요일
도전과제 빼고 [ 실습 + 실습후 정리 ] 끝
(요즘은 구글 캘린더에 일정체크하는 맛에 산다)
'JAVA' 카테고리의 다른 글
실전 JAVA 소프트웨어 개발 | 입출금 내역 분석기 확장 실습하기 (0) | 2022.04.06 |
---|---|
JAVA 코테 | Scanner, println → BufferedReader/Writer | 시간초과로 입출력 변경 (0) | 2022.03.28 |
열거 타입, 열거 상수란? | 열거타입(enum) 변수 | enum, enumeration type (0) | 2021.07.03 |
클래스의 정렬(대소판정)기준 | comparable, compareTo, comparator, compare | 자연정렬(natural ordering) (0) | 2021.06.28 |
[Java] String.format() | 문자열 형식 지정하기 | %%%ds가 뭘까? | %% (0) | 2021.06.24 |