본문 바로가기
Spring

Spring_Spring MVC, 첨부파일 업로드

by 유서담 2024. 3. 15.

스프링 MVC란

 

스프링 MVC는 스프링 프레임워크의 일부로, 웹 애플리케이션을 개발하기 위한 모델 - 뷰 - 컨트롤러(MVC) 아키텍처를 구현한다. 이를 통해 애플리케이션의 비즈니스 로직과 사용자 인터페이스를 분리하여 관리할 수 있으며, 유지보수와 확장성을 향상 시킨다

 

 

핵심 구성 요소

 

모델(Model)

애플리케이션의 데이터와 비즈니스 로직을 담당한다. 데이터베이스와의 상호작용, 데이터 검증 등을 처리한다

 

뷰(View)

사용자에게 정보를 표시하는 방법을 정의한다. 일반적으로 JSP, 타임리프 등의 템플릿 엔진을 사용하여 구현된다

 

컨트롤러(Controller)

사용자의 요청을 받아 모델과 뷰 사이의 상호작용을 조정한다. 사용자의 입력을 처리하고, 모델을 업데이트하며, 적절한 뷰를 선택한다.

 

 

 

 

스프링 MVC의 작동 방식

 

1. 클라이언트 요청 : 사용자의 요청이 들어오면, 스프링 MVC는 DispatcherServlet을 통해 이 요청을 처리한다

2. 핸들러매핑 : DispatcherServlet은 요청을 처리할 적절한 컨트롤러를 찾기 위해 핸들러 매핑을 사용

3. 컨트롤러 실행 : 컨트롤러가 요청을 처리하고, 모델 객체를 업데이트하며, 반환할 뷰의 이름을 결정한다

4. 뷰 리졸버 : 컨트롤러가 반환한 뷰의 이름을 기반으로 실제 뷰 객체를 찾는다

5. 뷰 렌더링 : 뷰 객체는 모델 데이터를 사용하여 최종적으로 사용자에게 보여질 HTML을 생성한다

 

 

 

Spring MVC의 주요 컴포넌트

 

DispatcherServlet

  • MVC 패턴에서 프론트 컨트롤러의 역할을 수행
  • 모든 HTTP 요청을 접수받고, MVC 패턴의 전 과정이 유기적으로 실행되도록 주도적 역할을 수행

 

HandlerMapping

  • 개발자가 정의한 컨트롤러 클래스의 매핑정보를 분석
  • DispatcherServlet의 지시를 받아서 클라이언트가 요청한 요청과 매핑되는 컨트롤러, 요청핸들러 메소드를 검색
  • 컨트롤러 혹은 요청핸들러 메소드를 실행하는 HandlerAdapter

 

HandlerAdapter

  • 인터셉터와 컨트롤러(요청핸들러 메소드)를 실행
  • Handler Adapter는 요청핸들러 메소드 실행 필요한 작업을 수행한다
    • 요청 핸들러 메소드의 매개변수를 분석해서 적절한 객체를 제공
  • 요청 데이터를 메소드 파라미터로 바인딩하며, 메소드의 실행결과를 DispatcherServlet에 전달
public String home(Model model) {
	...
}
* 뷰에 전달할 데이터를 담을 수 있는 Model 객체를 생성해서 전달한다

 

public String home(HttpServletRequest request, HttpServletResponse response) {
	...
}
* 요청객체와 응답객체를 전달한다

 

public String home(HttpSession session) {
	...
}
* 세션객체를 전달한다

 

public String home(Locale locale) {
...
}
* 로케일 객체를 전달한다

 

public String list(int page) {

}
* 요청파라미터에서  page값을 찾아서 매개변수에 바인딩한다
* http://localhost/board/list?page=2

 

public String login(String id, String password) {

}
* 로그인폼의 입력필드에서 입력한 정보로 전달된 요청파라미터 값을 id와 password 매개변수로 바인딩한다
* <form method="post" action="login">
	<input type="text" name="id">
	<input type="password" name="password">
	<button type="submit">로그인</button>
</form>

 

요청핸들러 메소드의 매개변수를 분석해서 적절한 폼 객체를 생성하고, 요청파라미터를 저장한 다음 매개변수로 전달한다
public String register(UserRegisterForm form) {
	....
}
* 입력폼에서 입력한 요청파라미터값을 UserRegisterForm 객체를 생성해서 저장하고, 
요청파라미터값이 저장된 UserRegisterForm 객체를 매개변수에 바인딩한다

 

요청핸들러 메소드가 반환하는 반환값을 분석해서 최종적으로 ModelAndView 객체로 저장한다
* 요청핸들러 메소드가 ModelAndView 객체를 반환
@GetMapping("/")
public ModelAndView home() {
	ModelAndView mav = new ModelAndView();
	mav.addObject("msg", "홈페이지 방문을 환영합니다");
	mav.setViewName("home");
	
    return mav;
}
* 요청핸들러 메소드가 반환하는 ModelAndView 객체를 DispatcherServlet 에게 전달한다

 

* 요청핸들러 메소드가 String을 반환한다
@GetMapping("/")
public String home() {
	return "home"
}
* ModelAndView 객체를 생성한다
* 요청핸들러 메소드가 반환하는 값을 viewName으로 저장하고, DispatcherServlet에게 전달한다

 

요청핸들러 메소드가 Model객체를 매개변수로 전달받고, String을 반환한다
@GetMapping("/")
public String home() {
	model.addAttribute("msg", "홈페이지 방문을 환영합니다");
	return "home";
}
* 요청핸들러 메소드 호출전에 미리 Model 객체를 생성하고, 요청핸들러 메소드의 매개변수로 전달한다
* ModelAndView 객체를 생성한다
* 미리 생성해둔 Model 객체를 ModelAndView에 저장한다
* 요청핸들러 메소드가 반환하는 값을 viewName으로 저장하고, DispatcherServlet에게 전달한다
* ModelAndView
	Object View 	<--- "home"
	ModelMap model	<---- Model - {msg: "홈페이지방문을 환영합니다"}

 

 

View

  • Model에 저장된 데이터를 특정 컨텐츠 타입으로 변환해서 응답으로 제공하는 기능을 담당
  • DispatcherServlet은 컨트롤러를 실행해서 최종적으로 획득한 ModelAndView에서 View 객체를 꺼내고, 그 View 객체의 메소드를 실행해서 클라이언트에게 응답을 제공
    • ModelAndView에는 View 객체가 들어있거나 뷰이름이 들어있을 수 있다
    • ModelAndView에 뷰이름이 들어있는 경우에는 View객체를 획득하기 위해서 ViewResolver를 도움을 받는다
  • View 인터페이스를 구현한 다양한 View객체를 활용하면 클라이언트에게 모델의 데이터가 표현된 파일(HTML, XML, JSON, 엑셀시트, PDF 문서, 파일정보) 를 응답으로 보낼 수 있다
  • Spring MVC는 JSP페이지를 뷰템플릿으로 사용하는 웹 애플리케이션에서 사용할 수 있는 InternalResourceView, JstlView, RedirectView를 제공

 

View Resolver(뷰 리졸버)

  • 뷰이름에 맞는 뷰 객체를 반환
  • JSP페이지를 뷰템플릿으로 사용하는 웹 애플리케이션에서 기본 뷰 리졸브는 InternalResourceViewResolver
  • InternalResourceViewResolver는 뷰이름을 분석해서 InternalResourceView, JstlView, RedirectView 중 하나를 반환

 

 

Spring MVC의 첨부파일 업로드

  • Spring은 MultipartFile  객체를 통해서 첨부파일 업로드를 지원
  • MultipartFile 객체는 업로드된 첨부파일을 정보로 표현하는 객체

 

MultipartFile

 

주요메소드

메소드명 설명
boolean isEmpty( ) 업로드된 첨부파일이 없으면 true를 반환한다
업로드된 첨부파일이 없더라도 MultipartFile 객체는 null 아니다

String getOriginalFilename( ) 업로드된 첨부파일의 파일명을 반환한다
String getContentType() 업로드된 첨부파일의 컨텐츠 타입을 반환한다
"image/png", "image/jpg", "text/plain", "application"
long getSize() 업로드된 첨부파일의 사이즈를 반환한다
InputStream getInputStream() 업로드된 첨부파일과 연결된 읽기전용 스트림을 반환한다
byte[] getBytes() 업로드된 첨부파일 데이터를 바이트배열로 반환한다
void transferTo(File file) 업로드된 첨부파일을 지정된 File객체가 표현하는 파일로 전송한다(파일로 저장시킨다)

'Spring' 카테고리의 다른 글

REST API  (0) 2024.03.28
Spring_요청핸들러 메소드, Mapping(GET, POST)  (5) 2024.03.19
Spring_스프링 시큐리티  (0) 2024.03.12
Spring_form 입력 값 유효성 체크, <form:form>태그  (3) 2024.03.06
Spring_AOP  (0) 2024.02.27