수업내용/Spring

[2023.1.13.금] 스프링 MVC 웹 애플리케이션 7 (태그 추가, 첨부파일 다운로드)

주니어주니 2023. 1. 13. 15:53

 

 

 

 

요청메시지와 가까운 객체(입력폼의 입력필드를 모두 수용할 수 있는 객체) , 테이블과 가까운 객체 

 

 


 

 

1) 첨부파일, 태그가 없는 경우

첨부파일이 없어도 null이 아님 -> MultipartFile 객체가 생성됨

tag는 null 

 

 

 

 

2) 첨부파일은 있고, 태그는 없는 경우 

 

 

 


 

 

태그 추가

 

 

 

 

 

* form.jsp

 

 

 

event.which == 13 (엔터키)에 대한 기본동작 : submit 제출

-> 얘를 false를 하면 -> 엔터키를 눌렀을 때 제출되는 것을 막음 

 

keydown 에 대한 기본동작 : 입력필드에 입력 

-> 얘를 false를 하면 -> 입력필드에 입력도 안됨 

 

 

 

* event.which : 입력된 키의 아스키코드값 반환

* Enter 키의 아스키코드값 = 13 

* if (event.which == 13) {}    ---> Enter키를 입력했을 때 

 

* 환율계산
0~9까지의 숫자만 true로 설정
나머지는 모두 false 로 설정 -> 0~9 말고는 입력 불가

 

 

 

* Tag 객체 생성 

 

 

 

 

* PostMapper 에 메소드 생성

 

 

 

* posts.xml 

 

 

 

 * PostService

 

 

 

 

- 입력할 때 Service에서 하는 일 (입력폼을 표현하는 객체를 만들고 각 테이블에 저장하기) 

 

 

 

 

- 출력할 때 Service에서 하는 일 (여러 테이블에서 가져와서 Dto객체를 만들고 저장하기)

 

 

 

 


 

 

상세화면에서 첨부파일, 태그 정보 출력하기

 

 

* postMapper, posts.xml 에서 게시글번호로 첨부파일, 태그 객체 찾는 메소드 생성 

 

- postMapper

 

 

- posts.xml

 

 

 

* PostDetailDto 상세화면에 보여지는 항목에 첨부파일, 태그 추가

 

 

* PostService의 detail 메소드에 첨부파일, 태그 출력 메소드 추가

 

 

 

* PostController에서 PostDetailDto 를 model 객체에 저장

 

 

 

* detail.jsp에서 표현하기

 

 

 

 

 

 


 

 

첨부파일 다운로드 이해하기

 

 

흐름 이해하기

 

 

 

컨트롤러 안에는 요청핸들러 메소드가 있는데 두가지의 경우가 있음

 

- String URL 을 반환하는 요청핸들러 메소드

  : viewName(jsp페이지 이름)만 반환

    -> ModelAndView의 변수 중에 viewName만 들어있는 상태고 DispatcherServlet에 전달

   -> DispatcherServlet이 뷰 이름을 ViewResolver에게 보내서 View 객체를 찾아달라고 요청

   -> RedirectView와 JstlView 객체를 반환 (요청핸들러 메소드에서 redirect:list, post/detail 을 반환했으니까)

 

- ModelAndView 객체를 반환하는 요청핸들러 메소드

   : ModelAndView에 View 객체를 직접 담음 -> View 객체의 render 메소드를 바로 실행

 

 

그리고 이 컨트롤러는 HandlerAdapter가 실행해서 ModelAndView 객체를 만들어서  DispatcherServlet에 전해주는데

DispatcherServlet에는 항상 ModelAndView가 반환되어야 함

 

 

=> 실질적인 응답은 View 인터페이스의 책임. View에는 render라는 메소드가 있음

 

여태까지는 스프링에서 기본으로 제공하는 RedirectView, JstlView 객체만 썼는데, 

파일을 다운로드 하기 위해서는 DownloadView 객체 필요 -> 우리가 생성

 

 

 

응답컨텐츠 타입과 뷰

 

 

 

* FileDownloadView 객체 생성 (View를 구현한 AbstractView를 구현한 객체) 

 

- 스캔되기 위해 @Component 

- View 인터페이스의 render 메소드를 재정의 -> model, request, response를 매개변수로 받음

  model 변수에는 컨트롤러에서 Model객체에 담은 directory, filename 저장 

 

 

 

* PostController 에서 View객체 의존성 주입해주고, 로직 구현

 

- ModelAndView 객체 생성

  -> MAV의 model에 directory, filename 저장 -> VIew 구현객체의 model 변수로 전달

  -> MAV의 view에 View 구현객체 저장 -> model로 전달받은 디렉토리, 파일명으로 파일을 읽어서 클라이언트로 내려보냄

  -> View 객체 중에서 FileDownloadView를 실행하라고 정해준것

  -> MAV 객체를 반환

 

 

 

 

 


 

 

첨부파일 다운로드 실제 구현

 

 

* detail.jsp

 

 

 

 

* PostController 

- Model에 아예 file 객체를 만들어서 전달

 

 

 

* FileDownloadView 객체

- Controller에서 Model 객체에 담은 값을 여기서 꺼냄

 

 

 

 

 

- c:/files에 있는 파일을 view에 in -> 브라우저로 out 

 

 

 

** 파일 다운로드 흐름!!

 

 

* Reader, InputStream, Writer, OutputStream

 

- 파일을 주고받을 때 InputStream, OutputStream 사용

- 개발자가 이걸 직접 쓸 일은 없지만, 유일하게 사용하는 때 : 파일 다운로드 할 때 OutputStream