[스프링] 파일 업로드 처리, 예외 처리,
Ch09. 파일 업로드 처리
9.1 개요
9.2 MultipartFile을 사용한 파일 업로드
9.1 개요
9.1.1 파일 업로드
파일 전송: JSP에 폼 태그 사용
전송된 파일 서버에 저장: 오픈 라이브러리 사용
환경 설정
(1)pom.xml 파일에 의존 라이브러리 등록
(2)servlet-context.xml 파일에 시큐리티 필터 등록
9.1.2 파일 업로드를 위한 웹 페이지
JSP 페이지 폼 태그
9.2 MultipartFile을 사용한 파일 업로드
9.2.1 MulripartFile 인터페이스의 개요
컨트롤러에 멀티파트 요청으로 들어오는 매개변수 중 업로드된 파일 및 파일 데이터를 표현할 때 사용
주요 메서드
MultipartFile 인터페이스 주요 메서드 | 타입 | 설명 |
getName() | String | 매개변수 이름 반환 |
getContentType() | String | 파일 컨텐츠 형식 반환 |
getOriginalFilename() | String | 클라이언트 파일 시스템에서 실제 파일 이름 반환 |
isEmpty() | boolean | 업로드한 파일이 있는지 반환 |
getSize() | long | 바이트의 파일 크기 반환 |
getBytes() | byte[] | 바이트의 배열로 파일 내용 반환 |
getInputStream() | InputStream | 파일 폼의 내용을 읽어 InputStream 반환 |
transferTo(File dest) | void | 수신된 파일을 지정한 대상 파일에 적용 |
9.2.2 파일 업로드 유형
(1)@RequestParam 이용
package com.springmvc.chap09;
import java.io.File;
import java.io.IOException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
@Controller
@RequestMapping("/exam01")
public class Example01Controller {
@GetMapping("/form")
public String requestForm() {
return "webpage09_01";
}
@PostMapping("/form")
public String submitForm(@RequestParam("name") String name, @RequestParam("fileImage") MultipartFile file) {
String filename = file.getOriginalFilename();
File f = new File("c:\\upload\\"+name+"_"+filename);
try {
file.transferTo(f);
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "webpage09_submit";
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>File Upload</title>
</head>
<body>
<h3>파일업로드</h3>
<form action="form" method="post" enctype="multipart/form-data">
<p>이름: <input type="text" name="name"/>
<p>파일: <input type="file" name="fileImage"/>
<p><input type="submit" value="전송하기"/> <input type="reset" value="다시쓰기"/>
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>File Upload</title>
</head>
<body>
<h3>파일업로드</h3>
파일 업로드 성공
</body>
</html>
(2)MultipartHttpServletRequest 인터페이스 사용
MultipartRequest 인터페이스 주요 메서드 | 타입 | 설명 |
getFile(String name) | MultipartFile | 요청에 업로드된 파일의 설명과 내용 반환 |
getFileMap() | Map<String, MultipartFile> | 요청에 포함된 멀티파트 파일의 Map 반환 |
getFileNames() | Iterator<String> | 요청에 포함된 멀티파트의 매개변수 이름이 포함된 String 객체의 Iterator 반환 |
getFiles(String name) | List<MultipartFile> | 요청에 업로드된 파일의 내용과 설명 반환 |
getMultiFileMap() | MultiValueMap<String, MultipartFile> | 요청에 포함된 멀티파트의 MultiValueMap 반환 |
getMultipartContentType(String aramOrFileName) | String | 지정된 요청 부분의 content 타입 결정 |
package com.springmvc.chap09;
import java.io.File;
import java.io.IOException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
@Controller
public class Example02Controller {
@GetMapping("/form")
public String requestForm() {
return "webpage09_01";
}
@PostMapping("/form")
public String submitForm(MultipartHttpServletRequest request) {
String name = request.getParameter("name");
MultipartFile file = request.getFile("fileImage");
String filename = file.getOriginalFilename();
File f = new File("c://upload//"+name+"_"+filename);
try {
file.transferTo(f);
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "webpage09_submit";
}
}
Request 부분에 있는 getparameter()와 getFile() 메서드를 사용한다.
(3)@ModelAttribute 이용
멀티파트 요청 매개변수와 동일한 이름으로 커맨드 객체에 MultipartFile 타입의 프로퍼티 추가
Member 클래스 작성
package com.springmvc.chap09;
import org.springframework.web.multipart.MultipartFile;
public class Member {
private String name;
private MultipartFile imageFile;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public MultipartFile getImageFile() {
return imageFile;
}
public void setImageFile(MultipartFile imageFile) {
this.imageFile = imageFile;
}
}
컨트롤러 작성
package com.springmvc.chap09;
import java.io.File;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/exam03")
public class Exampple03Controller {
@GetMapping("/form")
public String requestForm(Member member) {
return "webpage09_02";
}
@PostMapping("/form")
public String submitForm(@ModelAttribute("member") Member member, HttpServletRequest request, HttpSession session) {
String name = member.getName();
String filename = member.getImageFile().getOriginalFilename();
String save = request.getSession().getServletContext().getRealPath("/resources/images");
try {
member.getImageFile().transferTo(new File("c://upload//"+name+"_"+filename));
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "webpage09_submit";
}
}
JSP 페이지 작성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>File Upload</title>
</head>
<body>
<h3>파일 업로드</h3>
<form:form action="form" modelAttribute="member" method="post" enctype="multipart/form-data">
<p>이름: <form:input path="name"/>
<p>파일: <form:input path="imageFile" type="file"/>
<p><input type="submit" value="전송하기"/> <input type="reset" value="다시쓰기"/>
</form:form>
</body>
</html>
Ch10 예외 처리
10.1 개요
10.2 @ResponseStatus를 이용한 HTTP 상태 코드 기반 예외 처리
10.3 @ExceptionHandler를 이용한 컨트롤러 기반 예외 처리
10.4 @ControllerAdvice를 이용한 전역 예외 처리
10.1 개요
10.1.1 예외 처리
프로그램 실행 중에 어떤 문제가 일어났을 때 처리를 중단하고 다른 처리를 하는 것
프로그램이 비정상적으로 종료되는 것을 막는다.
※자바 파일의 예외는 자바로 처리하고, 뷰 페이지의 예외는 JSP로 처리하는 것이 깔끔하다.
10.1.2 예외 처리 방법의 종류
예외 처리를 위한 애너테이션
애너테이션 | 설명 |
@ResponseStatus | 발생한 예외를 HTTP 상태 코드로 매핑 |
@ExceptionHandler | 컨트롤러 안에 오류나 예외를 직접 구체화해서 예외 처리 메서드에 선언 |
@ControllerAdvice | 예외 처리 클래스에 선언 |
10.2 @ResponseStatus를 이용한 HTTP 상태 코드 기반 예외 처리
10.2.1 HTTP 상태 코드의 개요
서버 처리 결과를 알려주는 정보를 담고 있다.
응답 상태 코드 | 설명 | |
400 | BAD_REQUEST | 일반적인 요청 실패 |
401 | UNAUTHORIZED | 클라이언트 인증 문제 |
403 | FORBIDDEN | 인증 상태에 상관없이 액세스 금지 |
404 | NOT_FOUND | 요청 URI에 해당하는 리소스 없음 |
405 | METHOD_NOT_ALLOWED | HTTP 메서드가 지원되지 않음 |
406 | NOT_ACCEPTABLE | 요청된 리소스 미디어 타입을 제공하지 못함 |
409 | CONFLICT | 리소스 상태에 위반되는 행위 |
412 | PRECONDITION_FAILED | 조건부 연산 지원 |
415 | UNSUPPORTED_MEDIA_TYPE | 요청 페이로드에 있는 미디어 타입이 처리되지 못함 |
500 | INTERNAL_SERVER_ERROR | API가 잘못 작동함 |
10.2.2 @ResponseStatus를 이용한 예외 처리
ResponseStatusExceptionResolver 클래스가 제공(디스패처 서블릿에 등록되어있음)
형식
//예외 메서드에 사용
@ResponseStatus(value=HttpStatus.상태 코드, reason="오류 설명")
@RequestMapping(...)
public String 메서드명() {
...
}
//예외 클래스에 사용
@ResponseStatus(value=HttpStatus.상태 코드, reason="오류 설명")
public class 클래스명 extends RuntimeException{
...
}
@ResponseStatus에서 사용하는 속성
요소 | 타입 | 설명 |
code | HttpStatus | 응답에 사용되는 상태 코드 |
reason | String | 응답에 사용되는 이유 설명 |
value | HttpStatus | 코드 별칭 |
10.3 @ExceptionHandler를 이용한 컨트롤러 기반 예외 처리
10.3.1 @ExceptionHandler를 이용한 예외 처리
컨트롤러에서 예외가 발생하면 처리함. 예외 처리 메서드에 사용
형식
@ExceptionHandler(value={예외 클래스1.class[, 예외 클래스2.class,...]})
public String 메서드명(){
...
}
@ExceptionHandler
public String 메서드명(예외 클래스 exp){
...
}
@ExceptionHandler에서 사용하는 요소
요소 | 타입 | 설명 |
value | Class<? extends Throwable>[] | @ExceptionHandler가 선언된 메서드가 처리할 예외 클래스 |
10.4 @ControllerAdvice를 이용한 전역 예외 처리
10.4.1 전역 예외 처리를 위한 @ControllerAdvice
여러 컨트롤러에서 발생하는 예외를 공통으로 처리
형식
@ControllerAdvice(basePackages={"기본 패키지 이름, ..."})
public class 클래스명{
...
}
@ControllerAdvice에서 사용하는 요소
요소 | 타입 | 설명 |
annotations | Class<? extends Annotation>[] | 애너테이션 배열 |
assignableTypes | Class<?>[] | 클래스 배열 |
basePackageClasses | Class<?>[] | @ControllerAdvice가 적용된 클래스가 지원할 컨트롤러를 선택할 수 있는 패키지 지정 |
basePackages | String[] | 기본 패키지 배열 |
value | String[] | basePackages 속성의 별칭 |
@ControllerAdvice를 선언한 클래스에서는 컨트롤러에서 설정하는 @ExceptionHandler, @ModelAttribute, @InitBinder가 선언된 메서드를 사용할 수 있다.
Ch11 로그 기록
11.1 Log4j 개요
11.2 인터셉터 개요
11.3 인터셉터를 이용한 로그 기록 만들기
11.1 Log4j 개요
11.1.1 로깅 유틸리티 Log4j
11.1.2 Log4j의 구조와 로깅 레벨
11.1.3 로그 환경 설정 파일의 구성
11.2 인터셉터 개요
11.2.1 인터셉터
11.2.2 인터셉터 등록
11.3 인터셉터를 이용한 로그 기록 만들기
11.3.1 HandlerInterceptor를 이용한 로그 기록
11.3.2파일로 로그 기록 출력
11.3.3 HandlerInterceptorAdapter를 이용한 로그 기록