- ํ์ต๋ชฉํ : ์ ์์ ๋ถํ์ค ํ๋ ์์ํฌ(eGovFramework)๋ก ์ ์๋ ํ๋ก์ ํธ์์ CRUD ๊ตฌํํ๋ ๋ก์ง์ ๋ฐฐ์
- ๊ฐ๋ฐ์์ ๊ฐ์
- ๊ฒ์๊ธ CRUD
- ํ์ผ CRUD
๐ก(๋ณธ ๋ฌธ์๋ ๊ฐ๋ฐ์์ ๊ฐ์, ํ๋ฉด URL ์ฐ๊ฒฐ, ๊ทธ๋ฆฌ๊ณ ๊ฒ์๊ธ CRUD - READ ๊น์ง๋ง ์์ฑ, ๋๋จธ์ง ๊ฒ์๊ธ CUD ์ ํ์ผ CRUD ๋ ๋ค์ ๋ฌธ์์ธ CRUD - II, CRUD - III ์์ ๋ค๋ฃธ)
์๋ ๋ก์ง์ ๋ฐ๋ผ JSP(jQuery, JSTL), SQL, Spring Framework ๋ฅผ ๋ค๋ฃธ
1-2-1. ๊ธ/ํ์ผ ๋ชฉ๋ก์กฐํ (READ)
1-2-2. ๊ธ/ํ์ผ ๋ฑ๋ก (CREATE)
1-2-3. ๊ธ/ํ์ผ ์์ (UPDATE)
1-2-4. ๊ธ/ํ์ผ ์ญ์ (DELETE)
[๊ณต์ง์ฌํญ] ๊ธฐ๋ฅ ๊ตฌํ์ ์์๋ก, ๊ฒ์๊ธ CRUD ๋ก์ง ์ ๋ฆฌ
-
๊ธฐ๋ณธ์๋ฆฌ : [๊ณต์ง์ฌํญ] ํ๋ฉด์์ ๋ณด์ฌ์ค HTML ์ ์ฐ๊ฒฐํด์ฃผ๋ ์์
-
์ธ๋ถ์๋ฆฌ : [๊ณต์ง์ฌํญ] ํ๋ฉด URL http://localhost/mngNot/notice.do ์์ /mngNot/notice.do ๋ถ๋ถ์ Java๋จ(Controller)๊ณผ JSP๋จ์ผ๋ก ๋ฐ์์ค๋ ์์
-
์์ ์์
-
Java๋จ
-
๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ
-
Navigator ํญ
/src/main/java/kr/happyjob/study์์ ๋ง์ฐ์ค ์ค๋ฅธ์ชฝ New ๋๋ฅด๊ณ/mngNotํด๋ ์์ฑ -
/mngNot๊ณผ ๊ฐ์ ๋จ์ ์๋/sampleํด๋์์ 4๊ฐ ํ์ ํด๋๋ค(/controller,/dao,/model,/service) ๋ณต์ฌํ๊ณ/mngNot๋ด๋ถ์ ๋ถ์ฌ๋ฃ๊ธฐ -
/mngNot/controller๋ด๋ถ์ ์์ฑ๋์ด ์๋.javaํ์ผ๋ช ๊ณผ ํด๋น ํ์ผ ๋ด๋ถ public class ์ด๋ฆ, @RequestMapping ์์ญ์ ๊ตฌํํ๋ ค๋ ํ๋ฉด์ ๋ง์ถฐ์ ์์
-
-
JSP๋จ
-
Java๋จ
/mngNot/controller๋ด๋ถMngNotController.javaํ์ผ๋ก ๋์๊ฐ์, @RequestMapping ํ๋จ return ๊ฐ์ ์๋ก ์์ฑํ JSP ํ์ผ๋ช (/mngNot/noticelist)์ผ๋ก ๋ณ๊ฒฝ
-
๐กFlow : ์ปจํธ๋กค๋ฌ(
Controller.java) โก๏ธ ์๋น์ค(Service.java) โก๏ธ ๋ค์ค(Dao.java) โก๏ธ SQL(Mapper.xml)
2-2-1. READ
-
JSP๋จ (
/view/mngNot/noticelist.jsp)<script>๋ด๋ถ JS ์ฝ๋ ์ ๋ฆฌํ๋ ์์-
Pagination ๊ตฌํ์ ์ํ ์ค๋น
-
JS ์ฝ๋ ์ต์๋จ์ ํ ํ์ด์ง๋น ๋ ์ฝ๋ ๋ช ๊ฐ ๋ณด์ฌ์ค ๊ฒ์ธ์ง ๊ธฐ๋ฅํ๋ ๋ณ์(pageSize), ํ์ด์ง๋ค์ด์ ํญ๋ชฉ ๋ช ๊ฐ ์์ฑํ ๊ฒ์ธ์ง ๊ธฐ๋ฅํ๋ ๋ณ์(pageBlockSize) ์ ์ธ
// ํ์ด์ง ์ค์ var pageSize = 10; var pageBlockSize = 5;
-
-
function fRegisterButtonClickEvent()-
sample_comncod.jsp์ ์์ฑ๋์ด ์๋ ๋ฒํผ ์ด๋ฒคํธ ํจ์ -
ํจ์ ๋ด๋ถ
e.preventDefault()์ฝ๋๋ ์ง๊ธ๊น์ง ์ด๋ฒคํธ์ ๋์ ๋ ์คํ์กฐ๊ฑด์ ์ ๋ถ ์ทจ์ํ๋ผ๋ ์๋ฏธ
-
-
Onload event
-
Onload event ๋ ๋ธ๋ผ์ฐ์ ์ HTML ๋ฟ๋ฆฐ ์งํ์ ์ํ๋ฅผ ์๋ฏธ. ์๋์ ๊ฐ์ด ํ๋ฉด Onload ์, ๋ฒํผ ์ด๋ฒคํธ ๋ฑ๋ก ํจ์(
fRegisterButtonClickEvent()) ์ ๊ฒ์๊ธ ๋ชฉ๋ก์กฐํ ํจ์(fn_noticelist()) ์คํ๋ ์ ์๋๋ก ๋ก์ง ๊ตฌํ/** OnLoad event */ $(function() { // ๋ฒํผ ์ด๋ฒคํธ ๋ฑ๋ก fRegisterButtonClickEvent(); // ์ฝ๋ ํ๋จ์์ ์ ์ธํ function fn_noticelist() ๋ Onload ์ ๋ฏธ๋ฆฌ ์ ์ด์ฃผ๊ธฐ fn_noticelist(); });
-
-
function fn_noticelist()์ ์ธ-
JSP ์ Controller ๊ฐ ์ปค๋ฎค๋์ผ์ด์ ํ ์ ์๋๋ก Ajax ๋ฅผ ํ์ฉํ๋๋ฐ, ์ง๊ธ ์ฐ๋ฆฌ๊ฐ ์ฐ๋ ํ๋ก์ ํธ์
/src/main/webapp/WEB-INF/resource/js/commonAjax.jsํ์ผ ์์ ์ด๋ฐ ์ปค๋ฎค๋์ผ์ด์ ์์ ์ ์ํด ๊ณตํต๋ชจ๋ ๋ง๋ค์ด ๋์๊ฒ ์์ -
/js/commonAjax.js์์ function callAjax ์ฝ๋ ์ฒซ ์ค(callAjax(url, method, dataType, async, param, callback)) ๋ณต์ฌํด์function fn_noticelist()์ตํ๋จ์ ๋ถ์ฌ๋ฃ๊ณ , ํ๋ฉด ๊ตฌํ์ ํ์ํ ์์์ผ๋ก ์ปค์คํ ํ๊ธฐfunction fn_noticelist(pagenum) { pagenum = pagenum || 1; var param = { delyn : $("#delyn").val() , searchKey : $("#searchKey").val() , sname : $("#sname").val() , pageSize : pageSize , pageBlockSize : pageBlockSize , pagenum : pagenum } var listcollabck = function(returnvalue) { console.log(returnvalue); $("#listnotice").empty().append(returnvalue); var totalcnt = $("#totalcnt").val(); console.log("totalcnt : " + totalcnt); var paginationHtml = getPaginationHtml(pagenum, totalcnt, pageSize, pageBlockSize, 'fn_noticelist'); console.log("paginationHtml : " + paginationHtml); $("#noticePagination").empty().append( paginationHtml ); } /* /js/commonAjax.js ์์ ๊ฐ์ ธ์จ callAjax() */ callAjax("/mngNot/noticelist.do", "post", "text", false, param, listcollabck); }
-
-
-
Java ๋จ - Controller (
/mngNot/controller/MngNotController.java)-
@RequestMapping("noticelist.do") ๋ถ๋ถ ์ ๊ท ์์ฑ
-
Pagination ๊ธฐ๋ฅ์ SQL๋ฌธ์์ LIMIT ๋ฉ์๋(MySQL ์๋ง ์์) ํ์ฉ
-
์๋ฅผ ๋ค์ด LIMIT 0, 10 ์ 0๋ถํฐ 10๊น์ง ๋ ์ฝ๋ ๋ฝ์์ด
-
์๋์ ๊ฐ์ ๊ท์น์
int pageindex = (pagenum - 1) * pageSize;์ด๋ ๊ฒ ์ปจํธ๋กค๋ฌ ํ์ผ์ ์ฝ๋๋ก ๋ฐ์Query (MySQL) Logic ( pageindex)1 page LIMIT 0, 10 [(1-1)*10 ๋ถํฐ 10๊น์ง] 2 page LIMIT 10, 20 [(2-1)*10 ๋ถํฐ 20๊น์ง] 3 page LIMIT 20, 30 [(3-1)*10 ๋ถํฐ 30๊น์ง] N ( pagenum) page... [(N-1)*10 ๋ถํฐ pageSize๊น์ง]
@RequestMapping("noticelist.do") public String noticelist(Model model, @RequestParam Map<String, Object> paramMap, HttpServletRequest request, HttpServletResponse response, HttpSession session) throws Exception { logger.info("+ Start " + className + ".noticelist"); logger.info(" - paramMap : " + paramMap); // ํ์ด์ง๋ค์ด์ ๋ก์ง ๊ตฌํ int pagenum = Integer.parseInt((String) paramMap.get("pagenum")); int pageSize = Integer.parseInt((String) paramMap.get("pageSize")); int pageindex = (pagenum - 1) * pageSize; paramMap.put("pageSize", pageSize); paramMap.put("pageindex", pageindex); // Controller Service Dao SQL List<NoticeModel> noticesearchlist = mngNotService.noticelist(paramMap); int totalcnt = mngNotService.countnoticelist(paramMap); model.addAttribute("noticesearchlist", noticesearchlist); model.addAttribute("totalcnt", totalcnt); logger.info("+ End " + className + ".noticelist"); return "mngNot/noticelistgrd"; } }
-
-
-
Java ๋จ - Model (
/mngNot/model/NoticeModel.java)-
SELECT๋ฌธ์ผ๋ก ๋ฝ์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ๊ทธ๋ฆ(VO๋ชจ๋ธ) ๋ง๋๋ ์์
-
Controller ์์ ์ค์ค์ด ์กฐํํ ๊ฒ์ ๋ชจ๋ธ์ ๋ด์์ JSP ์ ๋์ง๋ ์๋ฆฌ
-
์ด ํ์ผ์์ private ์ผ๋ก ์ ์ธ๋ ํจ์๋ค์ ํน์ ํด๋์ค ๋ด๋ถ์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅ. ๋ฐ๋ผ์ ์ธ๋ถ์์ ์์๊ฐ์ผ๋ก ์ฐธ์กฐํ ์ ์๊ฒ ํ๋ ค๋ฉด public ์ผ๋ก ์ ์ธํด์ผ ํจ
-
์ฐ์
/study/system/model/NoticeModel.javaํ์ผ ๊ฐ์ ธ์์ ์ฝ๋ ๊ตฌ์กฐ ์ดํด๋ณด๊ธฐ -
ํ๋ฉด์์ ํ์ฉํ๋ ค๋ ๋ฐ์ดํฐ ์ปฌ๋ผ๋ช ๊ณผ ์๋ฃํ์ ๋ณต๋ถํด์จ
NoticeModel.javaํ์ผ ๋ด๋ถ >public class NoticeModel{}์ค๊ดํธ ๋ด๋ถ์private String notice_del_yn;์ ํ์์ผ๋ก ๋์ด > ๋ชจ๋ธ๋ก ์์ฑํ๋ ค๋ ๋ถ๋ถ๋ง ๋๋๊ทธ > Eclipse IDE ์๋จ Source ํด๋ฆญ > Generate Getters and Setters... ํด๋ฆญํ๋ฉด ์๋์ผ๋ก ๋ชจ๋ธ ์์ฑํ ์ด๋ธ์ VARCHAR ๋ฐ์ดํฐํ์ ์ผ๋ก ์์ ์ปฌ๋ผ์
Model.java์String์ผ๋ก, ํ ์ด๋ธ์ INT ๋ฐ์ดํฐํ์ ์ผ๋ก ์ก์ ์ปฌ๋ผ์Model.java์int๋ก ์ ๋ ฅpackage kr.happyjob.study.mngNot.model; public class NoticeModel { // ๋ณดํต์ ์ด๋ ๊ฒ private ์ ์์ชฝ์ ์ ๋ ฅํ๊ณ , private String notice_del_yn; private String loginID; private int notice_no; private String notice_title; private String notice_date; private String notice_cont; private int file_no; private String file_name; private String logic_path; private String physic_path; private int file_size; private String exten; private String name; // Generate Getters and Setters... ์์ ๊ฒฐ๊ณผ๋ฅผ ์๋์ชฝ์ ์ ๋ ฅ public String getNotice_del_yn() { return notice_del_yn; } public void setNotice_del_yn(String notice_del_yn) { this.notice_del_yn = notice_del_yn; } public String getLoginID() { return loginID; } public void setLoginID(String loginID) { this.loginID = loginID; } public int getNotice_no() { return notice_no; } public void setNotice_no(int notice_no) { this.notice_no = notice_no; } public String getNotice_title() { return notice_title; } public void setNotice_title(String notice_title) { this.notice_title = notice_title; } public String getNotice_date() { return notice_date; } public void setNotice_date(String notice_date) { this.notice_date = notice_date; } public String getNotice_cont() { return notice_cont; } public void setNotice_cont(String notice_cont) { this.notice_cont = notice_cont; } public int getFile_no() { return file_no; } public void setFile_no(int file_no) { this.file_no = file_no; } public String getFile_name() { return file_name; } public void setFile_name(String file_name) { this.file_name = file_name; } public String getLogic_path() { return logic_path; } public void setLogic_path(String logic_path) { this.logic_path = logic_path; } public String getPhysic_path() { return physic_path; } public void setPhysic_path(String physic_path) { this.physic_path = physic_path; } public int getFile_size() { return file_size; } public void setFile_size(int file_size) { this.file_size = file_size; } public String getExten() { return exten; } public void setExten(String exten) { this.exten = exten; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
-
-
Java ๋จ - Service (
/mngNot/service/MngNotService.java)-
Service ํ์ผ๋ช , ๋ด๋ถ ์์ค์ฝ๋ ์์
package kr.happyjob.study.mngNot.service; import java.util.List; import java.util.Map; import kr.happyjob.study.mngNot.model.NoticeModel; public interface MngNotService { /** ๋ชฉ๋ก ์กฐํ */ public List<NoticeModel> noticelist(Map<String, Object> paramMap) throws Exception; /** ๋ชฉ๋ก ์นด์ดํธ ์กฐํ */ public int countnoticelist(Map<String, Object> paramMap) throws Exception; }
-
Java ๋จ - Controller (
/mngNot/controller/MngNotController.java)-
๋ค์ Controller ํ์ผ๋ก ๋์๊ฐ์ @Controller ๋ฐ๋ก ์ ๋ถ๋ถ์ ์๋์ ๊ฐ์ด ๋ชจ๋ธ, ์๋น์ค import
-
public class MngNotController๋ด๋ถ์ @Autowired (ํด๋์ค๋ฅผ ์ ์ญ๋ณ์๋ก ๋ง๋ค์ด์ฃผ๋ ํจ๊ณผ) ์์ฑimport kr.happyjob.study.mngNot.model.NoticeModel; import kr.happyjob.study.mngNot.service.MngNotService; @Controller @RequestMapping("/mngNot/") public class MngNotController { @Autowired MngNotService mngNotService; // Set logger private final Logger logger = LogManager.getLogger(this.getClass()); // Get class name for logger private final String className = this.getClass().toString(); ...
-
-
-
Java ๋จ - Impl (
/mngNot/service/MngNotServiceImpl.java)-
๋ด๊ฐ ์์ฑํ ํด๋์ค์ ๋น์ ์ด ์ด๋์ธ์ง ์ ์ธํด์ฃผ๋ ์์
-
@Service : ์ฌ๊ธฐ๊ฐ ์๋น์ค๋ผ๊ณ ์คํ๋ง ํ๋ ์์ํฌ์๊ฒ ์๋ ค์ฃผ๋ ๊ฒ
-
๋ค์๋จ๊ณ์์ ์์ฑํ Dao ํ์ผ๊ณผ ์ฐ๊ฒฐ๋๋๋ก
@Autowired MngNotDao mngNotDao;์์ฑpackage kr.happyjob.study.mngNot.service; import java.util.List; import java.util.Map; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import kr.happyjob.study.mngNot.dao.MngNotDao; import kr.happyjob.study.mngNot.model.NoticeModel; @Service public class MngNotServiceImpl implements MngNotService { // Set logger private final Logger logger = LogManager.getLogger(this.getClass()); // Get class name for logger private final String className = this.getClass().toString(); @Autowired MngNotDao mngNotDao; /** ๋ชฉ๋ก ์กฐํ */ public List<NoticeModel> noticelist(Map<String, Object> paramMap) throws Exception { return mngNotDao.noticelist(paramMap); } /** ๋ชฉ๋ก ์นด์ดํธ ์กฐํ */ public int countnoticelist(Map<String, Object> paramMap) throws Exception { return mngNotDao.countnoticelist(paramMap); } }
-
-
Java ๋จ - Dao (
/mngNot/dao/MngNotDao.java)-
public interface MngNotDao๋ด๋ถ์ ์ ์ด์ฃผ๋ ์ด๊ธฐ ์ธํ ์ฝ๋๋ ์๋น์ค์ ๊ฒฝ์ฐ์ ๋์ผpackage kr.happyjob.study.mngNot.dao; import java.util.List; import java.util.Map; import kr.happyjob.study.mngNot.model.NoticeModel; public interface MngNotDao { /** ๋ชฉ๋ก ์กฐํ */ public List<NoticeModel> noticelist(Map<String, Object> paramMap) throws Exception; /** ๋ชฉ๋ก ์นด์ดํธ ์กฐํ */ public int countnoticelist(Map<String, Object> paramMap) throws Exception; }
-
-
SQL ๋จ (
/src/main/resources/sql/MngNot/MngNotMapper.xml)-
์์ค์ฝ๋ ํ์ผ ์ต์๋จ
<mapper>namespace ์ ์๋์ ๊ฐ์ด MngNotDao ์ฐพ์๊ฐ๋๋ก ๊ฒฝ๋ก ๋ง์ถค<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="kr.happyjob.study.mngNot.dao.MngNotDao">
-
๊ฒ์๊ธ ๋ชฉ๋ก์กฐํํ๋
<SELECT>์ id (noticelist) ๋ฃ๊ณ , resultType ๋NoticeModel์ฐพ์๊ฐ ์ ์๊ป๋ ๋ณ๊ฒฝ -
Toad ํ์ฉํ์ฌ SQL ์ฟผ๋ฆฌ๋ฌธ ์์ฑ. ์ฟผ๋ฆฌ๋ฌธ์ด ์์ฑ๋๋ฉด ๋ณต์ฌํด์
<SELECT>๋ด๋ถ์ ๋ณต๋ถ -
JSP๋จ์์
<input>์ผ๋ก ๊ตฌํํ ๊ฒ์ ๊ธฐ๋ฅ์ ๋ณธ ํ์ผ<SELECT>์์ Mybatis ๋ฌธ๋ฒ<where>,<if>,<choose>,<otherwise>ํ์ฉํ์ฌ ์์ฑ<!-- ๋ชฉ๋ก ์กฐํ --> <select id="noticelist" resultType="kr.happyjob.study.mngNot.model.NoticeModel"> /*kr.happyjob.study.mngNot.dao.MngNotDao.noticelist*/ select nt.notice_del_yn ,nt.loginID ,nt.notice_no ,nt.notice_title ,nt.notice_date ,nt.notice_cont ,nt.file_no ,fi.file_name ,fi.logic_path ,fi.physic_path ,fi.file_size ,fi.exten ,ui.name from tb_notice nt inner join tb_userinfo ui on ui.loginID = nt.loginID left outer join tb_file fi on fi.file_no = nt.file_no <where> <if test="(delyn != null) and (!delyn.equals(''))"> and nt.notice_del_yn = #{delyn} </if> <if test="(sname != null) and (!sname.equals(''))"> <choose> <when test="searchKey eq 'writer'.toString()"> and ui.name Like CONCAT('%', #{sname}, '%') </when> <when test="searchKey eq 'title'.toString()"> and nt.notice_title LIKE CONCAT('%', #{sname}, '%') </when> <otherwise> and ( ui.name Like CONCAT('%', #{sname}, '%') or nt.notice_title LIKE CONCAT('%', #{sname}, '%') ) </otherwise> </choose> </if> </where> ORDER BY nt.notice_date DESC LIMIT #{pageindex}, #{pageSize} </select>
-
์ฐธ๊ณ ๋ก
Mapper.xmlํ์ผ์ ์ธ๋ถ์์ ๋ณต์ฌํด์ ํ๋ก์ ํธ ํด๋์ ๊ฐ์ ธ์ค๊ฑฐ๋, ๊ธฐ์กด์ ์กด์ฌํ๋Mapper.xmlํ์ผ ๋ด์ฉ์ ์์ ํ๋ ๊ฒฝ์ฐ, ํฐ์บฃ์ด ์๋์ผ๋ก ์ปดํ์ผํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ Eclipse IDE ์์ ์๋(๊ฐ์ ) ์ปดํ์ผ ์์ ์ ํด์ค์ผํจEclipse IDE ์๋จ Project ํด๋ฆญ > Clean ํด๋ฆญ
Eclipse IDE ํ๋จ Server ํญ ํญ๋ชฉ ๋ง์ฐ์ค ์ค๋ฅธ์ชฝ > Clean > Server Run (์ฌ๊ธด ์ปดํ์ผ ์ํฉ์ ์๋ฒ์ ๋ฐ์ํ๋ ๋จ๊ณ)
-
-
Java ๋จ - Controller (
/mngNot/controller/MngNotController.java)- ๋ง์ง๋ง ๋จ๊ณ, ๋ฐ์ดํฐ ๋ฟ๋ ค์ฃผ๊ธฐ ์์
- Controller ํ์ผ ๋ด
public String noticelist์์return "mngNot/noticelist";์return "mngNot/noticelistgrd";๋ก ๋ณ๊ฒฝ
-
JSP๋จ (
/view/mngNot/noticelistgrd.jsp)noticelist.jsp์ ๊ฐ์ ํด๋์noticelistgrd.jspํ์ผ ์์ฑ (/system/comGrdCodeList.jsp๊ฐ์ ธ์ค๊ณ , ์กฐ๊ฑด์ ๋ง๊ฒ ํ์ผ๋ด์ฉ ์์ )
