## 57. 파일 업로드 다루기 - multipart/form-data POST 요청 파라미터 인코딩
- apache.org의 라이브러리를 이용하여 multipart/form-data 파라미터를 다루는 방법
- 네이버클라우드 mysql DBMS 사용하기
BoardDetailServlet.java


ㄴ 첨부파일 삭제하는 버튼 생성하기
=>
서버 Start
=>

ㄴ [삭제] 버튼 추가됨을 확인
ㄴ [삭제] 버튼 선택
=>

=>

ㄴ BoardDeleteServlet.java 파일 복사
=>

ㄴ BoardFileDeleteServlet 이라는 이름으로 handler 패키지에 붙여넣기
=>
BoardFileDeleteServlet.java

ㄴ /board/delete -> /board/file/delete 로 경로 변경
=>
BoardFileDeleteServlet.java


ㄴ fileNo 추가
=>
BoardFileDeleteServlet.java

ㄴ 이후에 findFileBy 라는 메서드를 생성할 것
=>
BoardFileDeleteServlet.java

ㄴ 이후에 AttachedFile 에 BoardNo 를 추가할 것
=>
BoardFileDeleteServlet.java

ㄴ 로그인 한 작성자가 작성한 게시글의 첨부파일만 삭제 가능하도록 함
=>
BoardFileDeleteServlet.java

ㄴ 해당 코드 제거
=>
BoardFileDelete.java


ㄴ delete(b) -> deleteFile(fileNo) 로 변경
ㄴ 이후에 boardDao 인터페이스에 deleteFile 메서드 정의 추가해줄 것
ㄴ 게시글 -> 첨부파일로 변경
=>
BoardFileDelete.java

ㄴ 실행 후 해당 글의 상세보기로 이동하도록 함
=>
BoardDetailServlet.java

ㄴ category 도 받아주도록 함
=>
BoardDetailServlet.java

ㄴ Board board = InitServlet.boardDao.findBy(Integer.parseInt(request.getParameter("category")), Integer.parseInt(request.getParameter("no"))); -> 각각 분리하여 변수에 넣어주도록 함
=> 아래 쪽에서도 쓰이기 때문
BoardDetailServlet.java

ㄴ 위에서 분리한 category 이용
=>

ㄴ 서버 Restart
=>

ㄴ 브라우저 새로고침하면 500 에러가 발생하지만 url 값이 제대로 넘어가는지만 확인
=>
report-common
BoardDao.java

ㄴ BoardDao 인터페이스에서 정의되지 않은 findFileBy 메서드를 정의하도록 함
=>
MySQLBoardDao.java

ㄴ 이미 존재하는 findBy 메서드를 복사하여 활용하여 findFileBy 메서드 구현하기
=>
MySQLBoardDao.java

=>
MySQLBoardDao.java

ㄴ 해당 코드 제거
=>
MySQLBoardDao.java

=>
BoardDao.xml

ㄴ 이미 존재하는 findBy 를 복사하여 활용하여 findFileBy 구현하기
=>
BoardDao.xml

ㄴ 이후 attachedFileMap 이라는 resultMap 을 추가할 것임
=>
BoardDao.xml

ㄴ 쿼리문 수정
=>
BoardDao.xml

ㄴ attachedFileMap 이라는 resultMap 생성
AttachedFile.java

ㄴ boardNo 추가
=>
AttachedFile.java

ㄴ Getter/Setter 추가
=>

=>
BoardDao.xml

ㄴ board_no -> boardNo 로 변경
=> 프로퍼티 값이 boardNo 이기 때문
=>
BoardFileDelete.java

ㄴ 주석처리 해두기
=>
BoardFileDelete.java

ㄴ attachedFile 출력해보기 위한 출력문 추가
=>
AttatchedFile.java

ㄴ attachedFile 출력하기 위해 toString() 생성하기
=>

=>
AttachedFile.java

=>

ㄴ 서버 Restart 해주기
=>
로그인 후 게시글 상세보기
=>

ㄴ [삭제] 선택
=>

=>

ㄴ 콘솔 창에 AttachedFile 값 정상적으로 출력됨을 확인
BoardFileDelete.java

ㄴ board 출력해 보기 위한 코드 추가
=>
Board.java

ㄴ board 출력하기 위한 toString 메서드 추가
=>
Board.java

=>
Board.java

=>

ㄴ 서버 Start 해주기
=>

=>

ㄴ board 값이 정상적으로 출력됨을 확인

ㄴ 직원1 로 로그인 되어있는 상태
=>

ㄴ 직원2 가 작성한 글의 첨부파일 [삭제] 선택
=>

=>
BoardFileDelete.java

ㄴ 해당 코드 주석 풀어주기
=>
BoardFileDelete.java

ㄴ Create method 'deleteFile(int)' in type 'BoardDao' 선택하여 BoardDao 인터페이스 메서드 정의하기
=>
BoardDao.java

=>
MySQLBoardDao.java

=>
MySQLBoardDao.java

ㄴ delete 메서드를 복사하여 활용하여 deleteFile 메서드 구현하기
=>
BoardDao.xml

ㄴ delete 를 복사하여 활용하여 deleteFile 생성
=>
BoardDao.xml

=>

ㄴ 서버 Restart 해주기
=>

ㄴ [삭제] 선택
=>

ㄴ 첨부파일 1개가 삭제됨을 확인
BoardFormServlet.java

ㄴ 해당 코드 복사하기
=>
BoardDetailServlet.java

ㄴ 복사한 코드 붙여넣기
=>

ㄴ [파일 선택] 버튼 생성됨
BoardDetailServlet.java

ㄴ 인코딩 타입을 multipart/form-data 로 변경해주기
BoardAddServlet.java


ㄴ 해당 코드 복사하기
=>
BoardUpdateServlet.java


ㄴ 복사한 코드 붙여넣기
=>
BoardUpdateServlet.java

ㄴ 해당코드 아래쪽으로 이동시키기
=>
BoardUpdateServlet.java

ㄴ 해당코드 아래쪽으로 이동시키기
=>
BoardUpdateServlet.java

ㄴ 해당 코드 위쪽으로 이동시키기
=>
BoardUpdateServlet.java

ㄴ 필요없는 변수는 제거하도록 함
=>
BoardUpdateServlet.java

ㄴ 해당 코드 제거
=>
BoardUpdateServlet.java

ㄴ 해당 코드 제거
=>
BoardUpdateServlet.java

ㄴ no 도 추가
=>
BoardUpdateServlet.java

ㄴ out.printf("<meta http-equiv='refresh' content='1;url=/board/list?category=%d'>", category); 처럼 html 태그를 이용하는 대신 응답헤더에 추가하는 방식을 이용하도록 함
=>
BoardUpdateServlet.java

ㄴ 해당 코드는 이제 제거
=>
BoardUpdateServlet.java

ㄴ 주석 깔끔하게 제거
=>
BoardUpdateServlet.java

ㄴ 게시글을 정상적으로 변경했으면, 그 게시글의 첨부파일을 추가하도록 함
=>

ㄴ 서버 Restart 해주기
=>

=>

ㄴ [변경] 선택
=>

ㄴ 첨부파일 추가되어 변경됨을 확인

=>

ㄴ 첫 번째 첨부파일 [삭제] 선택
=>

ㄴ 새로운 파일 첨부 후 [변경] 선택
=>

ㄴ 정상적으로 변경됨을 확인

ㄴ 두 번째 파일 [삭제] 선택
=>


ㄴ 정상적으로 삭제됨을 확인