일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 풀스택
- spring
- 회원가입
- 마이바티스
- 제이쿼리
- 오라클
- 웹페이지
- Linked List
- 웹개발
- 프론트엔드
- jQuery
- html5
- Ajax
- 웹서비스
- 비밀번호찾기
- mybatis
- MVC
- 네비게이터
- 백엔드
- dbms
- c programming
- Binding
- jsp
- 스프링
- 미로 생성 알고리즘
- 프레임워크
- 로그인
- 서블릿
- javascript
- css3
- Today
- Total
Programmer's Progress
도서 정보 제공 웹 서비스 - 게시글 삭제 본문

게시글 삭제 구현 과정을 설명하기 전에 짚고 넘어가야 할 것이 있다.
먼저 기존의 코드 중에서 새로운 게시글, 메시지 번호를 얻는 방법을 변경하였음을 밝힌다.
기존 방식은 이렇다.
SELECT NVL(MAX(article_id),0)+1 FROM free_board와 같이 현재 존재하는 게시글들 중에서
가장 게시글 번호가 큰 게시글의 번호 + 1을 새로운 게시글에 할당한다.
이 방식에는 큰 문제가 있었다.
1. 현재 게시글 목록에 번호가 1, 2, 3인 게시글들이 있고 각각 서로 다른 탭에서 참조하고 있다고 가정하자.
2. 첫 번째 탭에서 3번 게시글을 삭제하고, 다시 새로 게시글을 작성한다.
3. 두 번째 탭에서 기존 3번 게시글을 삭제하려고 하면, 이미 삭제된 게시글이 아닌, 2번 과정에서 작성한
새로운 게시글이 삭제가 된다. 즉, 게시글 번호 3에 대해 서로 다른 게시글들이 사용하여 발생하는 문제다.
더 큰 문제는 게시글의 수가 많아진다면 MAX집계 함수로 매번 게시글 번호를 얻는 것은 상당한 시간이 소요될 것이다.
이를 해결하기 위해 AUTO_INCREMENT, 시퀀스, 자동생성 시퀀스 등이 있으나, 오라클 11XE버전에서는
자동생성 시 퀀스는 지원하지 않는 것 같았다. 따라서 기본적인 시퀀스의 NEXTVAL함수를 사용하여 처리했다.
게시글 삭제를 구현할 때 고려해야 할 점들은 아래와 같다.
1. 어떤 특정한 게시글 삭제 시에, 자신의 자식, 자손 게시글들은 모두 같이 삭제가 되어야 한다.
물론 삭제하고자 하는 게시글의 제목, 내용을 단순히 NULL 또는 '삭제됨'같은 문자열로 업데이트해도 괜찮지만
자손 게시글을 같이 삭제하는 방식으로 처리했다.
2. 자손 게시글들도 같이 삭제하기 위해서는 계층형 쿼리를 통해 자신과 자손들의 게시글 번호를 얻어야 한다.
3. DB에서 게시글의 제목, 내용뿐만 아니라 첨부파일 정보 및 첨부파일 자체를 서버 저장공간에서 삭제해야 한다.
@RequestMapping(value="/board/deleteArticle.do")
public ModelAndView LOGONMAV_deleteArticle(HttpServletRequest request, HttpServletResponse response){
try {
String BOARD = request.getParameter("BOARD");
int ARTICLE_ID = Integer.parseInt(request.getParameter("ARTICLE_ID"));
if(BOARD==null||(!BOARD.equals("free_board")&&!BOARD.equals("qna_board")&&!BOARD.equals("info_board"))) {
return new ModelAndView("redirect:/customer/mainForm.do");
}
HashMap map = new HashMap();
map.put("BOARD", BOARD);
map.put("ARTICLE_ID", ARTICLE_ID);
return boardService.deleteArticle(map);
}catch(Exception e) {
e.printStackTrace();
return new ModelAndView("redirect:/customer/mainForm.do");
}
}
위의 코드는 BoardController.java의 소스코드 일부다.
삭제할 게시글의 번호와 게시판 종류를 해시 맵에 추가 후 서비스 객체의 deleteArticle( ) 메서드를 호출한다.
public ModelAndView deleteArticle(HashMap map) throws Exception{
List list = boardDAO.selectDeletedArticlesID(map);
map.put("BOARD_FILE", map.get("BOARD")+"_FILE");
map.put("LIST", list);
boardDAO.deleteFiles(map);
boardDAO.deleteArticle(map);
for(int i=0;i<list.size();i++) {
File file = new File(REPOSITORY_PATH+"\\"+map.get("BOARD")+"\\"+list.get(i));
try {
if(file.exists()) {
FileUtils.deleteDirectory(file);
}
} catch (IOException e) {
e.printStackTrace();
}
}
ModelAndView mav = new ModelAndView("redirect:/board/boardForm.do");
mav.addObject("BOARD", map.get("BOARD"));
return mav;
}
서비스 객체는 먼저 삭제하고자 하는 게시글과 그 자식, 자손 게시글들의 번호를 List의 형태로 얻어온다.
이는 selectDeletedArticleID( ) 메서드가 수행한다.
그러고 나서 해당 게시판에서 첨부파일들의 정보를 저장하는 테이블과
앞서 얻은 게시글 번호들을 파라미터로 추가한다.
그 후에 첨부파일의 정보들과 게시글 정보를 DB에서 삭제한다.
만약 성공적으로 삭제되었다면 Exception이 발생하지 않으므로
아래 for 반복문에서 해당 게시글들의 첨부파일이 담긴 디렉터리를 전부 삭제한다.
<select id="selectDeletedArticlesID" parameterType="java.util.HashMap" resultType="Integer">
<![CDATA[
SELECT ARTICLE_ID
FROM ${BOARD}
START WITH ARTICLE_ID = ${ARTICLE_ID}
CONNECT BY PRIOR ARTICLE_ID = PARENT_ARTICLE_ID
]]>
</select>
위의 코드는 마이 바티스 프레임워크의 매퍼의 일부분이다.
삭제하고자 하는 게시글의 번호와, 자식, 자손 게시글들의 번호를 계층형 쿼리로 얻는다.
'Web Service > 도서 정보 제공 웹 서비스' 카테고리의 다른 글
도서 정보 제공 웹 서비스 - 게시글 수정 (0) | 2022.02.25 |
---|---|
도서 정보 제공 웹 서비스 - 게시글 읽기 (0) | 2022.02.03 |
도서 정보 제공 웹 서비스 - 게시글 쓰기 (0) | 2022.01.20 |
도서 정보 제공 웹 서비스 - Gmail을 활용한 비밀번호 찾기 (0) | 2022.01.09 |
도서 정보 제공 웹 서비스 - 메세지 읽기, Spring, Mybatis 프레임워크 (0) | 2022.01.06 |