Spring

Spring 03 - Spring MVC, 파일 업로드(기본)

나주나주 2024. 2. 28. 10:58

 

Spring MVC

: servlet-context.xml로 설정하는 Web영역, root-context.xml로 설정하는 Java영역을 연동하여 구동하는 방식

 

WebApplicationContext는 기존 구조에 MVC 설정을 포함하는 구조이다. 스프링은 웹 애플리케이션을 목적으로 나온 프레임워크가 아니기 때문에 달라지는 영역에 대해 완전히 분리하고 연동하는 방식으로 구현된다. 

 

 

 

 

  JSP HTML, CSS, JS Service Controller Mapper DB
역할 View Ajax, JSON C R U D C R U D xml (MyBatis) Table (Oracle)
계층 프레젠테이션 계층
비즈니스 계층* 영속성

* Service(서비스): 비즈니스 영역에 있는 객체

 

 

 

web.xml

프로젝트 구동 시 관여하는 web.xml(Tomcat), root-context.xml(spring), servlet-context.xml(spring)

	<!-- 프로젝트 구동 시작은 여기서부터. Context Listener, root-context.xml 연동 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/root-context.xml/WEB-INF/spring/security-context.xml
    </param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<!-- root-context에 정의된 Bean들은 스프링의 영역context 안에 생성, 객체 간 의존성 처리 -->

	<!-- DispatcherServlet, servlet-context.xml 연동 -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<!-- root-context에 정의된 Bean들은 스프링의 영역context 안에 생성, 먼저 만들어진 객체들과 연동 -->

 

 

 

Controller

  • HttpServletRequest, HttpServletResponse를 거의 사용하지 않고 필요한 기능 구현
  • 다양한 타입의 파라미터와 리턴 사용 가능
  • GET, POST 등 전송 방식 어노테이션으로 처리
  • 상속/인터페이스 대신 어노테이션만으로 필요한 설정 가능

 

@Controller

  • 스프링의 객체로 등록할 것
  • servlet-context.xml의 는 어노테이션을 가진 클래스들을 객체로 생성 및 관리(s)
  • 파라미터의 타입에 따라 자동 변환하여 자동 수집

Tip) request.getparameter() 사용하지 않아 편리하다

 

Controller 메소드의 리턴 타입 (주로 사용하는 방식)

자료형 설명
String jsp를 이용하는 경우에는 jsp 파일의 경로와 파일명을 나타 낸다
void* void: 호출하는 URL(맵핑)과 동명의 jsp
VO, DTO** JSON 타입의 데이터를 만들어 반환
ResponseEntity response 시 Http 헤더 정보와 내용 가공
Model, ModelAndView Model로 데이터를 반환하거나 화면까지 지정하는 경우
HttpHeaders 응답에 내용 없이 Http 헤더 메시지만 전달

 

* servlet-context.xml의 URL경로를 View로 처리하기 때문에 생기는 결과

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<beans:property name="prefix" value="/WEB-INF/views/" />
	<beans:property name="suffix" value=".jsp" />
</beans:bean>

 

** 주로 JSON 데이터를 만들어내는 용도로 사용한다

pom.xml

<!-- jackson-databind 라이브러리 추가 -->
<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactid>jackson-databind</artifactId>
	<version>2.9.4</version>
</dependency>

 

SampleController.java

@getMapping("/ex06")
public @ResponseBody SampleDTO ex06() {
    SampleDTO dto = new SampleDTO();
    dto.setAge(10);
    dto.setName("홍길동");
    
    return dto;
}

 

스프링 MVC는 자동으로 브라우저에 JSON타입으로 객체를 변환해서 전달!

 

@RequestMapping

@GetMapping

@PostMapping

수정할 값은 get으로 받고 수정한 값은 post로 전달할 경우: 필요한 url은 단 하나

 

@DateTimeFormat

@DateTimeFormat (pattern = "yyyy/MM/dd")

 

 

 

Model

: 컨트롤러에서 생성된 데이터를 Model영역에 담아 JSP에 자동 전달

model.addAttribute("serverTime", new java.util.Date());

Tip) 기본 자료형(ex) int, long은 파라미터로 선언하더라도 화면까지 전달되지는 않는다

ex) 목록에서 페이지 번호 bno = 2, 파라미터들에 대한 처리 후 결과를 전달해야 하는 경우

 

jsp의 경우

네 가지 영역 page, Request, Session, Application 은 ex) 생성 시 pageContext.setAttribute(k, v) 오ㅏ 같이 사용하면서 

다른 페이지를 통해 받을 때는 parameter

안쪽에서는 설정한 값을 가져올 때 attribute

requestDispatcher dispatcher == 요청 처리 변수

 

 

 

RedirectAttribute 연결 속성

: 자동 전달

 

servlet에서 redirect

response.sendRedirect("/home?name=aaa&age=10");

 

스프링 MVC를 이용하는 redirect 처리

rttr.addFlashAttribute("name", "AAA");
rttr.addFlashAttribute("age", 10);

return "redirect:/";

 

 


파일 업로드

 

pom.xml

<!-- 파일 업로드 처리, 책 보고 해서 버전 다를 수도... -->
	<dependency>
		<groupId>commons-fileupload</groupId>
		<artifactId>commons-fileupload</artifactId>
		<version>1.3.3</version>
	</dependency>

 

라이브러리 추가 후 임시 업로드 폴더 생성

 

 

 

 

servlet-context.xml

<!-- 파일 업로드 처리, 책보고! --> 
	<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
	<beans:property name="defaultEncoding" value="utf-8"></beans:property>
	
	<!-- 1024 * 1024 * 10bytes = 10MB -->
	<beans:property name="maxUploadSize" value="104857560"></beans:property>
		
	<!-- 1024 * 1024 * 2bytes = 2MB -->
	<beans:property name="maxUploadSizePerFile" value="2097152"></beans:property>
	
	<beans:property name="uploadTempDir" value="file:/C:/upload/tmp"></beans:property>
	
	<beans:property name="maxInMemorySize" value="10485756"></beans:property>
	</beans:bean>

 

SampleController.java

	@GetMapping("exUpload")
	public void exUpload() {
		log.info("/exUpload......");
	}

	@PostMapping("/exUploadPost")
  public vArrayList<E>oadPost(ArrayList) {

	public void exUploadPost(ArrayList<MultipartFile> files) {
		files.forEach(file -> {
			log.info("-------------------------");
			log.info("name:" + file.getOriginalFilename());
			log.info("size:" + file.getSize()); //2MB보다 작은 크기의 파일
		});
	}
}

 

P154

 

파일 업로드용 4가지인데 스프링은 5가지

multipartResolver

defaultEncoding utf-8ㅎ ㅏㄴ글 깨짐 방지

maxUploadSize 최대 업로드 용량

maxUploadSizePerFile 단일 업로드 최대 용량(초과 시 쪼개서 압축해서 올림)

uploadTempDir 저장할 임시 폴더 경로

maxInMemorySIze 스트림처리해야 하기 때문에 메모리 영역 설정

 

6.6Controller의 Exception 처리

Controller가 하는 일: url 매핑... 하다가 잘못 치면?

 

@ControllerAdvice

: AOP (Aspect-Oriented-Programming) 공통적인 관심사 분리

 

 

@ExceptionHandler

 

 

@ResponseEntity

 

Tip)

public String except(Exception ex, Model model) {   //파라미터를 통로라고 생각

 

Tip) 웹 프로젝트는 절대 경로 '/' 를 사용하자!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Spring' 카테고리의 다른 글

Spring 04  (0) 2024.02.29
기본적인 웹 게시물 관리  (0) 2024.02.28
Spring 02 - ConnPool  (1) 2024.02.27
Spring 01 - 스프링의 특징  (2) 2024.02.27
Spring 00 - 초기 설정 방법  (0) 2024.02.26