Repository navigation
SpringHomework2
Spring MVC 프레임워크를 활용한 종합정보 시스템 홈페이지 구현
- 프로그램 설명
- 프로그램 구현 및 동작 순서에 따라서 실행되는 코드설명
이 프로그램은 종합정보 시스템에서 학점 조회 및 수강신청 기능을 구현한 프로그램으로,
다음 4가지 기능을 수행 할 수 있다.
1.1 학기별 이수 학점 조회 기능 : 학기별 이수학점 조회와 상세보기를 통해 학기별 세부 이수 과목을 보여준다.
1.2 이수 구분별 학점 조회 기능 : “교필” ,“핵교A” ,“핵교B”,"일교","자율", “전지”, “전선”, “전기” 구분별 학점 조회를 볼 수 있다.
1.3 수강 신청 기능 :2018 학년도 1학기 수강 신청을 할 수 있다.
1.4 수강 신청 조회 기능 : 수강 신청 내역을 확인 할 수 있다.
2.1 홈페이지에 접속
Tomcat에 의해 서버가 작동하면 맨처음 "home.jsp" 파일이 실행되어 처음 화면이 나타난다.
각 목록별로 ${pageContext.request.contextPath}/url"로 지정해 놓았다.
-
학기별 이수 학점조회 : ${pageContext.request.contextPath}/semesterSearch
-
구분별 학점 조회 : ${pageContext.request.contextPath}/classificationSearch
-
수강 신청하기 : ${pageContext.request.contextPath}/enrollment
-
수강 신청 조회 : ${pageContext.request.contextPath}/enrollmentSearch
2.2 웹페이지 인증 여부 체크
웹페이지에서 4가지 항목 모두 인증 여부를 묻는다.
예를 들어, 첫번째 항목인 "학기별 이수 학점 조회"를 누르면 아래와 같은 로그인 창이 나타난다.
잘못된 아이디와 패스워드를 입력하였을 경우 아래와 같은 창이 나타난다.
서버에 인증된 아이디와 패스워드를 입력한다.
인증이 완료되면 다시 초기화면으로 돌아가고, 하단에 logout 버튼이 생긴다.
logout 버튼에 마우스를 갖다 대면 초록색으로 변한다.

logout 버튼을 누르면 정상적으로 logout이 된다.
2.3 학기별 이수 학점 조회를 눌렀을 때
home.jsp에서 Controller의 @RequestMapping("/semesterSearch") 부분을 찾아 해당 메소드가 동작한다.
이 메소드에서는 courseService 객체에 getCurrent()를 불러서 courses 라는 Course 타입의 리스트에 저장하고,
semesterSearch.jsp 파일에 courses 라는 이름과 courses 리스트를 model에 담아서 보내준다.
courseService 객체는 CourseService클래스를 인스턴스화 한것이다.
CourseController에서 CourseService를 이용하고 CourseService에서는 CourseDAO를 이용하여,
DAO에서 sqlStatement를 통해서 DataBase 에 접근하고 가져온 결과 데이터들을 최종적으로는 Controller 가 받아 사용한다.
Controller 에서는 semesterSearch.jsp 파일로 이동과 함께 model 객체에 Course 리스트를 담아 같이 보내주고,
semesterSearch.jsp에서는 학년/학기별로 이수 총학점을 보여준다.
다음은 semesterSearch.jsp코드의 일부이다.
jstl을 사용하여 작성된 semesterSearch.jsp 페이지를 통해 결과적으로 다음과 같이 페이지 출력이 된다.
위의 테이블에는 링크가 있는데 각 링크별로 ${pageContext.request.contextPath}/url을 통해 상세보기가 가능하다.
ex) 2013 년도 1학기 링크 클릭
위의 메소드는 2013 년 1학기 만을 보여주는 메소드로, courseService를 이용하여 getDetail 메소드를 호출하였다.
getDetail 메소드는 년도와 학기를 인자로 받아 courseDao 객체의 getCoursesDetail 메소드를 호출한다.
courseDao 객체의 getCoursesDeatil 메소드도 년도와 학기를 인자로 받아 DB의 년도와 학기 조건문으로 데이터를 가져온다.
다음 코드는 CourseDAO 클래스의 getCoursesDetail 메소드 내용이다.
전달해 줄 타입은 Integer.class 나 String.class처럼 spring에서 지정되어있지 않으므로 CourseMapper 클래스를 만들어준다.
다음은 CourseMapper 클래스이다.
Course 빈 객체에 DB에서 가져온 내용값들을 넣어주고 Course 객체타입으로 리턴해준다.
이 과정을 통해 컨트롤러에서 가져온 데이터는 detailView.jsp 화면에 상세 내역이 나타난다.
아래는 2017년 2학기의 링크를 클릭했을 때 나타나는 모습이다.
2.3 이수 구분별 학점 조회를 눌렀을 때
home.jsp에서 Controller의 @RequestMapping("/classificationSearch")부분을 찾아 해당 메소드가 동작한다.
이 메소드를 보면 아래의 동작으로 나뉜다.
- sum(총학점)을 선언
- 각 이수 구분 별 학점을 courseService 객체를 통해 가져와 더하는 동작
- credits 라는 HashMap을 만들어 각 이수 구분별로 학점을 더하는 동작
동작 수행 후 model 객체에 credits를 credits 라는 이름으로 추가 한다음 classificationSearch.jsp에 전달한다.
다음은 courseService 객체의 getCredits 메소드 이다.
courseService 객체는 CourseDAO 클래스에 getCreditbyClassification 메소드를 사용한다.
이 메소드를 살펴보면 DB에서 아래의 sql 문을 통해 인자로 받은 classification 별로 더해주는 동작을 한다.
이러한 과정을 통해 classificationSearch.jsp 에는 최종적으로 다음과 같은 화면이 나타나게 된다.
2.4 수강 신청하기를 눌렀을 때
home.jsp에서 Controller의 @RequestMapping("/enrollment")부분을 찾아 해당 메소드가 동작한다.
enrollment 메소드에서는 model 에 빈 객체를 생성해 저장하고 enrollment.jsp 에 갈 때 같이 model을 보내준다.
- 위의 메소드를 통하여 다음과 같은 수강신청 화면이 나타난다.
-
잘못된 형식을 입력한 경우
-
올바른 형식을 입력한 경우
다음과 같이 각 항목별 데이터를 입력하고 수강신청 버튼을 누르면 입력했던 내용들이 DB로 넘어가게 된다.
그 과정을 살펴보면, 수강 신청을 눌렀을 때 action=“${pageContext.request.contextPath}/doenrollment”(아래 화면)을 통해 Controller 의 RequestMapping(“/doenrollment”) 되있는 메소드의 작업이 수행되게 된다.
그 메소드를 살펴보면
courseService객체의 insert메소드를 이용하여 데이터를 데이터베이스에 넣는 것을 볼 수 있다.
위와 같은 메소드에는 insert, update, delete가 있다.
CourseDAO 클래스안의 insert 메소드를 보면 다음과 각 필드 (year,semester,subjectCode,subject,classification,grade) 의 값들을 course객체로부터 가져와 넣어주고, 이 필드값을 DB 에 반영시키는 일을 한다.
다음과 같은 과정을 통해서 실제로 DB 상에 반영되는 모습을 보면 다음과 같다.
-
기존에 입력한 DB 내용
-
DB에 반영된 후 ('스프링테스트' 과목 추가)
또한 데이터 베이스 상에 제대로 반영이 되었을 때 웹상에서 나오는 결과 화면은 다음과 같다.
이렇게 입력된 데이터가 올바르게 입력되었는지 확인시켜주는 검증 작업이 필요하다.
Controller 에 @Valid annotation 에 의해 form 데이터 안에 내용이 제대로 입력되었는지 알려주는 역할을 하고,
에러가 있다면 그 결과값을 BindingResult 객체의 result 에 넣어주게 된다.
만약 에러가 있다면 ( if(result.hasErrors()) ) 다시 입력 창으로 돌아가고,
그렇지 않다면 DB에 입력을하고 입력이 완료된 창을 보여주는 메소드이다.
만약 form 데이터 안에 내용이 제대로 입력되지 않아서 다시 입력창으로 돌아갔을 때,
기존의 올바르게 입력했던 내용들도 전부 다 사라져 버리는 것을 방지하기 위해 Data Buffering 이라는 것을 사용한다.
Data Buffering을 사용하기 위해서는 spring form을 사용해야 한다.
<%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form"%> 를 통해 라이브러리를 다운받아온다.
위 사진 맨 아래줄을 보면 <sf:errors cssClass="error" path="year"></sf:errors>을 볼 수 있는데,
이것은 에러가 났을 때 각각의 입력창 아래에 무엇이 잘못 되었는지를 알려주기위해 필요하다.
그리고 path=“이름”을 통해 이름을 갖는 속성값으로 바인딩에 사용된다.
이러한 과정들을 통해 Data Binding , Data Validation , Data Buffering 이 이루어 질 수 있다.
2.5 수강 신청 조회 메뉴를 눌렀을 때
${pageContext.request.contextPath}/enrollmentSearch에 의해 Controller에
@RequestMapping(“enrollmentSearch”) 인 메소드가 동작하게 되는데 메소드는 다음과 같다.
위 메소드에서는 courseService 객체의 getCurrent 메소드를 이용하여 가져온 Course데이터를 courses 리스트 안에 넣고
enrollmentSearch.jsp 페이지로 갈 때 model 에 넣어주어 보내는 기능을 한다.
CourseService 클래스의 getCurrent 메소드에서는 CourseDAO 클래스의 getCourses() 메소드를 이용하는데 이 메소드는 다음과 같다.
getCurrent 메소드에서는 데이터베이스에 모든 내용을 가져와 리턴해주는 메소드이다.
이런과정을 통해 가져온 데이터를 Controller에서 model 에 담고 enrollmentSearch.jsp로 가게 되면
다음과 같은 결과 화면이 나오게 된다.