유정잉

56일차 스프링 [ MVC - 어노테이션, 유효성, 인터셉터, DB 설정 ] 본문

네이버 클라우드 부트캠프/복습 정리

56일차 스프링 [ MVC - 어노테이션, 유효성, 인터셉터, DB 설정 ]

유정♡ 2024. 5. 10. 10:31

10. 어노테이션 종류들

      (@AssertTrue, @AssertFalse, @Max, @Min, @Size, @Null, @NotNull, @Digits, @Pattern

        @NotEmpty, @NotBlank, @Positive, @PositiveOrZero, @Negative, @Email ... )

11. 유효성 (Validator C)

         <validator 커스터마이징> : 1. Validator 인터페이스 구현   2. 컨트롤러에 인터페이스 등록

12. 인터셉터

        : AOP요소를 적용한 스프링 MVC 요소  (관심을 가지고 있다가 요청이 들어오면 컨트롤러를 이용해 가로챌수있다)

13. DB 자바 설정 / DB xml 설정 

 


[ MVC_Basic_20 - project ] - @어노테이션 종류들 

@AssertTrue //true가 아닌 값이 들어오면 오류

private boolean num1;

 

@AssertFalse //false가 아닌 값이 들어오면 오류

private boolean num2;

 

@Max(200)

@Min(20)

private String num3;

 

@Null //값이 들어오면 오류

private String num4;

 

@NotNull //값이 들어오지 않으면 오류 // Null은 int이면 안 되기 때문에 String으로 설정

private String num5;

 

@Digits(integer = 3, fraction = 5) //정수는 3, 실수 2자릿수

private String num6;

 

@Size(min=2, max=10) //지정된 글자수보다 짧거나 길면 오류

private String num7;

 

@Pattern(regexp = "[a-zA-Z]*") //주어진 정규식에 위배되면 오류

private String num8;

 

      //어노테이션 지정한 필드에 값 집어넣기

      public Data() { 

             this.num1=true;

             this.num2=false;

             this.num3="10";

             this.num4=null;

             this.num5="spring";

             this.num6="222.22";

             this.num7="java";

             //num8은 input type에서 작성

        }

 

1) kt.bit.beans package에 Data.java class 생성 후 어노테이션 지정

package kr.bit.beans;

import javax.validation.constraints.AssertFalse;
import javax.validation.constraints.AssertTrue;
import javax.validation.constraints.Digits;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

public class Data {

	@AssertTrue //true가 아닌 값이 들어오면 오류 
	private boolean num1;
	
	@AssertFalse //false가 아닌 값이 들어오면 오류 
	private boolean num2;
	
	@Max(200)
	@Min(20)
	private String num3;
	
	@Null //값이 들어오면 오류 
	private String num4;
	
	@NotNull //값이 들어오지 않으면 오류 // Null은 int이면 안 되기 때문에 String으로 설정  
	private String num5;
	
	@Digits(integer = 3, fraction = 5) //정수는 3, 실수 2자릿수 
	private String num6;
	
	@Size(min=2, max=10) //지정된 글자수보다 짧거나 길면 오류 
	private String num7;
	
	@Pattern(regexp = "[a-zA-Z]*") //주어진 정규식에 위배되면 오류 
	private String num8;
	
	public Data() { //값 집어넣기 
		this.num1=true;
		this.num2=false;
		this.num3="10";
		this.num4=null;
		this.num5="spring";
		this.num6="222.22";
		this.num7="java";
		//num8은 input type에서 작성
	}

	public boolean isNum1() {
		return num1;
	}

	public void setNum1(boolean num1) {
		this.num1 = num1;
	}

	public boolean isNum2() {
		return num2;
	}

	public void setNum2(boolean num2) {
		this.num2 = num2;
	}

	public String getNum3() {
		return num3;
	}

	public void setNum3(String num3) {
		this.num3 = num3;
	}

	public String getNum4() {
		return num4;
	}

	public void setNum4(String num4) {
		this.num4 = num4;
	}

	public String getNum5() {
		return num5;
	}

	public void setNum5(String num5) {
		this.num5 = num5;
	}

	public String getNum6() {
		return num6;
	}

	public void setNum6(String num6) {
		this.num6 = num6;
	}

	public String getNum7() {
		return num7;
	}

	public void setNum7(String num7) {
		this.num7 = num7;
	}

	public String getNum8() {
		return num8;
	}

	public void setNum8(String num8) {
		this.num8 = num8;
	}
	
}

 

2) views 폴더 안에 index.jsp, test1.jsp. test2.jsp 

[ index.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>

<body>

<a href="t1">test1</a><br>

</body>
</html>
[ test1.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<body>

<form:form modelAttribute="data" method="post" action="test_proc">

	num1 : <form:radiobutton path="num1" value='true'/>true
	       <form:radiobutton path="num1" value='false'/>false<br>
	       <form:errors path="num1"/><br> 

	       
	num2 : <form:radiobutton path="num2" value='true'/>true
	       <form:radiobutton path="num2" value='false'/>false<br>
	       <form:errors path="num2"/><br> 

	num3 : <form:input path="num3" type='text'/><br>
		   <form:errors path="num3"/><br> 
		   
	num4 : <form:checkbox path="num4" value="check1"/>check1<br>
		   <form:errors path="num4"/><br> 
	
	num5 : <form:checkbox path="num5" value="check2"/>check2<br>
		   <form:errors path="num5"/><br> 

	num6 : <form:input path="num6" type='text'/><br>
		   <form:errors path="num6"/><br> 
		   
	num7 : <form:input path="num7" type='text'/><br>
		   <form:errors path="num7"/><br> 
		   
	num8 : <form:input path="num8" type='text'/><br>
		   <form:errors path="num8"/><br> 
	
	<form:button type="submit">체크</form:button>
</form:form>
</body>
</html>
[ test2.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>success</h1>
</body>
</html>

 

3) kr.bit.controller package 안에 SpringController.java class 에서 

package kr.bit.controller;

import javax.validation.Valid;

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import kr.bit.beans.Data;

//properties -> 실행 중 절대 변하지 않는 값들을 properties 파일 안에 넣어줘야 함 
//ex) 유효성 검사, DB정보 (=유효성검사를 properties안에 싹다 넣어 줌)
@Controller
public class SpringController {

	@GetMapping("/t1")
	public String t1(Data data) {
		return "test1";
	}

	@PostMapping("/test_proc") //입력한 값 유효성 검사 -> 유효성 검사에 대한 결과값 
	public String test_proc(@Valid Data data, BindingResult result) {
		
		if(result.hasErrors()) {
			return "test1";
		}
		return "test2";
	}

}

 

4) properties 폴더 안에 error.properties File 생성해서 오류 메세지 작성 하고 

     kr.bit.config package안에 ServletAppContext.java 파일에 error파일 등록

[ error.properties 파일 ]

#ture여야 하는데 아니여서 이렇게 오류 메세지가 발생하게 만드는 것 !
AssertTrue.data.num1=num1은 true가 아니다  
AssertTrue.data.num2=num2은 flase가 아니다 
Max.data.num3=num3는 200이하여야 한다
Min.data.num3=num3는 20이상이여야 한다
Null.data.num4=num4는 값이 주입되면 안 된다
NotNull.data.num5=num5는 값이 주입되어야 한다
Digits.data.num6=num6는 정수 3자리, 실수 2자리이여야 한다
Size.data.num7=num7은 2자리~10자리까지 가능하다 
Pattern.data.num8=정규식에 위배된다
package kr.bit.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@EnableWebMvc
@ComponentScan("kr.bit.controller")
@ComponentScan("kr.bit.beans")
public class ServletAppContext implements WebMvcConfigurer{
	
	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		WebMvcConfigurer.super.configureViewResolvers(registry);
		registry.jsp("/WEB-INF/views/",".jsp");
	}
	
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		WebMvcConfigurer.super.addResourceHandlers(registry);
		registry.addResourceHandler("/**").addResourceLocations("/resources/");
	}
	
	//Properties파일을 jsp 화면에 가져가지 위해 등록해야함 
	@Bean
	public ReloadableResourceBundleMessageSource source() {
		ReloadableResourceBundleMessageSource res = new ReloadableResourceBundleMessageSource();
		
		//하나일 경우는 res.setBasename을 사용 / 복수는 names ! 
		res.setBasename("/WEB-INF/properties/error"); //확장자 빼고 파일명만 적으면 됨 
		res.setDefaultEncoding("UTF-8");
		
		return res;
	}
}

 

왼쪽이 test1 누르면 딱 뜨는 화면 / 오른쪽이 어노테이션으로 설정한 값과 다르게 입력하면 발생하는 오류 메세지 

 

 


[ MVC_Basic_21 - project ] - @어노테이션 종류들 

@NotEmpty //값이 길이가 0이면(=비어있으면) 오류 발생(공백도 글자로 인식)

private String num1;

 

@NotBlank //공백제거하고 길이가 0이면 오류 발생

private String num2;

 

@Positive //양수 아니면 오류 발생

private int num3;

 

@PositiveOrZero //양수 또는 0 아니면 오류 발생

private int num4;

 

@Negative //음수 아니면 오류 발생

private int num5;

 

@Email //Email양식 맞아야 함 (@들어가야됨)

private String num6;

 

      public Data() {

            this.num1="aa";

            this.num2="aa";

            this.num3=40;

            this.num4=40;

            this.num5=3;

       }

 

1) kt.bit.beans package에 Data.java class 생성 후 어노테이션 지정

package kr.bit.beans;

import javax.validation.constraints.Email;
import javax.validation.constraints.Negative;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Positive;
import javax.validation.constraints.PositiveOrZero;

public class Data {

	@NotEmpty //값이 길이가 0이면(=비어있으면) 오류 발생(공백도 글자로 인식)
	private String num1;
	
	@NotBlank //공백제거하고 길이가 0이면 오류 발생
	private String num2;
	
	@Positive //양수 아니면 오류 발생
	private int num3;
	
	@PositiveOrZero //양수 또는 0 아니면 오류 발생
	private int num4;
	
	@Negative //음수 아니면 오류 발생 
	private int num5;
	
	@Email //Email양식 맞아야 함 (@들어가야됨)
	private String num6;
	
	public Data() {
		this.num1="aa";
		this.num2="aa";
		this.num3=40;
		this.num4=40;
		this.num5=3;

	}

	public String getNum1() {
		return num1;
	}

	public void setNum1(String num1) {
		this.num1 = num1;
	}

	public String getNum2() {
		return num2;
	}

	public void setNum2(String num2) {
		this.num2 = num2;
	}

	public int getNum3() {
		return num3;
	}

	public void setNum3(int num3) {
		this.num3 = num3;
	}

	public int getNum4() {
		return num4;
	}

	public void setNum4(int num4) {
		this.num4 = num4;
	}

	public int getNum5() {
		return num5;
	}

	public void setNum5(int num5) {
		this.num5 = num5;
	}

	public String getNum6() {
		return num6;
	}

	public void setNum6(String num6) {
		this.num6 = num6;
	}
	
}

 

2) views 폴더 안에 index.jsp, test1.jsp. test2.jsp 

[ index.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>

<body>

<a href="t1">test1</a><br>

</body>
</html>
[ test1.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<body>

<form:form modelAttribute="data" method="post" action="test_proc">

	num1 : <form:input path="num1" type='text'/><br>
		   <form:errors path="num1"/><br>
	       
	num2 : <form:input path="num2" type='text'/><br> 
	       <form:errors path="num2"/><br> 

	num3 : <form:input path="num3" type='text'/><br>
		   <form:errors path="num3"/><br> 
		   
	num4 : <form:input path="num4" type='text'/><br>
		   <form:errors path="num4"/><br> 
	
	num5 : <form:input path="num5" type='text'/><br>
		   <form:errors path="num5"/><br> 

	num6 : <form:input path="num6" type='text'/><br>
		   <form:errors path="num6"/><br> 
	
	<form:button type="submit">체크</form:button>
</form:form>
</body>
</html>
[ test2.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>success</h1>
</body>
</html>

 

3) kr.bit.controller package 안에 SpringController.java class 에서 

package kr.bit.controller;

import javax.validation.Valid;

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import kr.bit.beans.Data;

//properties -> 실행 중 절대 변하지 않는 값들을 properties 파일 안에 넣어줘야 함 
//ex) 유효성 검사, DB정보 (=유효성검사를 properties안에 싹다 넣어 줌)
@Controller
public class SpringController {

	@GetMapping("/t1")
	public String t1(Data data) {
		return "test1";
	}
	
	@PostMapping("/test_proc") //입력한 값 유효성 검사 -> 유효성 검사에 대한 결과값 
	public String test_proc(@Valid Data data, BindingResult result) {
		
		if(result.hasErrors()) {
			return "test1";
		}
		return "test2";
	}

}

 

4) properties 폴더 안에 error.properties File 생성해서 오류 메세지 작성 하고

     kr.bit.config package안에 ServletAppContext.java 파일에 error파일 등록

[ error.properties 파일 ]

NotEmpty.data.num1=길이는 0보다 커야한다 
NotBlank.data.num2=길이는 공백제거하고 0보다 커야한다 
Positive.data.num3=양수만 허용한다 
PositiveOrZero.data.num4=0 또는 양수만 허용한다 
Negative.data.num5=음수만 허용한다 
Email.data.num6=이메일 형식이여야한다
package kr.bit.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@EnableWebMvc
@ComponentScan("kr.bit.controller")
@ComponentScan("kr.bit.beans")
public class ServletAppContext implements WebMvcConfigurer{
	
	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		WebMvcConfigurer.super.configureViewResolvers(registry);
		registry.jsp("/WEB-INF/views/",".jsp");
	}
	
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		WebMvcConfigurer.super.addResourceHandlers(registry);
		registry.addResourceHandler("/**").addResourceLocations("/resources/");
	}
	
	//Properties파일을 jsp 화면에 가져가지 위해 등록해야함 
	@Bean
	public ReloadableResourceBundleMessageSource source() {
		ReloadableResourceBundleMessageSource res = new ReloadableResourceBundleMessageSource();
		
		//하나일 경우는 res.setBasename을 사용 / 복수는 names ! 
		res.setBasename("/WEB-INF/properties/error"); //확장자 빼고 파일명만 적으면 됨 
		res.setDefaultEncoding("UTF-8");
		
		return res;
	}
}

왼쪽이 test1 누르면 딱 뜨는 화면 / 오른쪽이 어노테이션으로 설정한 값과 다르게 입력하면 발생하는 오류 메세지 

 

 


[ MVC_Basic_22 - project ] - Validator 유효성 검사 

 

1) kt.bit.validator package에 DataValidator.java class 생성 후 1. Validator 인터페이스 구현

     <validator 커스터마이징> 1. Validator 인터페이스 구현   2. 컨트롤러에 인터페이스 등록

     @어노테이션으로 지정하기 힘든 오류 같은 경우 이런 방식으로 에러를 정의 함 

//<validator 커스터마이징>

//1. Validator 인터페이스 구현

//2. 컨트롤러에 인터페이스 등록

public class DataValidator implements Validator { //1. Validator 인터페이스 구현

 

         @Override

         public boolean supports(Class<?> clazz) {

                // 유효성 검사할 데이터를 가지고 있는 객체가 유효성 검사가 가능한지 확인 (확인가능하면 true 아니면 false)

                return false;

          }

 

           @Override

           public void validate(Object target, Errors errors) {

                   // 유효성 검사하는 메서드

             }

}

package kr.bit.validator;


import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

import kr.bit.beans.Data;
//<validator 커스터마이징>
//2. 컨트롤러에 인터페이스 등록	
	
//1. Validator인터페이스 구현
public class DataValidator implements Validator  {

	@Override
	public boolean supports(Class<?> clazz) {
		//유효성 검사할 데이터를 가지고 있는 객체가 유효성 검사가 가능한지 확인
		return Data.class.isAssignableFrom(clazz);
		
	}
	@Override
	public void validate(Object target, Errors errors) {
		//유효성 검사하는 메서드
		ValidationUtils.rejectIfEmpty(errors, "num2", "error2"); //num2가 empty면 에러이름은 error2로 함
		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "num3", "error3");
		
		Data d=(Data)target;
		
		String str1=d.getNum2();
		String str2=d.getNum3();
		
		if(str1.length()>5) {
			errors.rejectValue("num2", "error4"); //num2길이가 5자리 넘어가면 error4라는 이름으로 에러 정의
		}
		
		if(str2.contains("-")==false) {
			errors.rejectValue("num3", "error5");
		}

	}
}

 

2) kt.bit.beans package에 Data.java class 생성 후 어노테이션 지정

package kr.bit.beans;

import javax.validation.constraints.Size;

public class Data {

    @Size(min = 4, max = 10)
    private String num1;

    private String num2;
    private String num3;

    public String getNum1() {
        return num1;
    }

    public void setNum1(String num1) {
        this.num1 = num1;
    }

    public String getNum2() {
        return num2;
    }

    public void setNum2(String num2) {
        this.num2 = num2;
    }

    public String getNum3() {
        return num3;
    }

    public void setNum3(String num3) {
        this.num3 = num3;
    }
}

 

3) views 폴더 안에 index.jsp, test1.jsp. test2.jsp 

[ index.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
   pageEncoding="UTF-8"%>

<body>

<a href="t1">test1</a><br>

</body>
</html>
[ test1.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<body>

<form:form modelAttribute="data" method="post" action="test_proc">

	num1 : <form:input path="num1" type='test'/><br>
			<form:errors path="num1"/><br>
		   
	num2 : <form:input path="num2" type='text'/><br>
		   <form:errors path="num2"/><br> 
		   
	num3 : <form:input path="num3" type='text'/><br>
		   <form:errors path="num3"/><br> 
		   
	<form:button type="submit">체크</form:button>
</form:form>
</body>
</html>
[ test2.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>success</h1>
</body>
</html>

 

4) kr.bit.controller package 안에 SpringController.java class 에서 

     2. 컨트롤러에 인터페이스 등록 작업 

package kr.bit.controller;

import javax.validation.Valid;

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PostMapping;

import kr.bit.beans.Data;
import kr.bit.validator.DataValidator;

@Controller
public class SpringController {
	
	@GetMapping("/t1")
	public String t1(Data data) {
		return "test1";
	}
	
	@PostMapping("/test_proc") 
	public String test_proc(@Valid Data data, BindingResult result) {
		
		if(result.hasErrors()) {
			return "test1";
		}
		return "test2";
	}
	
	@InitBinder
	public void initBinder(WebDataBinder binder) { //2. 컨트롤러에 인터페이스 등록	
		DataValidator validator = new DataValidator();
		
		//binder.setValidator(validator);
		binder.addValidators(validator);
	}
	
}

 

5) properties 폴더 안에 error.properties File 생성해서 오류 메세지 작성 하고 

[ error.properties 파일 ]

Size.data.num1=4~10글자여야 한다
error2.data.num2=길이가 0보다 커야한다
error4.data.num2=길이가 5글자 넘어가면 안 된다 
error3.data.num3=공백제거하고 0보다 커야한다 
error5.data.num3=num3은 "-"기호를 포함해야 한다

왼쪽이 test1 누르면 딱 뜨는 화면 / 오른쪽이 어노테이션으로 설정한 값과 다르게 입력하면 발생하는 오류 메세지 

 


[ MVC_Basic_23 - project ] - 인터셉터 interceptor

 

1) kt.bit.beans package에 Data.java class 생성 후 어노테이션 지정

 

3) kr.bit.controller package 안에 SpringController.java class 에서 

1) kt.bit.interceptor package에 Inter1.java class 생성 후 

    implements HandlerInterceptor (여기서 요청 발생 시 호출되는 메서드 코드가 중복되는 부분이 있을 때 인터셉터를 통해 처리한다)

    Inter1~8까지 생성 숫자만 바뀌게 내용은 똑같음 ! 

package kr.bit.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class Inter1 implements HandlerInterceptor{
	//요청 발생 시 호출되는 메서드 코드가 중복되는 부분이 있을 때 인터셉터를 통해 처리한다
	//로그인 여부 확인, 등급별 서비스 권한, 관리자/회원 작업처리에서 많이 사용 
	
	//controller 메서드가 호출되기 전에 호출 됨 
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		System.out.println("pre-inter1");
		
		return true;
	}
	
	//controller 메서드가 호출된 이후에 호출됨(view 처리 수행 전에 호출 됨)
	public void postHandle (HttpServletRequest request, HttpServletResponse reponse, Object handler,
						    ModelAndView modelAndVie) throws Exception {
		System.out.println("post-inter1");
	}
	
	//view 처리 끝나고 응답 결과가 브라우저로 전달되기 전에 호출 됨
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
		System.out.println("afterCompletion-inter1");
	}
	
	
	
}
package kr.bit.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class Inter2 implements HandlerInterceptor{
	//요청 발생 시 호출되는 메서드 코드가 중복되는 부분이 있을 때 인터셉터를 통해 처리한다
	//로그인 여부 확인, 등급별 서비스 권한, 관리자/회원 작업처리에서 많이 사용 
	
	//controller 메서드가 호출되기 전에 호출 됨 
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		System.out.println("pre-inter2");
		
		return true;
	}
	
	//controller 메서드가 호출된 이후에 호출됨(view 처리 수행 전에 호출 됨)
	public void postHandle (HttpServletRequest request, HttpServletResponse reponse, Object handler,
						    ModelAndView modelAndVie) throws Exception {
		System.out.println("post-inter2");
	}
	
	//view 처리 끝나고 응답 결과가 브라우저로 전달되기 전에 호출 됨
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
		System.out.println("afterCompletion-inter2");
	}
	
	
	
}

 

2) kr.bit.config package 안에 ServletAppContext.java에 인터셉터 등록 !

//인터셉터 등록 - 경로와 인터셉터를 설정하기 위해

public void addInterceptors(InterceptorRegistry reg) {

 

        WebMvcConfigurer.super.addInterceptors(reg);

 

         Inter1 i1 = new Inter1();

         InterceptorRegistration r1 = reg.addInterceptor(i1);

 

          r1.addPathPatterns("/t1");

}

package kr.bit.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import kr.bit.interceptor.Inter1;
import kr.bit.interceptor.Inter2;
import kr.bit.interceptor.Inter3;
import kr.bit.interceptor.Inter4;
import kr.bit.interceptor.Inter5;
import kr.bit.interceptor.Inter6;
import kr.bit.interceptor.Inter7;
import kr.bit.interceptor.Inter8;

@Configuration
@EnableWebMvc
@ComponentScan("kr.bit.controller")
public class ServletAppContext implements WebMvcConfigurer {

	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		WebMvcConfigurer.super.configureViewResolvers(registry);
		registry.jsp("/WEB-INF/views/", ".jsp");
	}

	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		WebMvcConfigurer.super.addResourceHandlers(registry);
		registry.addResourceHandler("/**").addResourceLocations("/resources/");
	}

	@Bean(name = "messageSource")
	public ReloadableResourceBundleMessageSource messageSource() {
		ReloadableResourceBundleMessageSource res = new ReloadableResourceBundleMessageSource();
		res.setBasename("/WEB-INF/properties/error");
		return res;
	}

	//인터셉터 등록 - 경로와 인터셉터를 설정하기 위해 
	public void addInterceptors(InterceptorRegistry reg) {
		
		WebMvcConfigurer.super.addInterceptors(reg);
		
		Inter1 i1 = new Inter1();
		Inter2 i2 = new Inter2();
		Inter3 i3 = new Inter3();
		Inter4 i4 = new Inter4();
		Inter5 i5 = new Inter5();
		Inter6 i6 = new Inter6();
		Inter7 i7 = new Inter7();
		Inter8 i8 = new Inter8();
		
		InterceptorRegistration r1 = reg.addInterceptor(i1);
		InterceptorRegistration r2 = reg.addInterceptor(i2);
		InterceptorRegistration r3 = reg.addInterceptor(i3);
		InterceptorRegistration r4 = reg.addInterceptor(i4);
		InterceptorRegistration r5 = reg.addInterceptor(i5);
		InterceptorRegistration r6 = reg.addInterceptor(i6);
		InterceptorRegistration r7 = reg.addInterceptor(i7);
		InterceptorRegistration r8 = reg.addInterceptor(i8);
		
		r1.addPathPatterns("/t1"); //클릭을안하고(=Controller를 안누르면) 서버를 실행한 시켰을때는 매핑이 되지 않아 콘솔창에 뜨지 않음 (=위빙?) 
		r2.addPathPatterns("/t1"); //interceptor가 가로채 갈 주소를 등록 
		r3.addPathPatterns("/t2");
		
		r4.addPathPatterns("/t1");
		r4.addPathPatterns("/t2");
		
		r4.addPathPatterns("/t1","/t2"); //이런식으로 2개를 한번에 걸어줄 수도 있음 
		
	}
	
}

왼쪽이 실행만 헀을 경우 1,2,3,4가 출력 되지 않음 / 오른쪽이 실행후 test1 클릭했을 경우 

 

혹은 

package kr.bit.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import kr.bit.interceptor.Inter1;
import kr.bit.interceptor.Inter2;
import kr.bit.interceptor.Inter3;
import kr.bit.interceptor.Inter4;
import kr.bit.interceptor.Inter5;
import kr.bit.interceptor.Inter6;
import kr.bit.interceptor.Inter7;
import kr.bit.interceptor.Inter8;

@Configuration
@EnableWebMvc
@ComponentScan("kr.bit.controller")
public class ServletAppContext implements WebMvcConfigurer {

	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		WebMvcConfigurer.super.configureViewResolvers(registry);
		registry.jsp("/WEB-INF/views/", ".jsp");
	}

	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		WebMvcConfigurer.super.addResourceHandlers(registry);
		registry.addResourceHandler("/**").addResourceLocations("/resources/");
	}

	@Bean(name = "messageSource")
	public ReloadableResourceBundleMessageSource messageSource() {
		ReloadableResourceBundleMessageSource res = new ReloadableResourceBundleMessageSource();
		res.setBasename("/WEB-INF/properties/error");
		return res;
	}

	//인터셉터 등록 - 경로와 인터셉터를 설정하기 위해 
	public void addInterceptors(InterceptorRegistry reg) {
		
		WebMvcConfigurer.super.addInterceptors(reg);
		
		Inter1 i1 = new Inter1();
		Inter2 i2 = new Inter2();
		Inter3 i3 = new Inter3();
		Inter4 i4 = new Inter4();
		Inter5 i5 = new Inter5();
		Inter6 i6 = new Inter6();
		Inter7 i7 = new Inter7();
		Inter8 i8 = new Inter8();
		
		InterceptorRegistration r1 = reg.addInterceptor(i1);
		InterceptorRegistration r2 = reg.addInterceptor(i2);
		InterceptorRegistration r3 = reg.addInterceptor(i3);
		InterceptorRegistration r4 = reg.addInterceptor(i4);
		InterceptorRegistration r5 = reg.addInterceptor(i5);
		InterceptorRegistration r6 = reg.addInterceptor(i6);
		InterceptorRegistration r7 = reg.addInterceptor(i7);
		InterceptorRegistration r8 = reg.addInterceptor(i8);
		
		r1.addPathPatterns("/t1"); //클릭을안하고(=Controller를 안누르면) 서버를 실행한 시켰을때는 매핑이 되지 않아 콘솔창에 뜨지 않음 (=위빙?) 
		r2.addPathPatterns("/t1"); //interceptor가 가로채 갈 주소를 등록 
		r3.addPathPatterns("/t2");
		r4.addPathPatterns("/t1","/t2"); //이런식으로 2개를 한번에 걸어줄 수도 있음
		
		r5.addPathPatterns("/s1/t3" , "/s1/t4");
		
		r6.addPathPatterns("/*");
		r7.addPathPatterns("/s1/*");
		r8.addPathPatterns("/**");
		r8.addPathPatterns("/*"); //interceptor가 가로채가지 않을 주소를 등록
		
	}
	
}

실행만 하고 아무것도 클릭하지 않았을 경우
왼 test1 클릭했을 경우 / 오 test2 클릭했을 경우 

 

3) views 폴더 안에 index.jsp, test1.jsp, test2.jsp, test3.jsp, test4.jsp 

[ index.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<a href='t1'>test1</a>
	<a href='t2'>test2</a>
	
	<a href='s1/t3'>s1/test3</a>
	<a href='s1/t4'>s1/test4</a>
</body>
</html>
 test1.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<body>
	<h1>test1</h1>
</body>
</html>

 


[ MVC_Basic_24- project ] - DB 자바 설정 

 

1) MySQL table 생성 

create table mvc_table(
	num1 varchar(100) not null,
    num2 varchar(100) not null,
    num3 varchar(100) not null);
    
desc mvc_table;

SET SQL_SAFE_UPDATES = 0;

 

2) pom.xml에서 DB연결 관련 라이브러리 확인 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
						http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>MVC_Basic_01</groupId>
	<artifactId>MVC_Basic_01</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<build>
		<sourceDirectory>src</sourceDirectory>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.8.0</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-war-plugin</artifactId>
				<version>3.2.1</version>
				<configuration>
					<warSourceDirectory>WebContent</warSourceDirectory>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<!-- 라이브러리 버전관리 -->
	<properties>
		<javax.servlet-version>4.0.1</javax.servlet-version>
		<javax.servlet.jsp-version>2.3.3</javax.servlet.jsp-version>
		<javax.servlet.jsp.jstl-version>1.2</javax.servlet.jsp.jstl-version>
		<org.springframework-version>5.2.2.RELEASE</org.springframework-version>
		<!-- <org.springframework-version>4.3.25.RELEASE</org.springframework-version> -->
	</properties>
	<!-- 라이브러리 셋팅 -->
	<dependencies>
		<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>${javax.servlet-version}</version>
			<scope>provided</scope>
		</dependency>
		<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>javax.servlet.jsp-api</artifactId>
			<version>${javax.servlet.jsp-version}</version>
			<scope>provided</scope>
		</dependency>
		<!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>${javax.servlet.jsp.jstl-version}</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/javax.validation/validation-api -->
		<dependency>
			<groupId>javax.validation</groupId>
			<artifactId>validation-api</artifactId>
			<version>2.0.1.Final</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
		<dependency>
			<groupId>org.hibernate.validator</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>6.2.0.Final</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>5.2.3.RELEASE</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-dbcp2</artifactId>
			<version>2.7.0</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.5.4</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>2.0.3</version>
		</dependency>


	</dependencies>
</project>

 

3) WEB-INF -> lib 폴더에 mysql-connector-j-8.2.0 파일 넣어주기 (혹은 라이브러리에 그냥 설정해도 됨 ! 지금은 파일로 넣어줌)

 

4) views 폴더 안에 index.jsp, input_test.jsp, read_test.jsp 파일 생성 

[ index.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<body>
	<a href='input_test'>input_test</a><br>
	<a href='read_test'>read_test</a><br>
</body>
</html>
[ input_test.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<body>
	<form action="input_proc" method="post">
		num1 : <input type="text" name="num1"><br> <!-- num1,2,3에 입력한 값을 Data 클래스 필드에 넣기 -->
		num2 : <input type="text" name="num2"><br> <!-- 위에 작업은 SpringController.java에 @PostMapping("/input_proc") 작업 임 -->
		num3 : <input type="text" name="num3"><br> 
		
		<button type="submit">확인</button>
	</form>
</body>
</html>
[ input_proc.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<body>
	<h2>저장 끝 !!!</h2>
</body>
</html>
[ read_test.jsp JSP 파일 ]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<body>
	<c:forEach var="obj" items="${li }">
		${obj.num1 } <br>
		${obj.num2 } <br>
		${obj.num3 } <br>
	</c:forEach>
</body>
</html>

 

5) kt.bit.beans package에 Data.java class 생성 후 MySQL에서 생성한 table에 맞는 필드 생성(varchar는 String)

package kr.bit.beans;

public class Data {

	private String num1;
	private String num2;
	private String num3;
	
	public String getNum1() {
		return num1;
	}
	public void setNum1(String num1) {
		this.num1 = num1;
	}
	public String getNum2() {
		return num2;
	}
	public void setNum2(String num2) {
		this.num2 = num2;
	}
	public String getNum3() {
		return num3;
	}
	public void setNum3(String num3) {
		this.num3 = num3;
	}
	
}

 

6) WEB-INF에 properties 폴더 생성 후 db.properties File 생성 -> DB연결 작업에 필요한 내용 적어주기 

[ db.properties 파일 ]

db.classname=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/yujung
db.username=root
db.password=00000000

 

7) kr.bit.config package 안에 ServletAppContext.java에 @PropertySource("/WEB-INF/properties/db.propertise") 추가

     @Value("${db.classname(+url, username, password}")

     private String db_classname; 추가

     그리고 @Bean 등록 (BasicDataSource, SqlSessionFactory, MapperFactoryBean)

@Configuration

@EnableWebMvc

@ComponentScan("kr.bit.controller")

@PropertySource("/WEB-INF/properties/db.properties")

public class ServletAppContext implements WebMvcConfigurer {

 

        @Value("${db.classname}")

        private String db_classname;

 

         @Value("${db.url}")

         private String db_url;

 

         @Value("${db.username}")

          private String db_username;

 

          @Value("${db.password}")

           private String db_password;

package kr.bit.config;

import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperFactoryBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import kr.bit.database.MapperInterface;



@Configuration
@EnableWebMvc
@ComponentScan("kr.bit.controller")
@PropertySource("/WEB-INF/properties/db.properties")
public class ServletAppContext implements WebMvcConfigurer {
	
	
	@Value("${db.classname}")
	private String db_classname;
	
	@Value("${db.url}")
	private String db_url;
	
	@Value("${db.username}")
	private String db_username;
	
	@Value("${db.password}")
	private String db_password;	

	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		WebMvcConfigurer.super.configureViewResolvers(registry);
		registry.jsp("/WEB-INF/views/", ".jsp");
	}

	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		WebMvcConfigurer.super.addResourceHandlers(registry);
		registry.addResourceHandler("/**").addResourceLocations("/resources/");
	}
	
	@Bean
	public BasicDataSource dataSource() {
		BasicDataSource source= new BasicDataSource();
		source.setDriverClassName(db_classname);
		source.setUrl(db_url);
		source.setUsername(db_username);
		source.setPassword(db_password);
		
		return source;
	}
	
	@Bean
	public SqlSessionFactory factory(BasicDataSource source) throws Exception{
		
		SqlSessionFactoryBean fac=new SqlSessionFactoryBean();
		fac.setDataSource(source);
		SqlSessionFactory factory=fac.getObject();
		return factory;
	}
	
	@Bean
	public MapperFactoryBean<MapperInterface> test_mapper(SqlSessionFactory factory) throws Exception{
		
		MapperFactoryBean<MapperInterface> fac = 
				new MapperFactoryBean<MapperInterface>(MapperInterface.class);
		
		fac.setSqlSessionFactory(factory);
		return fac;
		
	}

	/*@Bean(name = "messageSource")
	public ReloadableResourceBundleMessageSource messageSource() {
		ReloadableResourceBundleMessageSource res = new ReloadableResourceBundleMessageSource();
		res.setBasename("/WEB-INF/properties/error");
		return res;
	}*/
	
	

}

 

8) kr.bit.database package 생성 후 MapperInterface.java Interface 파일 생성 후 쿼리문 등록 

package kr.bit.database;

import java.util.List;

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;

import kr.bit.beans.Data;

public interface MapperInterface {

	@Insert("insert into mvc_table(num1,num2,num3) values (#{num1},#{num2},#{num3})")
	public void insert_data(Data data);
	
	@Select("select num1, num2, num3 from mvc_table")
	List<Data> select_data();
}

 

 

9) kr.bit.controller package 안에 SpringController.java class 에서 경로 매핑

package kr.bit.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import kr.bit.beans.Data;
import kr.bit.database.MapperInterface;

@Controller
public class SpringController {

	@Autowired //MapperInterface에서 만든 함수(=insert_data...) 사용하려고 자동 주입받는 작업 
	MapperInterface mapper;
	
	@GetMapping("/input_test")
	public String input_test() {
		return "input_test";
	}

	@PostMapping("/input_proc")
	public String input_proc(Data data) {
		mapper.insert_data(data); //DB에 저장
		return "input_proc";
	}
	
	@GetMapping("/read_test")
	public String read_test(Model model) {
		List<Data> li = mapper.select_data();
		model.addAttribute("li",li);
		return "read_test";
	}
	
	
	
}

 

 

MySQL과 read_test.jsp 브라우저 화면에서 저장된 값이 잘 출력 되는 걸 확인할 수 있음 

728x90