본문 바로가기
Programming/Spring

파일 업로드 / 예외처리

by TinKerBellBass 2017. 8. 20.
728x90
반응형

참고도서

스프링 퀵 스타트
국내도서
저자 : 채규태
출판 : 루비페이퍼 2016.06.30
상세보기



1. 파일 업로드

(1) form 태그 

1
2
3
4
5
6
<!-- http body 의 데이터를 바이너리로 설정해서 전송하기 위해 enctype 설정 -->
<!-- http body 를 사용하기 때문에 반드시 method 는 post, get 방식은 데이터 전송량에 한계가 있음 -->
<form action="insertBoard.do" method="post" enctype="multipart/form-data">
 
<!-- 파일 전송을 위한 input 태그의 type 속성값 -->
<input type="file" name="uploadFile"/>
cs


(2) Commnad 객체 수정


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// VO(Value Object)
public class BoardVO{
    // 스프링에서 제공하는 파일업로드 관련 객체
    // public interface MultipartFile extends InputStreamSource {}
    private MultipartFile uploadFile;
 
    // getter, setter
    public MultipartFile getUploadFile(){
        return uploadFile;
    }
 
    public MultipartFile setUploadFile(MultipartFile uploadFile){
        this.uploadFile = uploadFile;
    }
}
cs


(3) FileUpload 라이브러리 추가


maven repository 에서 apache commons fileupload 를 검색해서 pom.xml 에 설정

commons-fileupload, commons-io 라이브러리가 다운로드 된다.


(4) MultipartResolver 설정


1
2
3
4
5
6
7
<!-- CommonsMultipartResolver 클래스는 MultipartFile 객체를 생성한다 -->
<!-- DispatcherServlet  multipartResolver 이름으로 등록된 CommonsMultipartResolver 객체만 인식하도록 프로그램 되어 있으므로 -->
<!-- id 속성 값은 반드시 multipartResolver 가 되어야 한다. -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 파일 업로드 사이즈 설정 -->
    <property name="maxUploadSize" value="100000"/>
</bean>
cs

 

(5) 파일 업로드 처리


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Controller
@SessionAttribute("board")
public class BoardContorller{
 
    @Autowired
    private BoardService boardService;
 
    // 글 등록
    @RequestMapping("/insertBoard.do")    
    public String insertBoard(BoardVO vo) throws IOException{ // 파일관련 예외 처리
        // 파일 업로드 처리
        MultipartFile uploadFile = vo.getUploadFile();
        if(!uploadFile.isEmpty()){
            String fileName = uploadFile.getOriginalFilaname();
            uploadFile.transferTo(new File("D:/"+fileName));
        }
        
        boardService.insertBoard(vo);
        return "getBoardList.do";
    }
}
cs


MultipartFile 메소드


 String getOriginalFilename()

 업로드한 파일명을 문자열로 리턴

 void transferTo(File destFile)

 업로드한 파일을 desFile에 저장

 boolean isEmpty()

 업로드한 파일 존재 여부 리턴(없으면 true 리턴)


2. 예외 처리

(1) 컨트롤러에 예외처리 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Controller
public class LoginController {
 
    @RequestMapping(value = "/login.do", method = RequestMethod.GET)
    public String loginView(UserVO vo) {
        return "login.jsp";
    }
 
    @RequestMapping(value = "/login.do", method = RequestMethod.POST)
    public String login(UserVO vo, UserDAO userDAO, HttpSession session) {
        // 아이디를 입력하지 않으면 IllegalArgumentException 에러를 발생 시
        if(vo.getId()==null || vo.getId().equals("")) {
            throw new IllegalArgumentException("아이디는 반드시 입력해야 합니다.");
        }
        
        UserVO user = userDAO.getUser(vo);
        if (user != null) {
            session.setAttribute("userName", user.getName());
            return "getBoardList.do";
        } else
            return "login.jsp";
    }
}
cs


(2) @ExceptionHnadler 어노테이션을 사용하기 위해서 presentation-layer.xml 파일에 설정 추가
     View 관련 처리이므로 Presentation Layer 에서 구동되는 스프링 컨테이너 이용

1
2
3
<!-- presentation-layer.xml 에 설정, namespace에 mvc  -->
<!-- @ExceptionHandler 어노테이션 사용 가능 -->
<mvc:annotation-driven/>
cs

(3) 예외 처리 관련 클래스 작성(어노테이션 기반 설정)

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// @ControllerAdvice 어노테이션에 의해 CommonExceptionHandelr 객체가 자동으로 생성
// com.neverland.view 패키지로 시작하는 컨트롤로에서 예외가 발생하면
// @ExceptionHnadler 어노테이션으로 지정한 메소드가 실행 된다
@ControllerAdvice("com.neverland.view")
public class CommonExceptionHandler {
 
    // @ExceptionHandelr(예외 관련 클래스)
    @ExceptionHandler(ArithmeticException.class)
    public ModelAndView handleArithmeticException(Exception e) {
        ModelAndView mav = new ModelAndView();
        // 예외 메시지를 Model 에 담는다
        mav.addObject("exception", e);
        // 예외가 발생했을 때 호출되는 View
        mav.setViewName("/common/arithmeticError.jsp");
        return mav;
    }
 
    @ExceptionHandler(NullPointerException.class)
    public ModelAndView handleNullPointerException(Exception e) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", e);
        mav.setViewName("/common/nullPointerError.jsp");
        return mav;
    }
 
    @ExceptionHandler(Exception.class)
    public ModelAndView handleException(Exception e) {
        ModelAndView mav = new ModelAndView();
        mav.addObject("exception", e);
        mav.setViewName("/common/error.jsp");
        return mav;
    }
}
cs



(4) View 에서 사용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<body>
    <div style="background-color: #ffffff; color: #000000; text-align: center; margin: auto-margin;">
        <!-- 타이틀 시작 -->
        <table style="width: 100%;" border="1">
            <tr>
                <td>
                    <b>기본 에러 화면 입니다.</b>
                </td>
            </tr>
        </table>
        <br />
        <!-- 에러 메시지 -->
        <table style="width: 100%;" border="1">
            <tr>
                <td>
                    <br /><br /><br /><br /><br />
                    <!-- Model에 담긴 값을 꺼내와서 출력 -->
                    Message: ${exception.message }
                    <br /><br /><br /><br /><br />
                </td>
            </tr>
        </table>
    </div>
</body>
cs



(5) XML 기반의 예외 처리 설정


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!-- 예외 처리 설정, presentation-layer.xml -->
<!-- SimpleMappingExceptionResolver 빈 등록 -->
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
            <!-- 예외 처리 관련 클래스 설정 -->
            <prop key="java.lang.ArithmeticException">
                <!-- key에 설정한 에러 발생시 출력되는 View -->
                common/arithmeticError.jsp
            </prop>
            <prop key="java.lang.NullPointerException">
                common/nullPointerError.jsp
            </prop>
        </props>
    </property>
    <property name="defaultErrorView" value="common/error.jsp"></property>
</bean>
cs


728x90
반응형

'Programming > Spring' 카테고리의 다른 글

데이터 변환  (0) 2017.08.20
다국어 처리  (0) 2017.08.20
AOP 기초  (0) 2017.08.19
Bean 라이프 사이클과 범위  (0) 2017.08.19
자바 코드를 이용한 설정  (0) 2017.08.19

댓글