게시판 그룹 쓰기/수정은 게시판 새 글 쓰기/수정과 동일하다.
사용자가 입력한 값을 받아서
새 번호(그룹 - bgno)를 부여하고 INSERT 문을 실행하거나
그룹 번호가 있으면 UPDATE문으로 수정하면 된다.
다만, 댓글처럼 Ajax로 처리하기 때문에
JavaScript가 많이 사용된다.
더욱이 HTML Radio를 사용하면서
작성해야 하는 코드가 조금 더 많아져 복잡해 보인다.
다음 코드를 보면 일반적인 Ajax 사용과 같다.
function fn_groupSave(){ if($("#bgname").val() == ""){ alert("게시판 이름을 입력해주세요."); return; } var bgno =null; if (selectedNode!=null) bgno =selectedNode.data.key;
if (!confirm("저장하시겠습니까?")) return;
$.ajax({ url: "boardGroupSave", cache: false, type: "POST", data: { bgno:$("#bgno").val(), bgname:$("#bgname").val(), bgparent: bgno, bgused : $("input:radio[name=bgused]:checked").val(), bgreadonly : $("input:radio[name=bgreadonly]:checked").val(), bgreply : $("input:radio[name=bgreply]:checked").val()} }).done(receiveData4Save); } |
BoardGroupList.jsp
selectedNode는 트리의 노드가 선택되면 발생하는 이벤트(onActivate)에서
선택된 노드를 가지고 있도록 한 전역변수이다.
따라서, selectedNode에 값이 있으면
게시판 그룹 수정이고(bgno 값 존재), 없으면 신규가 된다.
사용자가 노드를 선택하면
선택한 노드가 selectedNode에 지정되고
입력상자(input)의 ID가 bgno에도 값이 저장된다.
저장할 데이터를 구성하여 boardGroupSave를 호출하면
게시판과 유사한 다음 SQL문으로 저장하게 된다.
<insert id="insertBoardGroup" parameterType="gu.board9.BoardGroupVO" > <selectKey resultType="String" keyProperty="bgno" order="BEFORE"> SELECT IFNULL(MAX(BGNO),0)+1 FROM TBL_BOARDGROUP </selectKey> INSERT INTO TBL_BOARDGROUP(BGNO, BGNAME, BGUSED, BGREPLY, BGREADONLY, BGPARENT, BGDELETEFLAG, BGDATE) VALUES (#{bgno}, #{bgname}, #{bgused}, #{bgreply}, #{bgreadonly}, #{bgparent}, 'N', NOW() ) </insert>
<update id="updateBoardGroup" parameterType="gu.board9.BoardGroupVO"> UPDATE TBL_BOARDGROUP SET BGNAME=#{bgname}, BGUSED=#{bgused}, BGREPLY=#{bgreply}, BGREADONLY=#{bgreadonly} WHERE BGNO=#{bgno} </update>
|
board9.xml
SQL문은 별도의 이름을 부여했지만
서비스(DTO)의 이름은 게시판 글쓰기/수정과 이름이 같다(insertBoard).
insertBoard에서는 게시판과 같이 그룹번호(bgno) 값이
없으면 신규 등록 (INSERT)
있으면 수정(UPDATE)을 실행한다.
public void insertBoard(BoardGroupVO param){ if ("".equals(param.getBgparent())) param.setBgparent(null); if (param.getBgno()==null || "".equals(param.getBgno())) sqlSession.insert("insertBoardGroup", param); else sqlSession.insert("updateBoardGroup", param); } |
BoardGroupSvc.java
이렇게 처리한 뒤 컨드롤(boardGroupSave)에서는
Json 형태(ObjectMapper)로 저장한 그룹 정보를 반환한다(bgInfo).
신규일경우는 MyBatis가 글번호를 반환 받아서 bgInfo에 저장해서 반환한다(selectKey).
@RequestMapping(value = "/boardGroupSave") public void boardSave(HttpServletResponse response, BoardGroupVO bgInfo){ boardSvc.insertBoard(bgInfo); ObjectMapper mapper = new ObjectMapper(); response.setContentType("application/json;charset=UTF-8"); try { response.getWriter().print( mapper.writeValueAsString(bgInfo)); } catch (IOException ex) { System.out.println("오류: 게시판 그룹에 문제가 발생했습니다."); } } |
BoardGroupCtr.java
컨트롤이 반환한 정보(bgInfo)는
클라이언트에서 Ajax 호출시 지정된 receiveData4Save 함수에 파라메타(data)로 넘겨 진다.
선택된 노드(selectedNode)가 있거나(!==null),
선택된 노드의 수정이면(선택된 노드와 반환된 데이터의 키 값이 같으면)
선택된 노드의 제목이 수정될수 있어서 무조건 수정해준다.
IF문 처리를 해도 되지만 간단한 데이터 변경이라 무조건 하도록 했다.
function receiveData4Save(data){ if (selectedNode!==null && selectedNode.data.key===data.bgno) { selectedNode.data.title=data.bgname; selectedNode.render(); } else { addNode(data.bgno, data.bgname); } alert("저장되었습니다."); } |
BoardGroupList.jsp
수정이 아닌 경우
즉, 최상위 노드에 추가(선택 노드 없음, selectedNode===null)하거나
선택노드의 자식 노드를 추가할 경우
(선택노드와 반환된 데이터 키 값이 다르면, selectedNode.data.key!==data.bgno)
새로운 노드를 생성해서 추가해 준다 (addNode).
addNode함수의 내용은 다음과 같다.
dynatree의 사용법으로 별도의 설명을 하지 않으니 찾아보길 바라고
선탠된 노드($("#tree").dynatree("getActiveNode"))가 있으면
자식으로 추가하고
없으면 최상위($("#tree").dynatree("getRoot"))에 추가한다.
function addNode(nodeNo, nodeTitle){ var node = $("#tree").dynatree("getActiveNode"); if (!node) node = $("#tree").dynatree("getRoot"); var childNode = node.addChild({key: nodeNo, title: nodeTitle}); node.expand() ; node.data.isFolder=true; node.tree.redraw(); } |
BoardGroupList.jsp