본문 바로가기

Project/Final-Project

[WhereWare] 파일 삭제 하면서 작성자 PK가 사라지는 문제점

 

[문제 상황]

 

기존에 글 작성하기를 통해 첨부파일이 추가되어 있는 상황

기존 첨부 파일을 <a>삭제</a> 를 누르면 기존 파일이 삭제 된다.

 

하지만 이 boardAttach가 삭제됨과 동시에 edit 컨트롤러 로직을 타면서 

 

// ▼ 게시글 수정
@GetMapping("/edit")
public ModelAndView edit(@SessionAttribute("loginMember") Member loginMember, ModelAndView model, @RequestParam("no") int no) {

    Board board = service.findBoardByNo(no);

    List<BoardAttach> boardAttachlist = service.getBoardAttachList(no);

    if(loginMember.getNo() == board.getEmpNo()) {
        model.addObject("boardAttachlist", boardAttachlist);
        model.addObject("board", board);
        model.setViewName("board/edit");
    } else {
        model.addObject("msg", "접근 권한이 없습니다.");
        model.addObject("location", "/board/list");
        model.setViewName("common/msg");
    } 

    return model;
}

 

alert으로 "접근 권한이 없습니다." 가 뜬다.

오잉??

 

그러면서 파일은 정상적으로 잘 삭제됨...

 

나는 지금 /fileDelete 컨트롤러에 있는데 /edit 로직으로 올라가버리면서 글 수정이 마저 완료되지 않고,

접근 권한이 없기 때문에 board/list로 강제 이동되는 문제 상황

 

 

 

[이유 생각해보기]

 

log.info(boardAttach.toString()); 을 찍어보면 empNo=0 으로 되어있다.

 

즉, 파일이 삭제됨과 동시에 empNo도 날아가서 게시글에 empNo가 없기 때문에


if(loginMember.getNo() == board.getEmpNo()) { ~~~ } 이 조건문이 만족해버리면서 /edit 에서 튕겨져 나온다.

 

댓글 삭제하기처럼 생각하면서 코드를 짜고 있는데, 게시글 상세 보기 상태에서 댓글을 삭제한다고

 

게시글 상세 보기 페이지가 이동되거나 하지 않는데...다시 코드를 봐야겠다고 생각이 들었다.

 

 

 


[문제 해결]

 

일단 무조건 log 찍어보기ㅋㅋ

 

// ▼ 파일 삭제
@GetMapping("/fileDelete")
public ModelAndView deleteFile(ModelAndView model, Board board, @ModelAttribute Member member, @SessionAttribute("loginMember") Member loginMember, @RequestParam("no") int no) {

    int result = 0;

    result = service.deleteFile(no);

        if(result > 0) {

            model.addObject("msg", "파일 삭제 완료!");
            log.info(board.toString());
            log.info(loginMember.toString());
            model.addObject("loginMember", loginMember);
            model.addObject("location", "/board/edit?no=" + board.getNo());
        } else {
            model.addObject("msg", "파일 삭제 실패!");
            model.addObject("location", "/board/edit?no=" + board.getNo());
        }

    model.setViewName("/common/msg");

    return model;
}

 

 

 

파일이 삭제되는 순간 empNo, writer, title, content 할 것 없이 다 날아감....

 

글 번호만 남아있음

 

엇?! 근데 지금 Board의 no값이 이상하다는 것을 발견했다. 207번은 fileNo이지 board의 no는 407번인데?

 

 


문제는 Board에 대한 정보를 가지고 오고 있지 않기 때문에, PK 값을 세팅해줄 수가 없었던 것이다.

 

그래서 service에서 내가 삭제하려는 첨부 파일 단건 1개를 조회해서 BoardAttach 객체를 하나 새로 만들고,

 

그 안에 속성인 BOARD_NO를 이용해서 BOARD_NO를 뽑아내보자.

 

그리고 첨부 파일 단건 1개를 조회해서, null이 아니면 그 파일을 삭제하라고 하면 된다.

 

// ▼ 파일 삭제
@GetMapping("/fileDelete")
public ModelAndView deleteFile(ModelAndView model, @RequestParam("no") int no, 
        @SessionAttribute(name = "loginMember", required = false) Member loginMember) {

    int result = 0;

    BoardAttach boardAttach = service.findBoardAttachByNo(no);

    if (boardAttach != null) {
        result = service.deleteFile(no);

        if(result > 0) {
            model.addObject("msg", "파일 삭제 완료!");	
            model.addObject("location", "/board/edit?no=" + boardAttach.getBoardNo());
        } else {
            model.addObject("msg", "파일 삭제 실패!");
            model.addObject("location", "/board/edit?no=" + boardAttach.getBoardNo());
        }

    } else {

        model.addObject("msg", "잘못된 요청입니다.");
        model.addObject("location", "/board/list");

    }

    model.setViewName("/common/msg");

    return model;
}

 

 

이렇게 하니까 파일 삭제도 잘 되고, 파일 삭제 후에 board의 no가 사라지지 않고 edit 페이지로 잘 리로드 되는 것을 확인할 수 있었다.

 

무조건 로그 찍어보고 문제를 역추론 해나가면 되는 것 같다.