우당탕탕 개발자 되기
Spring MVC-Controller(2) 본문
Controller 메서드는 작성 시 특별하게 Model이라는 타입을 파라미터로 지정할 수 있다.
Model 객체는 JSP에 컨트롤러에서 생성된 데이터를 담아서 전달하는 역할을 하는 존재
Model은 '모델 2' 방식에서 사용하는 request.setAttribute()와 유사한 역할을 한다.
메서드의 파라미터를 Model 타입으로 선언하게 되면 자동으로 스프링 MVC에서 Model타입의 객체를 만들어 주기 때문에 개발자의 입장에서는 필요한 데이터를 담아 주는 작업만으로 작업이 완료된다, 사용해야 하는 경우는 주로 Controller에 전달된 데이터를 이용해서 추가적인 데이터를 가져와야하는 상황이다.
ex) 리스트 페이지 번호를 파라미터로 전달받고, 실제 데이터를 View로 전달해야하는 경우,
파라미터들에 대한 처리 후 결과를 전달해야 하는 경우
@ModelAttribute 어노테이션
웹페이지 : Request에 전달된 데이터를 가지고 필요하다면 추가적인 데이터를 생성해서 화면으로 전달하는 방식으로 동작한다.
Model 의 경우는 파라미터로 전달된 데이터는 존재하지 않지만 화면에서 필요한 데이터를 전달하기 위해서 사용한다.
스프링 MVC의 Controller : 기본적으로 Java Beans 규칙에 맞는 객체는 다시 화면으로 객체를 전달한다.
//sample Controller에 추가
@GetMapping("/ex04")
public String ex04(SampleDTO dto, int page) {
log.info("dto: "+dto);
log.info("page:" +page);
return "/sample/ex04";
}
//ex04.jsp 파일 생성
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//w3c//DTD HTML 4.01 Transitional//EN" "http://
www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html"; charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<H2>SAMPLEDTO ${sampleDTO }</H2>
<H2>PAGE ${page }</H2>
</body>
</html>
"http://localhost:8080/sample/ex04?name=aaa&age=11&page=9" 호출

화면에 SampleDTO만이 전달된 것을 확인할수 있다. int 타입으로 선언된 page는 전달되지않는다.
@ModelAttribute
-강제로 전달받은 파라미터를 Model에 담아서 전달하도록 할 때 필요한 어노테이션
-파라미터는 타입에 관계없이 무조건 Model에 담아서 전달된다.
int 타입의 데이터까지 화면에 전달하기 위해서는
public String ex04(SampleDTO dto, int page)
-->
public String ex04(SampleDTO dto, @ModelAttibute("page") int page)
로 수정하면 나타나게 할수있다.
RedirectAttributes
-일회성으로 데이터를 전달하는 용도로 사용
-Model과 같이 파라미터로 선언해서 사용하고, addFlash Attribute(이름,값) 메서드를 이용해서 화면에 한 번만 사용하고 다음에는 사용되지 않는 데이터를 전달하기 위해서 사용된다.
Controller의 리턴 타입
- String : jsp를 이용하는 경우에는 jsp 파일의 경로와 파일이름을 나타내기 위해서 사용 String 타입은 상황에 따라 다른 화면을 보여줄 필요가 있을 경우에 유용하게 사용(if~else와 같은 처리가 필요한상황)

home() 메서드는 'home'이라는 문자열을 리턴했기 때문에 '/WEB-INF/views/home.jsp'가 경로가 된다.
- void : 호출하는 URL과 동일한 이름의 jsp를 의미한다.
- VO,DTO 타입 : 주로 JSON 타입의 데이터를 만들어서 반환하는 용도로 사용한다.
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.1</version>
</dependency>
//pom.xml에 jackson-databind 라이브러리 추가
@GetMapping("/ex06")
public @ResponseBody SampleDTO ex06() {
log.info("/ex06............");
SampleDTO dto =new SampleDTO();
dto.setAge(10);
dto.setName("홍길동");
return dto;
}
스프링 MVC 는 자동으로 브라우저에 JSON 타입으로 객체를 변환해서 전달한다.
- ResponseEntity 타입 : response 할 때 Http 헤더 정보와 내용을 가공하는 용도로 사용한다. HTTP 프로토콜의 헤더를 다루는 경우 RensponseEntity 를 통해서 헤더 정보나 데이터를 전달
@GetMapping("ex07")
public ResponseEntity<String> ex07(){
log.info("/ex07....................");
//{"name" : 홍길동}
String msg= "{\"name\": \"홍길동\"}";
HttpHeaders header = new HttpHeaders();
header.add("Content-Type", "application/json; charset=UTF-8");
return new ResponseEntity<>(msg,header,HttpStatus.OK);
}
ResponseEntity는 HttpHeaders 객체를 같이 전달할수 있고, 이를 통해서 원하는 HTTP 헤더 메시지를 가공하는 것이 가능하다.

- Model, ModelAndView : Model로 데이터를 반환하거나 화면까지 같이 지정하는 경우에 사용합니다.
- HttpHeaders : 응답에 내용없이 Http 헤더 메시지만 전달하는 용도로 사용한다.
파일 업로드 처리
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
//pom.xml에 추가
C 드라이브 아래 upload/tmp 로 작성
<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<beans:property name="defaultEncoding" value ="utf-8"></beans:property>
<!-- 1024*1024*10 bytes 10MB -->
<beans:property name="maxUploadSize" value="104857560"></beans:property>
<!-- 1024*1024*2 bytes 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>
maxUploadSize : 한 번의 Request로 전달될 수있는 최대크기
maxUploadSizePerFile : 하나의 파일 최대 크기
maxInMemorySize : 메모리상에서 유지하는 최대의 크기, 만일 이 크기 이상의 데이터는 uploadTempDir 에 임시 파일의 형태로 보관된다

<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3
.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content ="text/html";charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<form action="/sample/exUploadPost" method="post" enctype="multipart/form-data">
<div>
<input type='file' name='files'>
</div>
<div>
<input type='file' name='files'>
</div>
<div>
<input type='file' name='files'>
</div>
<div>
<input type='file' name='files'>
</div>
<div>
<input type='file' name='files'>
</div>
<div>
<input type='file' name='files'>
</div>
</form>
</body>
</html>
exUpload.jsp파일을 작성

'Spring' 카테고리의 다른 글
| Spring MVC 프로젝트 구성 (0) | 2021.02.11 |
|---|---|
| Spring MVC-Controller(3) (0) | 2021.02.10 |
| Spring MVC -Controller (0) | 2021.02.09 |
| Spring MVC (0) | 2021.02.08 |
| 의존성 주입 테스트 -Setter (0) | 2021.02.04 |