Spring의 예외처리(@ExceptionHandler), 파일업로드(multipartForm), 유효성검사(Hibernate-validator, 회원가입할때 조건), 인터셉터(HandlerInterceptor, 로그인 여부 ) - 로그인, 회원가입 처리 하기

2019. 7. 8. 22:48Spring

        ㅁ

spring의 예외처리 
        - @ExceptionHandler를 사용해서 예외처리를 수행한다. 
        - 예외처리 메소드 정의하기 
                @ExceptionHandler(예외클래스명.class) 
                public String xxxExceptionHandler(예외클래스 ex){ 
                        return "에러페이지명"; 
                } 

        * 예외클래스 메소드는 매핑된 예외가 발생되면 자동으로 실행되고, 
          지정된 에러페이지로 요청을 이동시킨다. 

        * 발생된 예외객체를 에러 페이지에 전달하기 위해서는 
          예외처리 메소드의 매개변수로 해당 예외클래스타입의  
          변수를 선언하기만 하면 된다. 

        * 예외처리 메소드는 매핑된 예외와 동일한 예외 혹은 자식타입의  
          예외가 발생될 때 실행된다. (예외클래스를 Exception을 설정할 경우) 

        * 매핑되는 예외처리 메소드가 두 개 이상일 때 더 구체적인 예외가 
          명시된 예외처리 메소드가 실행된다. 
            (아래와 같은경우는 위의 예외처리가 실행된다.) 

         
              @ExceptionHandler(AlreadyUsedIdException.class) 
                public String xxxExceptionHandler(AlreadyUsedIdException ex){ 
                        return "에러페이지명"; 
                } 

              @ExceptionHandler(Exception.class) 
                public String xxxExceptionHandler(Exception ex){ 
                        return "에러페이지명"; 
                }    

        * 위와 같이 정의되어 있는 경우 AlreadyUsedIdException이 발생하면 첫번째 
          예외처리 메소드가 실행된다. 
         
        * 만약 SqlException이 발생하면 두번째 예외처리 메소드가 실행된다. 

 

 

 

 

===================스프링 파일업로드 구(multipartForm)===============

스프링 파일업로드 구현
        1. pom.xml에 라이브러리 의존성 추가하기
                

 <dependency>
	<groupId>commons-fileupload</groupId>
	<artifactId>commons-fileupload</artifactId>
	<version>1.4</version>
</dependency>


                
        2. 멀티파트리졸브를 스프링의 빈으로 등록하기
               

<bean id="multipartResolver" 
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
</bean>

 


        3. 입력폼 구성하기

<form method="post" action="register.do" enctype="multipart/form-data">
	<label>제목</label><input type="text" name="title">
	<lable>파일</label><input type="file" name="upfile">
</form>	

    

 

        4. 폼클래스 정의하기
                public class SampleForm {
                        private String title;
                        private MultipartFile upfile;   // 첨부파일을 담는 변수는 
                                                        // MultipartForm 타입의 변수여야 한다.
                }

 


        5. 요청핸들러 메소드에서 폼입력값 받기
                @RequestMapping("/register.do")
                public String register(SampleForm sampleForm) { ... }

 


        6. 폼객체에 저장된 입력값을 VO객체에 복사하기
                Sample vo = new Sample();
                BeanUtils.copyProperties(sampleForm, vo);

 


        7. 폼객체의 MultipartFile에 저장된 첨부파일을 처리하기
                MultipartFile mf = sampleFile.getUpfile();
                if (!mf.isEmpty()) {
                        String filename = mf.getOriginalFilename();
                        ...
                }

* MultipartFile의 주요 메소드
        boolean        isEmpty()              : 첨부파일이 없는 경우 true를 반환한다.
        String         getOriginalFilename()  : 첨부파일의 이름을 반환한다.
        byte[]         getBytes()             : 첨부파일을 byte배열로 반환한다.
        InputStream    getInputStream()       : 첨부파일을 읽어올 수 있는 스트림을 반환한다.
        String         getContentType()       : 첨부파일의 타입을 반환한다.
        long           getSize()              : 첨부파일의 크기를 반환한다.
============================================================

 

=================================유효성 검사 Hibernate-validator

스프링에서 폼 입력값의 유효성 검증
        - 폼의 입력된 값이 개발자의 의도에 맞는 값인지를 확인하는 것
        - Hivernate-validator 라이브러리가 필요하다.
                * Hibernate-validator는 Form 객체 검증을 위한 다양한 @어노테이션 및
                  폼 입력값 검증기능을 제공한다.
                
                  예시) @Size(min = 6, message = "아이디는 6글자 이상 입력하세요")

        - JSR-303(Bean Validation 검증 관련 자바표준)에서 정의한 @어노테이션
                @AssertFalse    : 해당 속성의 값이 false인지 체크한다.
                @AssertTrue     : 해당 속성의 값이 true인지 체크
                @Email          : 해당 속성의 값이 유효한 이메일 형식인지 체크
                @Future         : 해당 속성의 값이 현재날짜 이후인지 체크
                @Past           : 해당 속성의 값이 현재날짜 이전인지 체크
                @Min            : 해당 속성의 값이 설정된 최소값보다 크거나 같은지 체크
                @Max            : 해당 속성의 값이 설정된 최대값보다 작거나 같은지 체크
                @NotNull        : 해당 속성의 값이 null이 아닌지 체크
                @NotBlank       : 해당 속성의 값이 빈 공백이 아닌지 체크
                @Size           : 해당 속성의 값의 길이가 지정된 최소/최대길이에 해당하는지 체크
                @Pattern        : 해당 속성의 값이 지정된 패턴에 일치하는지 체크

                @Valid          : 해당 폼객체에 대해서 유효성 체크를 실행한다.


작업순서
        1. Hibervate validation 유효성 체크 엔진 라이브러리를 pom.xml에 등록한다.
                
                    org.hibernate.validator
                    hibernate-validator
                    6.0.17.Final
                

        2. Form 클래스에 제약조건을 정의한다.
                public class UserForm {
                        @NotBlank(message="아이디는 필수입력값입니다.")
                        @Pattern(regexp="^[a-zA-Z0-9]{6,}$", message="아이디는 영대소...")
                        private String id;
                        ...
                }

        3. 폼입력값을 처리하는 컨트롤러의 요청핸들러 메소드에서 유효성 체크 수행하도록 설정하기
                @RequestMapping(value="/register.do", method=RequestMethod.GET)
                public String form(Model model){
                        // 폼입력페이지로 내부이동할 때 UserForm객체를 생성해서 view페이지에 전달한다.
                        model.addAttribute("userForm", new UserForm());
                        return "user/form";
                }

                @RequestMapping(value="/register.do", method=RequestMethod.POST)
                public String add(@Valid UserForm userForm, bindingResult errors){
                        // @Valid : UserForm객체에 저장된 값에 대해서 유효성 체크를 실행시킨다.
                        // BindingResult errors : 유효성 체크의 실행결과가 저장된다.
                        //                        유효성 체크를 통과하지 못한 값에 대해서는
                        //                        "필드명"과 "오류 메세지"가 포함된 Error객체가 저장된다.
                        //                         * BindingResult는 폼객체 바로 뒤에 선언되어야 한다.
                        if (errors.hasErrors()){
                                return "user/form";        // BindingResult에 Error가 저장되어 있는 경우
                                                           // 입력폼 페이지로 내부이동시킨다.
                        }

                        // 여기서부터는 유효성 체크를 통과했을 때 코드를 작성한다.
                        ....                        
                }

        4. 입력폼 화면에 유효성 체크관련 태그 추가하기
               

<form:form modelAttribute="userForm" method="post" action="register.do">
	<form:input path="id"/>        // userForm객체의 id값이 표시된다.
	<form:errors path="id"/>       // 유효성체크결과 id필드와 관련된 에러가 있을 경우
									// 에러 메세지가 표시된다.
	....
</form:form>


                

1. pom.xml에 라이브러리 추가



2. UserForm객체와 같은 폼객체에 유효성 체크를한다.



3. Controller에 유효성 체크관련 코드를 넣어준다.






-------------------------------인터셉터----------------------------
        
인터셉터
        - 컨트롤러 실행전, 실행후, 뷰실행후 실행될 코드를정의할 수 있다.
        - HanglerInterceptor 인터페이스나, HandlerInterceptorAdapter 클래스를 상속받아서 구현한다.
        - boolean preHandler()
                - 컨트롤러 실행전에 수행될 코드를 정의한다.
                - true를 반환하면 컨트롤러의 요청핸들러 메소드가 실행된다.
                * preHandler()를 주로 구현한다.
        - void postHandler()
                - 컨트롤러 실행후에 수행될 코드를 정의한다.
        - void afterCompletion()
                - 뷰 실행후 수행될 코드를 정의한다.
        - 용도
                - 로그인이 필요한 요청인 경우 로그인여부 체크하는 작업을 구현할 때 사용
                - 권한에 따른 접근제어작업을 구현할 때 사용
                - 로그를 출력하는 용도로 사용
                  * 요청 URL, 요청파라미터 등을 콘솔에 표시하는 용도
        - 구현하기
                public class SampleHandlerInterceptor extends HandlerInterceptorAdapter{
                        public boolean preHandler(HttpServletRequest request, HttpServletResponse response)
                                // 컨트롤러 실행전 수행할 작업 구현
                        
                                return true 혹은 false;
                }


        -설정하기
            

<!-- 인터셉터를 스프링의 빈으로 등록한다. -->
<bean id="sampleHandlerInterceptor" class="...SampleHandlerInterceptor"></bean>

<!-- 인터셉터 설정하기-->
<mvc:interceptors>
	<mvc:interceptor>
		<mvc:mapping path="인터셉터가 실행될 요청URL"/>
		<mvc:mapping path="인터셉터가 실행될 요청URL"/>
		<mvc:exclude-mapping path="인터셉터가 실행되지 않아도 되응 요청 URL"/>
		<mvc:exclude-mapping path="인터셉터가 실행되지 않아도 되응 요청 URL"/>
		<ref bean="sampleHandlerInterceptor"/>
	</mvc:interceptor>
	<mvc:interceptor>
		<mvc:mapping path="터셉터가 실행될 요청URL"/>
		<ref bean="xxxHandlerInterceptor"/>
	</mvc:interceptor>
</mvc:interceptors>


                        
                

인터셉스는 컨트롤러가 실행되기 전, 후에 실행되는 것이다.

1. pom.xml에서 스프링의 릴리즈를 3.2.18이상으로 해준다.



2. intercepter 패키지에 클래스를 만들어준다.



3. LoginCheckInterceptor.java파일을 만든다.



4. 에러 페이지를 만들어 준다.



5. 컨트롤러에 로그인 설정을 추가한다.

 

 

 

 

 

 

 

===========================================================

로그인 및 회원가입만들기

 

 

 

 

 

1. JSP 페이지 만들기 

       1) loginForm.jsp

 

 

        2) form.jsp(회원가입)

 

 

       3) completed.jsp(회원가입완료)

 

 

2. VO

 

 

3. IBATIS.xml

4. IBATIS-congif.xml

 

5. UserDao 작성

     1) userDao

     2) userDaoImpl

 

 

6. Exception 패키지에 로그인, 아이디 찯는 Exception을 설정한다. 중요!!!!!

 

 

 

 

 

UserService, UserServiceImpl의 구현내용

        1. UserService에 추상메소드 정의하기
                User login(String id, String password);

        2. UserService에 구현 메소드 정의하기        
                User login(String id, String password){
                        // 아이디에 해당하는 사용자 정보 조회하기
                                // 사용자정보가 null이면 예외발생
                        // 입력된 비밀번호를 암호화하기
                        // 암호화된 비밀번호와 db에서 조회된 비밀번호 비교하기
                                // 비밀번호가 일치하지 않으면 예외발생
                        // 조회된 User객체 반환
                }

 

7. userService

     1) userService

 

     2) userServiceImpl

위의 throws는 이처럼 에러를 표시해서 보내주는 용도다. 이건 Controller에 설정되어있다.

 

 

위의 유효성 검사를 적어둔것을 참고 바란다.

8. Form패키지에 UserForm를 추가한다.

 

 

 

9. mvc-context에 multipartForm을 추가한다.

 

 

 

10. multipartForm propertiese파일을 만든다.

 

 

 

 

UserController의 구현내

        1. /user/completed.do 요청을 처리하는 요청핸들러 메소드
                - WEB-INF/views/user/completed.jsp를 내부이동하는 구현

        2. /user/login.do Get 방식 요청을 처리하는 요청핸들러 메소드
                - WEB-INF/views/user/loginform.jsp로 내부이동하는 구현

        3. /user/login.do POST 방식 요청을 처리하는 요청핸들러 메소드
                - 입력된 id와 password를 전달받는 요청핸들러 메소드 구현

 

 

11. UserController를 작성한다.

 

     1) exception 처리를 해준다.

@Value 를 하면 설정한 properties파일의 속성 값이 들어간다.

그리고 미리 설정한 @ExceptionHandler로 jsp파일에 설정한 위치에 에러를 발생해준다.

 

     

     2) userForm (register.do) 실행을 만들어준다.  ※ 회원가입 폼

 

 

     3) register.do 회원가입 실행을 만든다.  ※. multipartform 사용(mvc-context에 설정한것)

 

     4)InitBinder 를(변환기) 사용해서 달력 형식을 바꾼다, 외국은 월-일-년이라 우리와 달라 바꾼것

 

     5) 로그인 행동을 만든다 ※. 로그인전의 url을 가지고 있다가 로그인 후 자동 실행되도록 한다.

 

    6) 가입완료 페이지, 로그아웃, 로그인 폼 만든다.

 

 

12. Interceptor패키지에 LoginCheckInterceptor를 만든다.

위처럼 설정을 하게되면 컨트롤러가 실행전에 실행되면서 url과 쿼리스트링 값이 세션에 담겨서 기존의 페이지로 이동할 수 있는것이다.

 

 

 

13. mvc-context에 로그인을 안해도 실행될, Interceptor를 패스할 url를 적어준다.