정리노트

[스프링] 파일 업로드 처리, 예외 처리,

망고고래 2024. 1. 23. 16:50

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를 이용한 로그 기록