Project: Implementing a Simple Database Application Due: 2019/02/15 (Fri), 11:59 PM
이번 프로젝트의 목표는 데이터베이스를 이용하는 간단한 어플리케이션을 설계하고 구현하는 것이다. Python 및 pymysql 을 이용하여 대학교 원서 접수를 시뮬레이션 하는 간단한 어플리케이션을 만들어 본다. 이번 프로젝트를 통해 학생들은 어플리케이션과 데이터베이스를 연동하는 방법을 배우게 된다.
1 요구 사항
• 데이터는 관계형 데이터베이스에 저장되어야 한다.
• 각 컬럼의 타입은 2 장에 명시된 대로 정의하여야 한다.
• 학교 데이터 및 학생 데이터를 추가/삭제할 수 있어야 한다.
• 학교 데이터 및 학생 데이터를 출력할 수 있어야 한다.
• 학생이 학교에 원서 접수를 할 수 있어야 한다
• 학교 별로 합격이 예상되는 학생의 명단을 출력할 수 있어야 한다.
• 학생 별로 합격이 예상되는 학교의 명단을 출력할 수 있어야 한다.
2 데이터 타입
- 학교
- 학교 ID: 정수 (Primary key)
- 이름: 문자열 (최대 200 자)
- 정원: 정수 (1 이상의 값)
- 군: 문자열 (대문자 ‘A’, ‘B’, ‘C’ 중 1 개의 값을 가져야 함)
- 최소 점수: 정수 (0 이상의 값)
- 내신 성적 반영 비율: 실수 (0 이상의 값)
- 학생
- 학생 ID: 정수 (Primary key)
- 이름: 문자열 (최대 200 자)
- 수능 성적: 정수 (0 이상 400 이하의 값)
- 내신 성적: 정수 (0 이상 100 이하의 값)
3 세부 사항 구현한 프로그램은 다음과 같은 기능을 할 수 있어야 한다.
- 모든 학교 정보 출력
- 모든 학교의 정보를 출력한다.
- 학교 ID, 이름, 정원, 군, 최소 점수, 내신 성적 반영 비율, 지원자 수 순으로 출력
- 모든 학생 정보 출력
- 모든 학생의 정보를 출력한다.
- 학생 ID, 이름, 수능 성적, 내신 성적 순으로 출력
- 학교 추가
- 새로운 학교를 추가한다.
- 이름(String), 정원(int), 군(char), 최소 점수(int), 내신 성적 반영 비율(float)을 순서대로 입력 받음
- 학교 삭제
- 학교를 삭제한다.
- 학교 ID(int)를 입력 받음
- 학교를 삭제하면 해당 학교에 관련된 원서 접수 내역도 모두 삭제되어야 함
- 해당 학교가 없다면 에러 메시지 출력
- 학생 추가
- 새로운 학생을 추가한다.
- 이름(String), 수능 성적(int), 내신 성적(int)을 순서대로 입력 받음
- 수능 성적, 내신 성적이 정해진 범위를 벗어난다면 에러 메시지 출력
- 학생 삭제
- 학생을 삭제한다.
- 학생 ID(int)를 입력 받음
- 학생을 삭제하면 관련된 원서 접수 내역도 모두 삭제되어야 함
- 해당 학생이 없다면 에러 메시지 출력
- 원서 접수
- 학생을 학교에 원서접수한다.
- 학생 ID(int) 및 학교 ID(int)를 입력 받음
- 학교의 정원보다 더 많은 학생이 지원할 수 있음
- 한 학생은 각 군마다 최대 1 개의 학교에 지원할 수 있음. (예: A 군에 속하는 두 개의 학교에 동시에 지원할 수 없음)
- 학생이 그 학교에 지원할 수 없는 경우에는 에러 메시지 출력
- 학교에 지원한 학생 목록 출력
- 학교에 지원한 모든 학생의 정보를 출력한다.
- 학교 ID(int)를 입력 받음
- 해당 학교에 지원한 학생의 정보를 출력한다.
- 학생 ID, 학생 이름, 수능 성적, 내신 성적 순으로 출력
- 해당 학교가 없다면 에러 메시지 출력
- 학생의 원서 접수 목록 출력
- 학생이 지원한 모든 학교의 정보를 출력한다.
- 학생 ID(int)를 입력 받음
- 해당 학생이 지원한 학교의 정보를 출력한다.
- 학교 ID, 이름, 정원, 군, 최소 점수, 내신 성적 반영 비율, 지원자 수 순으로 출력
- 내신 성적 반영 비율은 소수점 셋째 자리에서 반올림하여 출력한다.
- 해당 학생이 없다면 에러 메시지 출력
- 학교의 예상 합격자 목록 출력
- 학교에 지원한 학생들 중, 합격이 예상되는 학생의 정보를 출력한다.
- 학교 ID(int)를 입력 받음
- 합격이 예상되는 학생의 정보를 출력한다.
- 학생 ID, 학생 이름, 내신 성적, 수능 성적 순으로 출력
- 합격 여부는 종합 점수 순으로 결정된다고 가정한다. 종합 점수란 수능 성적과 내신 성적을 각 학교 별로 정해진 내신 성적 반영 비율을 고려하여 합한 값이다.
- 예: 수능 성적이 300, 내신 성적이 100 인 학생이 내신 반영 비율 1.2 인 학교에 지원한다면 종합 점수는 300 + 100 * 1.2 = 420 이 됨
- 종합 점수가 동점이라면 내신 성적이 높은 학생을 우선으로 한다.
- 수능 성적과 내신 성적이 모두 동점인 지원자가 있어 정원을 초과할 경우, 정원의 10% 를 초과하지 않는다면 모두 합격 처리한다. 그렇지 않다면 모두 불합격 처리한다.
- 이 때, 소수점 단위는 올림한다. 즉, 정원이 91 명인 학교에서는 10 명을 초과하는 것까지 허용된다.
- 단, 순위가 정원 이내에 들었더라도 종합 점수가 학교 별로 정해진 최소 점수 미만이라면 불합격 처리한다.
- 해당 학교가 없다면 에러 메시지 출력
- 학생의 예상 합격 대학 목록 출력
- 학생이 지원한 학교들 중, 합격이 예상되는 학교의 정보를 출력한다.
- 학생 ID(int)를 입력 받음
- 합격이 예상되는 학교들의 정보를 출력한다
- 학교 ID, 이름, 정원, 군, 최소 점수, 내신 성적 반영 비율, 지원자 수 순으로 출력
- 해당 학생이 없다면 에러 메시지 출력
- 프로그램 종료
- 데이터베이스 리셋 및 생성
- 기존 모든 테이블 및 데이터가 존재할 경우 삭제
- 2 장에서 정의한 데이터 타입에 해당하는 새로운 테이블 생성
- 삭제 실시 전 확인 메시지를 띄우고 y/n 사용자 입력을 받아야 함
기타 사항
- 입력 시 각 입력의 데이터 타입은 지켜진다고 가정 (예: 정원의 입력으로 String 이 들어오지 않음)
- 학교 ID, 학생 ID 는 공연장, 공연, 관객이 삽입될 때마다 자동 부여
- 1 부터 시작
- AUTO_INCREMENT 옵션을 사용할 것
- 입력이 데이터 타입에 정의된 값의 범위를 벗어난다면 에러 메시지 출력
- 단, 문자열의 경우 최대 길이(200 자)보다 길다면 200 자로 truncate 할 것
- 프로그램 종료 명령을 제외한 명령을 실행한 뒤에는 다음 명령을 입력받는 상태로 돌아가도록 함
- 여러 개의 입력을 받는 경우, 입력을 차례로 받다가 특정 입력에 대해 에러가 있을 시 그 즉시 에러 메시지를 출력하고 해당 명령을 종료함.
- 모든 출력은 첫 번째 컬럼에 대해 오름차순으로 정렬되어야 함
4 실행 예시
============================================================ 1. print all universities 2. print all students 3. insert a new university 4. remove a university 5. insert a new student 6. remove a student 7. make an application 8. print all students who applied for a university 9. print all universities a student applied for 10. print expected successful applicants of a university 11. print universities expected to accept a student 12. exit 13. reset database ============================================================ Select your action: 1 -------------------------------------------------------------------------------- id name capacity group cutline weight applied -------------------------------------------------------------------------------- 1 Seoul Nat'l Univ. 100 B 400 0.2 0 2 Nakseong Univ. 80 A 300 0.1 0 --------------------------------------------------------------------------------
Select your action: 2 -------------------------------------------------------------------------------- id name csat_score school_score -------------------------------------------------------------------------------- 1 Ahn Yeonchan 330 87 2 Kim Jihoon 369 84 --------------------------------------------------------------------------------
Select your action: 3 University name: Cheomseong Univ. University capacity: 123 University group: C Cutline score: 350 Weight of high school records: 0.7 A university is successfully inserted.
Select your action: 5 Student name: Choe Byeongseo CSAT score: 288 High school record score: 100 A student is successfully inserted.
Select your action: 1 -------------------------------------------------------------------------------- id name capacity group cutline weight applied -------------------------------------------------------------------------------- 1 Seoul Nat'l Univ. 100 B 400 0.2 0 2 Nakseong Univ. 80 A 300 0.1 0 3 Cheomseong Univ. 123 C 350 0.7 0 --------------------------------------------------------------------------------
Select your action: 2 -------------------------------------------------------------------------------- id name csat_score school_score -------------------------------------------------------------------------------- 1 Ahn Yeonchan 330 87 2 Kim Jihoon 369 84 3 Choe Byeongseo 288 100 --------------------------------------------------------------------------------
Select your action: 7 Student ID: 2 University ID: 3 Successfully made an application Select your action: 7 Student ID: 3 University ID: 1 Successfully made an application
Select your action: 1 -------------------------------------------------------------------------------- id name capacity group cutline weight applied -------------------------------------------------------------------------------- 1 Seoul Nat'l Univ. 100 B 400 0.2 0 2 Nakseong Univ. 80 A 300 0.1 0 3 Cheomseong Univ. 123 C 350 0.7 1 --------------------------------------------------------------------------------
Select your action: 10 University ID: 3 -------------------------------------------------------------------------------- id name csat_score school_score -------------------------------------------------------------------------------- 2 Kim Jihoon 369 84 --------------------------------------------------------------------------------
Select your action: 11 Student ID: 3 -------------------------------------------------------------------------------- id name capacity group cutline weight applied -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
Select your action: 12 Bye!
5 개발 환경 • Python 3.5+ • MySQL DB 접속 정보 Host: 자신에게 할당된 서버 (ds[1-5].snu.ac.kr) 각 조의 조장의 project DB 를 활용하고, 어떤 자리의 DB 를 사용하였는지 보고서에 명시 ID: 조장의 id (예: ds3_1) 비밀번호: 조장의 비밀번호 DB name: 조장의 id_project (예: ds3_1_project) 6 채점
- 구현 완성도 (80%)
- 기능 완성도 (60%)
- 1 단계: 데이터베이스 리셋 및 스키마 생성 (10%)
- 해당 기능: 13
- 데이터베이스에 있는 데이터와 테이블이 모두 삭제되었는지
- 설계한 스키마대로 테이블에 create 되는지
- 2 단계: 데이터의 단순 입출력 (20%)
- 해당 기능: 1 ~ 6
- 데이터를 DB 로부터 정확하게 retrieve 하여 표시할 수 있는지
- 주어진 인풋대로 데이터 레코드를 생성하여 DB 에 저장하고 있는지
- 지정한 데이터 레코드를 삭제할 수 있는지
- 3 단계: DB 와 Application 의 복합적 연동 (30%)
- 해당 기능: 7 ~ 11
- 잘 설계된 데이터베이스 스키마와 integrity constraint 를 활용하여 명시된 기능을 잘 수행하도록 구현하였는지
- 적합한 데이터베이스 스키마 설계 (20%)
- 데이터베이스 스키마 설계가 문제 해결에 적절한지
- 불필요한 중복이 없고 효율적인지
- 레포트 (20%)
- 하루 Delay 마다 -10%, 3 일 Delay 시 0 점 처리
7 제출
- Runnable python script 파일 파일명: main.py
- DB (중요!) 프로젝트 제출시 채점을 위해 자신의 DB 계정 안의 테이블 스키마만 남기고 레코드는 모두 truncate 해야 함 이를 지키지 않았을 시 채점이 제대로 되지 않아 0 점 처리 될 수 있으니 주의!
- 리포트 파일명: PRJ_조이름.pdf (예: PRJ_12 조.pdf) 반드시 pdf 포맷으로 제출 포함되어야 하는 내용 핵심 모듈과 알고리즘에 대한 설명 구현한 내용에 대한 간략한 설명 (제시된 요구사항 중 구현하지 못한 부분이 있다면) 구현하지 못한 내용 가정한 것들 컴파일과 실행 방법 프로젝트를 하면서 느낀 점 위의 3 가지 파일을 압축하여 lecture@europa.snu.ac.kr 로 제출 파일명: PRJ_조이름.zip (예: PRJ_12 조.zip) 메일 제목: [DB Project] 조이름 – 조원 이름 1, 조원 이름 2, 조원 이름 3 (예: [DB Project] 12 조 – 홍길동, 김철수, 김영희) 8 References pymysql https://readthedocs.org/projects/pymysql/ HeidiSQL http://www.heidisql.com/