일기장의 마지막 부분인 '수정' 및 '삭제'를 살펴보자.
일기장 상세 조회 시 하단에 수정, 삭제 버튼을 만들었다.
수정 버튼을 누르면 작성했던 내용의 조회와 동시에 수정이 가능하다.


제목과 일기 내용에 (수정)이라고 추가하였다.



수정이 잘 된것을 볼 수 있다.

만약 첨부하는 이미지가 없다면 이전 이미지 그대로 유지하도록 mySQL의 IFNULL을 사용하였다.
자세한 내용은 하기 코드를 보자.
이번엔 삭제 버튼을 눌러 일기 삭제를 했다.

삭제 성공 메세지가 뜨며 목록에서 삭제됨을 볼 수 있다.

public class DiaryDTO {
private int rownum;
private int dno;
private String userId;
private String title;
private String content;
private String img;
private Date createdDate;
public DiaryDTO() {
}
public int getDno() {
return dno;
}
public void setDno(int dno) {
this.dno = dno;
}
public int getRownum() {
return rownum;
}
public void setRownum(int rownum) {
this.rownum = rownum;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getImg() {
return img;
}
public void setImg(String img) {
this.img = img;
}
public Date getCreatedDate() {
return createdDate;
}
public void setCreatedDate(Date createdDate) {
this.createdDate = createdDate;
}
@Override
public String toString() {
return "DiaryDTO [rownum=" + rownum + ", dno=" + dno + ", userId=" + userId + ", title=" + title + ", content="
+ content + ", img=" + img + ", createdDate=" + createdDate + "]";
}
}
@SessionAttributes("loginUser")
@Controller
@RequestMapping("/diary")
public class DiaryController {
private DiaryService diaryService;
@Autowired
public DiaryController(DiaryService diaryService) {
super();
this.diaryService = diaryService;
}
@GetMapping("/update")
public String updateDiaryform(DiaryDTO diaryDTO, Model model) {
// 수정 버튼을 눌렀을 시 updateform.jsp 호출하며 해당 일기 정보를 model에 담아 보냄
// (일기 번호(dno)는 url 쿼리스트링으로 보냈다)
try {
DiaryDTO selectDiary = diaryService.selectOne(diaryDTO);
model.addAttribute("diary", selectDiary);
} catch (Exception e) {
e.printStackTrace();
return "common/errorPage";
}
return "diary/updateform";
}
@PostMapping("/update")
public String updateDiary(DiaryDTO diaryDTO, HttpServletRequest request, MultipartFile imgFile, Model model,
HttpSession session) {
String page = "";
/* 파일을 저장할 경로 설정 */
String root = request.getSession().getServletContext().getRealPath("resources");
System.out.println("root : " + root);
String filePath = root + "\\uploadFiles";
File mkdir = new File(filePath);
if (!mkdir.exists()) {
mkdir.mkdirs();
}
/* 파일명 변경 처리 */
String savedName = null;
if (!imgFile.isEmpty()) {
String originFileName = imgFile.getOriginalFilename();
String ext = originFileName.substring(originFileName.lastIndexOf("."));
savedName = UUID.randomUUID().toString().replace("-", "") + ext;
}
/* 파일을 저장한다. */
try {
if (!imgFile.isEmpty()) {
imgFile.transferTo(new File(filePath + "\\" + savedName));
}
UserDTO loginUser = (UserDTO) session.getAttribute("loginUser");
diaryDTO.setImg(savedName);
diaryDTO.setUserId(loginUser.getUserId());
int result = diaryService.updateDiary(diaryDTO);
if (result > 0) {
page = "redirect:/diary/list?page=1";
session.setAttribute("msg", "일기 수정 성공");
} else {
page = "common/errorPage";
model.addAttribute("msg", "일기 수정 실패");
}
} catch (Exception e) {
e.printStackTrace();
/* 실패시 파일 삭제 */
new File(filePath + "\\" + savedName).delete();
page = "common/errorPage";
model.addAttribute("msg", "일기 수정 실패");
}
return page;
}
@GetMapping("delete")
public String deleteDiary(DiaryDTO diaryDTO, Model model, HttpSession session) {
// (일기 번호(dno)는 url 쿼리스트링으로 보냈다)
String page = "";
try {
int result = diaryService.deleteDiary(diaryDTO);
if (result < 0) {
throw new Exception();
} else {
page = "redirect:/diary/list?page=1";
session.setAttribute("msg", "일기 삭제 성공");
}
} catch (Exception e) {
e.printStackTrace();
page = "common/errorPage";
model.addAttribute("msg", "일기 삭제 실패");
}
return page;
}
}
@Service
public class DiaryServiceImpl implements DiaryService {
private DiaryDAO diaryDAO;
private SqlSessionTemplate sqlSession;
@Autowired
public DiaryServiceImpl(DiaryDAO diaryDAO, SqlSessionTemplate sqlSession) {
super();
this.diaryDAO = diaryDAO;
this.sqlSession = sqlSession;
}
@Override
public int updateDiary(DiaryDTO diaryDTO) throws Exception {
int result = diaryDAO.updateDiary(sqlSession, diaryDTO);
return result;
}
@Override
public int deleteDiary(DiaryDTO diaryDTO) throws Exception {
int result = diaryDAO.deleteDiary(sqlSession, diaryDTO);
return result;
}
}
@Repository
public class DiaryDAO {
public DiaryDTO selectOne(SqlSessionTemplate sqlSession, DiaryDTO diaryDTO) {
return sqlSession.selectOne("diaryMapper.selectOne", diaryDTO);
}
public int updateDiary(SqlSessionTemplate sqlSession, DiaryDTO diaryDTO) {
return sqlSession.update("diaryMapper.updateDiary", diaryDTO);
}
public int deleteDiary(SqlSessionTemplate sqlSession, DiaryDTO diaryDTO) {
return sqlSession.delete("diaryMapper.deleteDiary", diaryDTO);
}
}
<?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="diaryMapper">
<resultMap type="diaryDTO" id="diaryResultSet">
<!-- 언더바가 들어가는 쿼리문에 한하여 매핑을 해줘야함 -->
<result property="dno" column="dno" />
<result property="userId" column="user_id" />
<result property="title" column="title" />
<result property="content" column="content" />
<result property="img" column="img" />
<result property="createdDate" column="create_date" />
<!-- <result property="rownum" column="rownum" /> -->
</resultMap>
<select id="selectOne" parameterType="diaryDTO"
resultMap="diaryResultSet">
select * from
diary
where dno = #{dno}
</select>
<update id="updateDiary" parameterType="diaryDTO">
update diary
set
user_id =
#{userId},
title = #{title},
content = #{content},
img = IFNULL(#{img},img) <!-- 수정 img가 없으면 기존 이미지 적용 -->
where dno = #{dno}
</update>
<delete id="deleteDiary" parameterType="diaryDTO">
delete from diary
where dno = #{dno}
</delete>
</mapper>
이로써 드디어 일기장 부분을 마쳤다.
날씨, 채팅방, 챗봇은 수업 중 배운 내용을 실습하면서 적용한 부분인데 다음 포스팅에서 간단하게 살펴보겠다.
본 포스팅은 멀티캠퍼스의 멀티잇 백엔드 개발(Java)의 교육을 수강하고 작성되었습니다.