https://rogi221./144
Spring – 2부 – Spring MVC 구성 01
대부분의 서블릿 기반 프레임워크에서 사용하는 MVC(Model-View-Controller) 방식 데이터, 처리 및 화면 분리 방식 웹 Spring 및 Spring의 Model 2 방식 표현 MVC Spring Framework Core + F
rogi221.
데이터 전달자
컨트롤러 메서드를 개발할 때 모델 유형을 인수로 지정할 수 있습니다.
Model 객체가 존재하며 컨트롤러에서 생성된 데이터를 JSP로 전달하는 역할을 합니다.
이를 사용하여 JSP와 같은 보기로 전달해야 하는 데이터를 보낼 수 있습니다.
모델 유형이 메소드 매개변수에 지정되면 Spring은 특별히 모델 유형 객체를 생성하고 이를 메소드에 주입합니다.
@ModelAttribute 주석
예제 컨트롤러에 추가됨
// SampleController.java
... (생략) ...
@GetMapping("/ex04")
public String ex04(SampleDTO dto, int page) {
log.info("dtd: " + dto);
log.info("page: "+ page);
return "/sample/ex04";
}
}
ex04.jsp
// ex04.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!
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=UTF-8">
<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

@ModelAttribute는 들어오는 매개변수를 강제로 모델에 입력하고 전달될 때 주석을 추가해야 합니다.
//SampleController.java
... (생략) ...
@GetMapping("/ex04")
public String ex04(SampleDTO dto,@ModelAttribute("page") int page) {
log.info("dtd: " + dto);
log.info("page: "+ page);
return "/sample/ex04";
}
}
컨트롤러 반환 유형
기존 상속과 인터페이스에서 어노테이션을 이용한 메소드로 변경 후 Spring MVC 구조의 가장 큰 변화 중 하나는 리턴 타입이 자유로워졌다는 점이다.
컨트롤러 메서드가 사용할 수 있는 반환 유형
- String : jsp를 사용하는 경우 jsp 파일의 경로와 파일명을 나타내기 위해 사용한다.
- void: 호출 URL과 이름이 같은 jsp를 나타냅니다.
- VO, DTO 유형: 주로 JSON 유형 데이터를 생성하고 이를 최대한 활용하는 데 사용됩니다.
- ResponseEntity 유형: 응답 시 Http 헤더 정보 및 내용을 처리하기 위해 사용
- Model, ModelAndView: 모델에 데이터를 반환하거나 화면을 지정하는 데 사용(최근 많이 사용하지 않음)
- HttpHeaders: 응답에 내용이 없는 Http 헤더 메시지만 전달하는 데 사용됩니다.
중공 형
// SampleController.java
... (생략) ...
@GetMapping("/ex05")
public void ex05() {
log.info("/ex05........");
}
views/sample/ex05.jsp 파일을 넣으면 에러가 나지 않습니다.
문자열 유형
void 유형 외에도 가장 일반적으로 사용되는 유형은 String 유형입니다.
String 타입은 상황에 따라 다른 화면을 보여줘야 할 때 유용합니다.
String 유형은 일반적으로 현재 프로젝트의 JSP 파일 이름을 나타냅니다.
개체 유형
컨트롤러 메소드의 리턴 타입은 VO(Value Object)나 DTO(Data Transfer Object) 타입과 같이 복잡한 데이터를 포함하는 객체 타입으로 지정할 수 있는데, 이때 주로 JSON 데이터 생성에 사용된다.
Jackson -databind 라이브러리가 pom.xml에 추가됨
// pom.xml
... (생략) ...
// 추가
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.4</version>
</dependency>
SampleController의 일부
// SampleController.java
... (생략) ...
// 추가
@GetMapping("/ex06")
public @ResponseBody SampleDTO ex06() {
log.info("/ex06.........");
SampleDTO dto = new SampleDTO();
dto.setAge(10);
dto.setName("홍길동");
return dto;
}
http://localhost:8080/sample/ex06
응답엔티티 유형
// SampleController.java
... (생략) ...
// 추가
@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);
}
http://localhost:8080/sample/ex07
파일 업로드 처리
pom.xml에 commons-fileupload 라이브러리 추가
// pom.xml
... (생략) ...
// 추가
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
라이브러리 추가 후 C드라이브 아래에 upload/tmp라는 임시 업로드 파일 폴더를 생성합니다.
servlet-context.xml의 일부
// 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 * 10 bytes 10MB -->
<beans:property name="maxUploadSize" value="104857560"></beans:property>
<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에 추가
// SampleController.java
... (생략) ...
@GetMapping("/exUpload")
public void exUpload() {
log.info("/exUpload........");
}
}
exUpload.jsp
// exUpload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!
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=UTF-8">
<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="submit">
</div>
</form>
</body>
</html>
SampleController의 일부를 추가합니다.
// SampleController.java
... (생략) ...
@PostMapping("/exUploadPost")
public void exUploadPost(ArrayList<MultipartFile> files) {
files.forEach(file -> {
log.info("-------------------------------------");
log.info("name: " + file.getOriginalFilename());
log.info("size: " + file.getSize());
});
}
Spring MVC에서는 같은 이름의 파라미터가 여러 개 있을 경우 배열로 취급할 수 있으므로 파라미터를 배열 형태의 MultipartFile로 작성한다.
실제로 파일을 업로드하면 아래와 같은 결과를 볼 수 있습니다.
현재 설정은 최대 파일 크기가 2MB이므로 그보다 작은 파일을 지정하고 업로드를 테스트하십시오.