[SPRING] SpringMVC 홈페이지만들기 8 [자료실 삭제기능]

🐷Jinie (juniorDeveloper)·2020년 12월 8일
1

JSP/MVC/SPRING

목록 보기
71/81
  • 삭제하기를 구현해보자
    : 가입일자를 클릭하면 회원번호를 링크로 넘겨서 저장했던 파일을 지우고, 레코드도 삭제한다.

1. jsp파일에 링크걸어주기

//form.jsp
<h2>입력하기</h2><a href="list.do">목록보기</a>
//list.jsp
<td><a href="delete.do?idx=${m.getIdx()}">${m.getSdate()}</a></td>
  • 이때 처음에 form.jsp 링크를 걸어 list.jsp를 뽑으려했는데
    method가 POST방식이 아니라서 오류가 난다는 에러메시지가 떴다.
    그래서, Controller를 재확인했는데
@RequestMapping(value="/list.do")
	public String list(PsdVo vo, Model model) {
		model.addAttribute("list", s.list());
		return "list.jsp";
	}
  • 이부분에 method=RequestMethod.POST 가 들어있었다. method 지정한 것을 삭제했더니 정상작동했다.

2. Controller

  • 컨트롤러는 두가지 기능이 필요하다.
  1. 저장위치의 파일자체를 삭제하는 file형의 메서드 .delete() 기능
  2. DB의 레코드를 삭제하는 기능
@RequestMapping(value="/delete.do")
	public String delete(PsdVo vo, HttpServletRequest request) {
    	// 파일이 실제 저장되어있는 경로를 받아서
		String realPath = request.getSession().getServletContext().getRealPath("/psd/");
		String fileName = s.delete_name(vo.getIdx());
		File file = new File(realPath+fileName);
        //파일형에 담아서 삭제를 진행한다. (파일자체를 삭제한다.)
		file.delete();
		System.out.println(realPath+fileName);
        // 쿼리문을 이용해서 DB의 레코드를 삭제한다.
		s.delete(vo.getIdx());
        // 삭제이후 list에서 확인하도록 목록보기 Controller로 연결한다.
		return "list.do";
	}

3. Service, DAO

  • 두가지의 메서드가 필요하다.
    DB에서 idx 에 해당하는 fname을 가져올 select 쿼리문과
    idx에 해당하는 레코드값을 지워줄 delete쿼리문

  • Service

@Override
	public void delete(int idx) {
		dao.delete(idx);
	}

	@Override
	public String delete_name(int idx) {
		return dao.delete_name(idx);
	}
  • DAO
@Override
	public void delete(int idx) {
		jdbcTemplate.update(delete_sql,idx);
	}

@Override
	public String delete_name(int idx) {
		Object[] args = {idx};
		String fname = jdbcTemplate.queryForObject(delete_name_sql, args, String.class);
		return fname;
	}
  • 이때 select문임에도 왜 jdbcTemplate.query로 실행하지 않았을까?
    내가 필요한 것은 idx의 fname 즉, 데이터 하나이기 때문이다.
  • .queryForObject를 사용하면 1개의 데이터를 반환해준다.
    이때 구조는 (sql구문, ?에 넣을값, 반환할 데이터의 형.class)
  • 나는 1개의 데이터를 받을 것이고, delete_name_sql쿼리에 arg 를 넣어서 그 결과를 String형으로 return받기로 설정했다.

4. 결과

  • 10008번의 철수 레코드를 삭제해보자


  • 철수의 레코드가 잘 삭제되었다.

  • 등록되었던 사진파일도 잘 삭제되었는지 보자
  • 파일과 레코드가 모두 잘 삭제되었다.

5. 또 다른 방법 생각해보기

  • 위의 방법은 쿼리문을 2번 실행해서 쿼리를 통해 값을 받아오고
    그 결과를 이용해서 삭제를 진행한다.
  • 하지만 좀더 간편한 방법이 없을까?
  • URL을 통해 fname을 같이 넘기는 방법이 존재한다.
  • 하지만, 이때 URL에는 한글이 넘어가면 깨지는 현상이 발생하기때문에 인코딩을 추가 설정해주어야한다.
profile
ᴘᴇᴛɪᴛs ᴅᴇ́ᴠᴇʟᴏᴘᴘᴇᴜʀ. ᴘʀᴏɢʀᴀᴍᴍᴀᴛɪᴏɴ = ᴘʟᴀɪsɪʀ 💕

0개의 댓글