앞에서 다뤘던 웹페이지 작성기술을 이용해서, 실제로 쓸만하고 유용한 웹페이지 프로그래밍을 해보자.
작성해볼 것은 '수능대비, 연습용 수학문제 출제 프로그램'이다.
2005년~2015년까지 교육과정평가원에서 출제한 900개의 문제(30회분)를 데이터베이스로 만들고, 웹 페이지에서 사용자의 선택(기간, 출제단원 등)에 의해 PDF형태의 시험지가 만들어지는 프로그램.
데이터를 수집하고 가공하는데 시간이 많이 걸릴 것이고, PDF 파일을 생성하기 위해서 iText라는 외부패키지를 이용해야하는 등, 꽤 난이도가 있는 프로젝트가 될 것이다.
작성 순서는, [설계] -> [개발]
이번 장에서는 [설계]를 하자.
1. 요구사항 정의
구현해야할 기능은 다음과 같다.
- 웹페이지를 통해 사용자가 출제기간, 월, 단원 등을 선택할 수 있다.
- 사용자는 시험출제 기간별로 무작위로 선택된 30개의 문제로 구성된 시험지를 만들 수 있다.(출제 옵션1)
- 사용자는 연도 및 월(6,9,11월)을 선택해서 해당 시험지를 만들 수 있다. (출제 옵션2)
- 사용자는 출제영역을 선택해서 시험지를 만들 수 있다. (출제 옵션3)
- 시험지는 PDF로 다운로드 된다.
- 사용자는 작성된 시험지에 매칭되는 답안지를 PDF로 출력할 수 있다.
제약 조건들은 다음과 같다.
- 데이터는 교육과정평가원의 2005년도분~1015년도분까지 10년간 데이터 사용(6월, 9월 11월)
- 문과 대상(나형, A형) 시험문제만을 대상으로 함
- 연도표시는 수능표기형태로 한다. 즉, 2015년도분이면 실제 시험이 치뤄진 연도는 2014년
2. 화면 정의
사용자는 웹 브라우저를 통해서 어떤 문제를 출제할 지 선택할 수 있음.
화면 구조는 다음과 같음.
각각의 옵션별로 '문제생성' 버튼이 있고, 이 버튼을 누르면 문제지와 답지가 PDF파일로 자동 다운로드 되는 구조.
3. 프로그램 구조
프로그램 구조는 다음과 같다.
genMathProblem.html
위 '화면 정의'에서 보이는 화면을 구현한 html파일
사용자가 웹브라우저를 통해 이 파일을 열게되고, 여기서 시험지 생성에 필요한 선택사항(기간 등)을 입력하고 '입력 완료'버튼을 누르게 된다.
그러면, 선택한 정보가 전달되면서 JSP파일이 실행
genMathProblem.jsp
jsp파일에서는 genMathProblem.html에서 선택된 정보들(연도, 월 등)을 가지고 ProbGenerator클래스 객체를 생성하고, 그 객체의 generate() 메서드를 호출해서 시험지와 답안지를 얻어낸다.
ProbGenerator.java
jsp에서 호출되는 클래스로, 순수 java로 만들게 되는 클래스이다.
이 클래스에서는 jsp로부터 넘겨진 정보들(연도, 월 등)을 가지고 PDF형태의 시험지와 답안지를 만들어 낸다.
- MySQL에 접속
- 문제리스트 생성: jsp로부터 넘겨받은 정보와 MySQL의 su_master테입를 정보를 이용
- 문제리스트를 이용해서 PDF형태의 시험지와 답안지 생성: PDF생성을 위해 iText패키지 이용
- 실제 문제들은 하나하나씩 그림파일로 저장되어 있고, 그 경로를 su_master가 가지고 있음
4. DB 구조
'su_master'라는 하나의 테이블만 존재한다.
엑셀형태로 본 데이터구조는 다음과 같다.
각 칼럼별 설명.
칼럼 |
타입 |
비고 |
id |
int |
AUTO_INCREMENT PRIMARY KEY |
office |
varchar |
출제기관: '평가원' |
year |
int |
출제연도: 2005-2015 |
month |
int |
출제월: 6,9,11 |
prob_num |
int |
문제번호: 1-30 |
answer |
int |
정답 |
difficulty |
int |
난이도:6(최상) 5(상) 4(중상) 3(중) 2(중하) 1(하) |
point |
int |
배점:2-4 |
answer_rate |
int |
정답률: 0-100 |
folder_name |
varchar |
문제이미지가 저장된 폴더이름 |
file_name |
varchar |
문제이미지 파일이름 |
subject |
int |
출제영역: 11-64 |
위 칼럼중에서 subject는 출제영역을 나타내는데, 십의 자리는 대 영역, 일의자리는 소영역으로해서, 문제가 어는 영역에서 출제되었는지를 나타낼 수 있게 한다.
subject의 대구분(십의 자리)
십의 자리 |
출제영역(대 영역) |
1 |
수학I(문과) |
2 |
미적분과 통계 기본(문과 |
3 |
수학I(이과) |
4 |
수학II(이과) |
5 |
기하와 벡터(이과) |
6 |
적분과 통계(이과) |
sujject의 소구분(일의 자리)
십의자리 |
일의자리 |
출제영역(소 영역) |
1 | 1 | 행렬과 그래프 |
2 | 지수함수와로그함수 | |
3 | 수열 | |
4 | 수열의 극한 | |
2 | 1 | 함수의 극한과 연속 |
2 | 다항함수의 미분법 | |
3 | 다항함수의 적분법 | |
4 | 확률 | |
5 | 통계 | |
3 | 1 | 행렬과 그래프 |
2 | 지수함수와 로그함수 | |
3 | 수열 | |
4 | 수열의 극한 | |
4 | 1 | 방정식과 부등식 |
2 | 삼각함수 | |
3 | 함수의 극한과 연속 | |
4 | 미분법 | |
5 | 1 | 일차변환과 행렬 |
2 | 이차곡선 | |
3 | 공간도형과 공간좌표 | |
4 | 벡터 | |
6 | 1 | 적분법 |
2 | 순열과 조합 | |
3 | 확률 | |
4 | 통계 |
이제 대략, 필요한 설계를 마쳤다.
다음 장부터는 개발이다.
-끝-
'프로그래밍 > 웹 프로그래밍' 카테고리의 다른 글
06. 웹 페이지를 퍼블릭하게 오픈하기 (0) | 2015.02.02 |
---|---|
05. HTML -> JSP -> Java Class (0) | 2015.01.30 |
04. HTML 페이지에서 사용자입력정보 받아서 JSP 실행하기 (0) | 2015.01.28 |
03. JSP로 MySQL 데이터 다루기 (0) | 2015.01.15 |
02.MySQL 다루기 (0) | 2015.01.12 |