SpringHomework2 - BBoyun/homework2 GitHub Wiki
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๋ก ๊ฐ๊ฒ ๋๋ฉด
๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ ํ๋ฉด์ด ๋์ค๊ฒ ๋๋ค.