2021-03-01
project timeline : generateExams.jar
드디어 generateExams.jar (project problemshooter) 가 끝이 났다.
이 프로젝트를 이제 소개해보려고 한다!
프로젝트 기간 : Jan 10 - Feb 11 (32 days)
.
1) Object 구성 만들기
가장 초기엔 Problem, 메인 class ( 훗날 jar 의 entry-point), Iteration 으로 만들었다. 변화를 겪으며 Iteration 이 IterateIndex 로 대체되었다. Object 의 Attribute 를 어떻게 가지고 있어야 object 와 전체 프로젝트가 lightweight 해질까 고민했다. .
2) 주어진 소주제들 중에서 원하는 만큼 select 하기
이 부분이 예상외로 까다로웠다. instance 를 다 만들어서 그 중에서 뽑을지, 아님 숫자를 뽑고 그에 따라 필요한 instance 만 만들지. 숫자 고르는 것도 combination 을 구현하는데 꽤 애먹었다. loop 를 사용해서 간단히 구현하려니 exception handling 이 필수적이었다. .
3) 문제 읽어오기
문제 파일들은 어떤 시스템으로 구축할까 고민했다. web database 면 아주 유기적이고 좋겠지만 내가 할 줄 몰라서 못했다. 한 파일로 하자니 매번 파일 읽을 때 시간 불필요하게 잡아먹을 것 같았다. 그래서, 폴더를 단계적으로 (cascading system으로) 만들었다. 어짜피 각 문제들 다 입력해야 하니깐 각각 파일 만드는 입장에서도 risk 도 적고 구조적이어질 것 같았다. 파일 형식은 프로젝트에서 끊어 읽기 좋게 .csv 로 결정했다. (물론 다른 파일 형식도 어느정도 되게 if-else 로 짰다.) .
4) v1.0 문제 CLI 에 뿌리기
맨처음에 주문 받을 때 분명 GUI 로 클릭클릭 하듯이(Quizlet 마냥) 하는 어플리케이션을 만들어달라 주문을 받았다. 그런데 GUI 를 하려니 AWT 는 너무 구식이고, javafx 는 goorm.ide 에서 잘 안되었다. 군대에서 코딩하는 것이 이렇게 어렵다. 상황을 설명드리니 그냥 시험지 뽑듯이 만들어졌으면 좋겠다고 수정하셔서 CLI 로 문제와 답이 잘 뽑히는지 구현해보았다. 출제와 채점 두가지를 모두 구현해보았다. .
5) excecutable jar 로 publish 하기
처음에는 실행만 하면 (파일 목록이 정리되어있는) 텍스트 파일을 읽어와서 문제를 뽑는 식으로 구현했다. 그 파일은 이런 식이었다.
3,6,7,11 2,5,6,1
이렇게 써있으면, 7은 1단원(첫번째줄이니깐) 3소단원(그 줄에서 세번째 숫자니깐)에 문제가 7개 있다는 뜻이었다. 그런데 이렇게 하니깐 문제은행에 변동사항이 있으면 이 파일도 업대이트 해줘야 한다는 문제가 있었다. 또, 업데이트 된 파일을 프로그램이 다시 읽어와서 프로그램을 재개하는 식으로 하니, I/O 에서 너무 비효율 적이었다. (내용을 파일로 export 했다가 다시 읽어오는 식). 그래서 v2.0 은 파일을 유지하고, v3.0 부터는 파일 없이 구현하였다. .
6) 프로그램 flexibility exhancement
이제 거의 골격은 완성된 상태였다. 다만, 문제 수라던가 문제 은행 디렉토리 path 라던가 하는 것들이 프로그램 내 변수로 지정되어 있다 보니깐 고정적이었다 문제를 프로그램 테스트할땐 10문제로 지정했는데, 문제 은행 크기에 따라 40 문제가 필요할 수도 있고 2-3 문제만 필요할 수도 있겠다 싶었다. 이런 것을 사용자 취향에 따라 조절할 수 있도록, config.txt 파일을 만들어서 프로그램이 실행될 때 읽어서 attribute 를 유연하게 쓸 수 있게 했다. . Exception handling 도 했다. 나야 개발자라서 프로그램의 algorithm 을 아니깐 문제가 생기지 않게 잘 data 를 주겠지만, 사용자들은 그렇지 못하다. 그래서, 프로그램이 정상적으로 실행되지 않을 경우를 대비해서 try-catch 를 빡세게 짰다. 주로 일어날 법한 에러들도 미리 catch 해놓았다.
- error.txt, log.txt 를 만들어서 프로그램이 어떻게 구동되었는지 볼 수 있게 만들었다.
- 프로그램 중 어느부분에서 에러가 났는지 (잘 encapsulation 해서) error.txt 에 출력되게 했다. 혹시 생각지 못한 에러가 발견되면 연락할 개발자 연락처도 남겨놓았다.
- 어떻게 되던간에 안전하게 프로그램이 종료가 될 수 있도록 catch 했다.
. 이제 사용자들을 위해서 README 파일을 (.md 랑 .txt로) 작성했다. 이게 정말 귀찮은 작업이었다. 난 다 알고 있는 내용인데, 생판 모르는 사람도 잘 사용할 수 잇게 사용 설명서를 쓴다는 것이 쉽지 않았다. 아니, 무지막지하게 귀찮았다. 기본은 영어로 쓰고, 한글판은 갓파고의 힘을 빌렸다. .
7) 마지막 마무리
문제 선다가 4개 밖에 주어지지 않아도 돌아가도록(4지선다) loop 구조를 바꾸었다. 데이터들을 Arraylist 로 짠 것들을 최대한 배열(Array)로 바꾸었다. . 가장 오래 걸린 마무리작업은 한글패치화였다. 계속 영어로 작업해서 몰랐는데, 생각해보니 파일 내용들이 죄다 한글일 것 같아서 급히 패치를 냈다. 파일 내용도, 제목도, 디렉토리 이름도 다 한글을 받을 수 있게 설정하는 데 꽤 애먹었다. 읽어오는 건 잘 하는데 다른 한자로 읽기도 하고, charset 바꾸고 해보니 최초 읽어올 땐 잘하는데 다른 함수로 데이터를 보내니깐 깨지고... 이것 때문에 마지막 패치에 3-4시간이 걸렸다. .
맺음말
이렇게 만들어서 고객 앞에서 시연해드리니깐 겁나 좋아하셨다. 한번은 그거 고맙다고 빵도 사주고 초콜릿도 발렌타인데이라고 사다주셨다. . 여담으로, 사실 출력되는 파일을 .pdf 로 하고 싶어서 열심히 pdf 파일 내부구조도 공부하고 열심히 만들어보기도 했는데, 뭔가 깔끔하게 이쁘게 만드려면 너무 많은 것을 알아야 한다는 것을 깨달아버렸다. 그래서 java api 만들어진 것을 찾아봤는데, 한번도 다른 사람 것을 import 해서 쓴 적이 없어서 쓰지도 못했다. 이것도 배워봐야겠다. . 이번 프로젝트로 jar 파일도 처음 만들어보고, 배포도 처음 해보았다. exception handling 과 version control, efficiency 향상도 신경써보았다. . 이것을 계기로,java의 다른 실무적 사용을 배워보고 싶은 마음이 생겼다. 영어로 비교하자면, 생존영어는 할 줄 알았지만 써먹지를 않았던 내가 처음으로 단편 이야기를 쓴 셈이다. 이제 노래 가사도 써보고, 시도 써보고, 소설도 써보고, 기사도 써보고 여러가지로 해보고 싶다. .