---
title: Day23 Spring의 구성, Validation
layout: single
author_profile: true
read_time: true
comments: true
share: true
related: true
categories:
- DB
description: .
meta_keywords: java,static,memory
last_modified_at: '2021-08-10 12:00:00 +0800'
toc: true
toc_sticky: false
toc_label: 목차
---
 {% raw %}

# Controller를 거치지 않는 요청
컨트롤러의 역할 : 클라이언트가 요청을 보내면 요청을 처리하는 역할을 한다.
![image](https://user-images.githubusercontent.com/65274952/131269883-d93aa154-7d70-4775-a98c-3953f36790bd.png)
중간 경로로 컨트롤러를 선택하고 
세부 경로를 이용해서 컨트롤러 메서드를 선택하는 형태로 요청을 처리함.

하지만 **모든 요청**이 **컨트롤러**를 통해 처리되어야 하나?
모든 파일이 컨트롤러를통해서 요청되는것은 아니다.

정적인내용, 모든 사용자에게 같은 것을 보여주는 것과 같은 내용 -> 
굳이 컨트롤러가처리할 필요가 없다. 컨트롤러는 java에서 코드를 실행하여 실행할 필요가 있는 내용만 처리하면 된다.
컨트롤러가 모든 요청에 관여하면 컨트롤러가 과부하된다.


**resources 라고 적혀있으면** 그 **폴더는 컨트롤러가 관여하지 않음**
**컨트롤러** 거치지 않고바로 **경로**에 있는 내용,파일 **호출** 가능함.
반대로 말하면 **resources** 경로 외의 파일은  무조건 **컨트롤러**가 관여해서 주소상의 값을 반환해야 한다는 의미이기도 하다.
```html
<img src="${pageContext.request.contextPath}/resources/images/logo-spring.png" }/>
```
이런식으로 

![image](https://user-images.githubusercontent.com/65274952/131270191-6f335287-670b-469e-be31-27196471250f.png)
spring 설정을 관리하는 servlet-context 라는 xml 파일이 있다.
```xml
<resources mapping="/resources/**" location="/resources/" />
/**
의미는 이 뒤의 경로는 상관없이
```
/ (컨텍스트 루트 뒤에 ) resources가 나오면 뭐가나오든 resources 위치로 연결하라는 의미

```xml
<resources mapping="/frontend/**" location="frontend"/>
```
컨트롤러가 관여하지 않는 경로 여러개 설정하는것도 가능


# 라이브러리 내장

```html
 <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>
```
지금 이 라이브러리는 cdn 에서 받아온다.
그런데 cdn 서버 문제가 생기면?
ui가 깨진다.
resources에 미리 다운받아놓는다면 문제가 생기지 않는다.
<img src="https://user-images.githubusercontent.com/65274952/131270541-d5dc8ffe-b836-4ea3-805a-3fffd5397be3.png" alt="image" style="zoom:50%;" />


> include 되는 파일은 절대경로를 사용하는게 좋다. ( 상대경로면어디에 include 되는지에 따라 영향을 받을 수 있기 때문 ) 

![image](https://user-images.githubusercontent.com/65274952/131272382-34a6642b-6d1a-470b-878d-7d9f7d4630cc.png)
https://code.jquery.com/
https://code.jquery.com/jquery/
가서 다운받고 resources에 넣어줬다.


# resources 폴더 관리 주의점
컨트롤러를 거치지 않기 때문에 누구라도 접근가능하다.
특정사용자, 특정과정을 거쳐야 볼 수 있는 내용은 resources에 두면 안된다.
모든 img를 resources에 넣으면 안된다.

# Deploy
배치한다는 의미이다.
최종 산출물에 포함이 되어서 운영서버에 배치될 내용이 담겨있다.
![image](https://user-images.githubusercontent.com/65274952/131271337-83703c9e-0986-4755-9c77-7108ca46c405.png)
Deployed Resources 아래의 
webapp폴더 등의 내용이 최종 산출물 war에 포함되고 운영서버에 배치된다.
## root context 경로로 접근하게 되는 디렉토리
```
http://localhost:8080/contextRoot/ 
에서 /는
webapp/ 과 같다고 생각해도 된다.
```
**
즉 현재 우리는 / 를 root context로 설정하였기 때문에
8080/ 까지 입력하면  webapp 아래의 폴더가 열린다.
webapp 폴더에 포함된 항목인 index.jsp는 
8080/index.jsp 주소로 호출이 가능하다.

![image](https://user-images.githubusercontent.com/65274952/131271566-ff1ffb4a-ceff-41e6-b939-fec710f93125.png)
최종 산출물을 위의 방식으로 install 하면
war 파일이 생성되는데 war을 압축해제 해보면
deploy 파일이 최종산출물에 그대로 들어가게 된다.
![image](https://user-images.githubusercontent.com/65274952/131271756-1a1de621-638a-48d9-a246-895ea794c349.png)

# Spring Project 의 폴더 구조
![image](https://user-images.githubusercontent.com/65274952/131273335-a8f2ff77-2861-48d1-a444-f9ad1df06aa3.png)
![image](https://user-images.githubusercontent.com/65274952/131273279-fd9ba306-83b6-4be0-83b2-9dd4ab488687.png)
Classes에는 
바이트 코드가 컴파일 되어서 들어가있음 (war에 포함되어 있음)
web-inf의 lib 안에는 jar 파일이 많이 있음
![image](https://user-images.githubusercontent.com/65274952/131273398-bc77c3fa-36d5-4cf4-aec2-1de5aff2e477.png)
최종산출물을 만들 때는 web-inf 의 lib 폴더에 저장이됨.
최종산출물 만들기 전에는 참조만 함
# vJava Web Application 구조와 Spring MVC Project 구조 비교

![image](https://user-images.githubusercontent.com/65274952/131274496-03e980b8-9a2f-41c5-b129-575002d99cf5.png)

![image](https://user-images.githubusercontent.com/65274952/131274238-614a83b7-c6b3-43d5-837e-080e3463ab39.png)
![image](https://user-images.githubusercontent.com/65274952/131274249-2b9de27d-c442-4df2-8333-6b6a21b9e319.png)
위의 2개는 같은것이다.
![image](https://user-images.githubusercontent.com/65274952/131274324-b7531552-a8a2-429d-872e-ffbf5c3e4aa8.png)
자바 소스에 접근할때는 위의 경로에서 작업하는게 좋다. 위의 경로에서 작업하면 아래의 src 에 자동 취합된다.
![image](https://user-images.githubusercontent.com/65274952/131274313-3a21687e-4d4d-4488-96c0-0baaa983ae55.png)
아래는 파일 시스템에서의 class 들을 보여주는 역할임  여기서 직접 작업하는것은 좋지 않다.


src/main 에 있는 내용은 모두 classes 에 들어간다.
![image](https://user-images.githubusercontent.com/65274952/131274449-d26a231d-d0e3-447c-9024-dee29f3dd02f.png)
test는 최종산출물에 안들어간다.

# maven dependencies
메이븐 내용을 조정하려면 
pom.xml 의 의존성을 설정해주면된다. 그러면 jar파일이 알아서 들어간다.
![image](https://user-images.githubusercontent.com/65274952/131274545-b8479a75-1ddc-481c-a6ae-b70e8220227b.png)

# web.xml
제일 먼저 해석되는 문서가 web.xml 이고 이것을 제대로 해석하기 위해서 servlet jsp를 공부하는 것이다.

```xml
<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
```
DispatcherServlet 이라는 클래스를 통해서
```
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
```
이부분을 web.xml 이 알려준다.

스프링 설정파일이 기술된 위치는 web.xml의 servlet 태그 안에서 정의되어있다.
<img src="https://user-images.githubusercontent.com/65274952/131274792-e0591732-6a04-4510-b2ce-7103dbc9a404.png" alt="image" style="zoom:50%;" />
여기를 통해서 스프링의설정을 구성한다

만약
![image](https://user-images.githubusercontent.com/65274952/131275934-17688800-7404-4dbf-a197-8dea125cf5cd.png)
없는 context2.xml을 통해서 스프링 설정을 구성하겠다고 정의하면?
-> 에러 발생

![image](https://user-images.githubusercontent.com/65274952/131276079-ce2d6012-54de-46ab-879a-6c4d83582dd3.png)
설정파일 경로 뒤에 특정 설정파일의 이름이 아닌 /*.xml 으로 작성하면
특정 경로뒤 모든 xml 파일을 사요할수 있게된다. 
여러개의 스프링 설정 파일을 사용할 수 있다.

![image](https://user-images.githubusercontent.com/65274952/131276127-e98498fb-1075-4c7a-b76b-a4c1bd6228a0.png)
설정파일의 이름을 바꿔도 정상작동한다.
# URL로 접근하는 경우

![image](https://user-images.githubusercontent.com/65274952/131276314-8cc50a18-ce5e-45b7-b0c9-c175b4c1cfe2.png)

8080/photo1.jpg 하면 접근 가능해야하는게 맞다.
하지만 
![image](https://user-images.githubusercontent.com/65274952/131276594-521e5fd0-6d41-4c9a-b7a5-1a60c6ac163e.png)
![image](https://user-images.githubusercontent.com/65274952/131277030-3524178f-a1f4-4f63-82ec-4eead879dfb7.png)
컨트롤러 없이 접근할 수 있는 경로가 아니여서 접근이 불가능하다.

# index.j s p
```jsp
<%@ page contentType="text/html; charset=UTF-8" %>
```
최상단에는 이런 값이 있다.
![image](https://user-images.githubusercontent.com/65274952/131278142-b3a0ea58-a83b-4680-a311-f74e10263582.png)
language="java" 는 jsp 파일이 원래 java 언어 밖에 사용할 수 없어서 생략가능
 pageEncoding="UTF-8" 파일로 저장할 때 어떤 인코딩 방식을 적용할지에 대한 값임
생략시 
 charset=UTF-8"
값과 같은 인코딩 적용

 contentType="text/html
text  = MIME 타입
html 은 문자로 읽어와서 html로 작성 된것이 최종적으로 만들어 진다는 의미

 charset=UTF-8" 최종 산출물 (html)의 문자셋의 인코딩 방식

```jsp
<%@ page  contentType="text/html; charset=UTF-8"%>
```
최종적으로 이렇게 작성해도 된다.
 위의 내용은 브라우저로 전송된다.

크롬의 network content type에서 확인한 모습
![image](https://user-images.githubusercontent.com/65274952/131278694-10ca46c3-9d2a-40a1-95b9-7a78f80e9859.png)
이 값은 문서를 교체해서 변경 가능하다.
![image](https://user-images.githubusercontent.com/65274952/131278745-8a2c68ec-af34-49b9-84be-bd9ce8b64a33.png)
![image](https://user-images.githubusercontent.com/65274952/131278776-aa0152cb-c127-4ebb-8885-0e5d56454b39.png)
작성된 jsp
```jsp
<%@ page contentType= "text/html; charset=UTF-8" %>
<html>
	<head>
	<title>xx</title>
	
	
	</head>
	<body>hello</body>
</html>
```

응답 http 내용
```http
HTTP/1.1 200 
Content-Type: text/html;charset=UTF-8
Content-Language: ko-KR
Content-Length: 85
Date: Mon, 30 Aug 2021 03:04:12 GMT
Keep-Alive: timeout=20
Connection: keep-alive

<html>
	<head>
	<title>xx</title>
	
	
	</head>
	<body>hello</body>
</html>
```

브라우저는
Content-Type: text/html;charset=UTF-8
를 읽고나서 아래의 본문을 해석한다. 아래의 본문을 어떤 방식으로 읽을지를 미리 정해준다.

본문과 헤더는 한줄짜리 공백으로 구분한다.

# jsp 지시자
![image](https://user-images.githubusercontent.com/65274952/131279800-97cc4a82-a361-4101-9597-829c0614f7bf.png)
사용자가 직접 url로 web-inf 접근 불가
```
<include 
<page
<taglib 
3가지 지시자를 주로 사용한다.
```


```jsp
<%@ include file="/WEB-INF/views/common/header.jsp" %>
```
서버 내부의 경로를 사용함
JSP 파일이 실행 될 때 로컬에서 읽어오기 때문에 사용가능

웹 서버 자체 내부에서의 경로에서 요청하는것이기 때문에  web-inf 접근가능

![image](https://user-images.githubusercontent.com/65274952/131279925-45ae3b40-6ae4-4c67-bd5d-311d537ea732.png)


html을 브라우저에서 해석하고 읽기 때문에 
위의 img 태그에서는 web-inf 파일 해석불가함



# Validation
받는 쪽에서 데이터가 올바른 데이터인지 확인하는 과정이다.

사용자 입력이후 검정의 과정
사용자 입력 -> 브라우저에서 검사(프론트에서 검사) -> 서버로 전송 -> 서버에서 검사(백엔드 검사)

```html
<form method="post" action="method1" onsubmit="checkData(this)">
    
    <script>
        function checkData(form){
            //form의 제출기능을 off
            event.preventDefault();
            console.log(form.param1);
        }
    </script>	
```

![image](https://user-images.githubusercontent.com/65274952/131288116-daa48acf-2426-4ad7-bde5-f7aa3fecfafc.png)

![image](https://user-images.githubusercontent.com/65274952/131288288-29903264-fc78-44a8-8d26-bafd569b6686.png)

![image](https://user-images.githubusercontent.com/65274952/131289284-9188bdb1-fe07-4ccb-b4f2-94f59cdc5a6a.png)

![image](https://user-images.githubusercontent.com/65274952/131289715-4be262f7-97f5-4298-8c8c-aea59bf19c62.png)
![image](https://user-images.githubusercontent.com/65274952/131289837-70656bff-10a1-41cb-a023-cc0b07cc5297.png)
![image](https://user-images.githubusercontent.com/65274952/131290157-81099445-da95-477e-99d6-38bc88b1ad20.png)

# js 정규식을 활용한 valid
프론트에서 valid 를 1차적으로 진행하고 백엔드에서 2차적으로 valid 를 진행한다.
프론트에서 valid 를 해줘야하는 이유는 
1. 모든 valid를 백엔드에서 진행하면 서버에 부하가 걸리게 되는것 
2. 서버로 통신과정에 데이터 손실에 의해 잘못된 데이터로 인식되는 경우가 있을 수 있는데 서버로 전송하기전에 검사하여 전송하는것으로 데이터손실로 잘못된 데이터 검증시도하는 경우 줄이기

# js정규식

[] 대괄호는 한글자 단위임
(x\y) 둘중하나만 오면됨
## Syntax
/*pattern*/*modifiers*;
패턴과 모디파이어로 구성된다.
## Modifiers
Modifiers are used to perform case-insensitive and global searches:
| Modifier                                                | Description                                                  |
| :------------------------------------------------------ | :----------------------------------------------------------- |
| [g](https://www.w3schools.com/jsref/jsref_regexp_g.asp) | Perform a global match (find all matches rather than stopping after the first match)철번째로 매치되는것이 나오더라도 계속해서 매칭 수행 |
| [i](https://www.w3schools.com/jsref/jsref_regexp_i.asp) | 대소문자 구분없이 매칭 작없 수행                             |
| [m](https://www.w3schools.com/jsref/jsref_regexp_m.asp) | 다중행에서 매칭작업수행                                      |
## Brackets
Brackets are used to find a range of characters:
| Expression                                                   | Description                                                  |
| :----------------------------------------------------------- | :----------------------------------------------------------- |
| [[abc\]](https://www.w3schools.com/jsref/jsref_regexp_charset.asp) | []대괄호는 한 문자 단위다. abc 중 한문자가 와햐한다 라는 의미Find any character between the brackets |
| [[^abc\]](https://www.w3schools.com/jsref/jsref_regexp_charset_not.asp) | []대괄호는 한 문자 단위다 abc를 제외한 다른 문자. 가 와야 한다 Find any character NOT between the brackets |
| [[0-9\]](https://www.w3schools.com/jsref/jsref_regexp_0-9.asp) | 0~9까지의 숫자를 찾는 것 Find any character between the brackets (any digit) |
| [[^0-9\]](https://www.w3schools.com/jsref/jsref_regexp_not_0-9.asp) | 0~9까지의 숫자가 아닌것이 와야한다. Find any character NOT between the brackets (any non-digit) |
| [(x\|y)](https://www.w3schools.com/jsref/jsref_regexp_xy.asp) | \|로 구분된 값들 중 하나의 값이 와야함 Find any of the alternatives specified |
## Metacharacters
Metacharacters are characters with a special meaning:
| Metacharacter                                                | Description                                                  |
| :----------------------------------------------------------- | :----------------------------------------------------------- |
| [.](https://www.w3schools.com/jsref/jsref_regexp_dot.asp)    | Find a single character, except newline or line terminator   |
| [\w](https://www.w3schools.com/jsref/jsref_regexp_wordchar.asp) | Find a word character 알면좋다                               |
| [\W](https://www.w3schools.com/jsref/jsref_regexp_wordchar_non.asp) | Find a non-word character                                    |
| [\d](https://www.w3schools.com/jsref/jsref_regexp_digit.asp) | Find a digit 숫자가 온다. 알면좋다                           |
| [\D](https://www.w3schools.com/jsref/jsref_regexp_digit_non.asp) | Find a non-digit character                                   |
| [\s](https://www.w3schools.com/jsref/jsref_regexp_whitespace.asp) | Find a whitespace character                                  |
| [\S](https://www.w3schools.com/jsref/jsref_regexp_whitespace_non.asp) | Find a non-whitespace character 알면좋다.                    |
| [\b](https://www.w3schools.com/jsref/jsref_regexp_begin.asp) | Find a match at the beginning/end of a word, beginning like this: \bHI, end like this: HI\b |
| [\B](https://www.w3schools.com/jsref/jsref_regexp_begin_not.asp) | Find a match, but not at the beginning/end of a word         |
| [\0](https://www.w3schools.com/jsref/jsref_regexp_nul.asp)   | Find a NULL character                                        |
| [\n](https://www.w3schools.com/jsref/jsref_regexp_newline.asp) | Find a new line character                                    |
| [\f](https://www.w3schools.com/jsref/jsref_regexp_formfeed.asp) | Find a form feed character                                   |
| [\r](https://www.w3schools.com/jsref/jsref_regexp_carriagereturn.asp) | Find a carriage return character                             |
| [\t](https://www.w3schools.com/jsref/jsref_regexp_tab.asp)   | Find a tab character                                         |
| [\v](https://www.w3schools.com/jsref/jsref_regexp_vtab.asp)  | Find a vertical tab character                                |
| [\xxx](https://www.w3schools.com/jsref/jsref_regexp_octal.asp) | Find the character specified by an octal number xxx          |
| [\xdd](https://www.w3schools.com/jsref/jsref_regexp_hex.asp) | Find the character specified by a hexadecimal number dd      |
| [\udddd](https://www.w3schools.com/jsref/jsref_regexp_unicode_hex.asp) | Find the Unicode character specified by a hexadecimal number dddd |


## Quantifiers
| Quantifier                                                   | Description                                                  |
| :----------------------------------------------------------- | :----------------------------------------------------------- |
| [n+](https://www.w3schools.com/jsref/jsref_regexp_onemore.asp) | n이 한번이상 와야한다.Matches any string that contains at least one *n* |
| [n*](https://www.w3schools.com/jsref/jsref_regexp_zeromore.asp) | n이 0개 이상 와야한다Matches any string that contains zero or more occurrences of *n* |
| [n?](https://www.w3schools.com/jsref/jsref_regexp_zeroone.asp) | n 아무거나 하나 Matches any string that contains zero or one occurrences of *n* |
| [n{X}](https://www.w3schools.com/jsref/jsref_regexp_nx.asp)  | n이 x개 와야한다 Matches any string that contains a sequence of *X* *n*'s |
| [n{X,Y}](https://www.w3schools.com/jsref/jsref_regexp_nxy.asp) | n이 x개~y개 올 수 있다. Matches any string that contains a sequence of X to Y *n*'s |
| [n{X,}](https://www.w3schools.com/jsref/jsref_regexp_nxcomma.asp) | 최소한 x개가 와야한다 최대를 작성하지 않아서 무한정 와도됨Matches any string that contains a sequence of at least X *n*'s |
| [n$](https://www.w3schools.com/jsref/jsref_regexp_ndollar.asp) | Matches any string with *n* at the end of it                 |
| [^n](https://www.w3schools.com/jsref/jsref_regexp_ncaret.asp) | Matches any string with *n* at the beginning of it           |
| [?=n](https://www.w3schools.com/jsref/jsref_regexp_nfollow.asp) | Matches any string that is followed by a specific string *n* |
| [?!n](https://www.w3schools.com/jsref/jsref_regexp_nfollow_not.asp) | Matches any string that is not followed by a specific string *n* |

# 예시 
```java
 const pattern = /\d{2}([0]\d|[1][0-2])([0][1-9]|[1-2]\d|[3][0-1])[-]*[1-4]\d{6}/;
	                      
```
\d{2}
/d 숫자가와야한다는 의미 
{2} 2개가 들어가야 한다.

[-]* -가 들어가도 좋고 안들어가도 좋다.

![image](https://user-images.githubusercontent.com/65274952/131292653-bff582b7-f77f-4f94-9e4b-6ccbe233b7f7.png)

# js match()
```javascript
let str = "The rAin in SPAIN stays mainly in the plain";
str.match(/ain/g)   // Returns ain,ain,ain
str.match(/ain/ig); //Ain,AIN,ain,ain
str.match(/ain/i); //Ain
```
i는 대소문자 안가린다
g 는 여러개 찾겠다는 의미

## RegExp Object Methods
| Method                                                       | Description                                              |
| :----------------------------------------------------------- | :------------------------------------------------------- |
| [compile()](https://www.w3schools.com/jsref/jsref_regexp_compile.asp) | Deprecated in version 1.5. Compiles a regular expression |
| [exec()](https://www.w3schools.com/jsref/jsref_regexp_exec.asp) | Tests for a match in a string. Returns the first match   |
| [test()](https://www.w3schools.com/jsref/jsref_regexp_test.asp) | Tests for a match in a string. Returns true or false     |
| [toString()](https://www.w3schools.com/jsref/jsref_regexp_tostring.asp) | Returns the string value of the regular expression       |
test 와 match 의 차이점 을 알아야한다.


# validation 흐름

![image](https://user-images.githubusercontent.com/65274952/131304818-e8c17c50-2f79-43e4-8f09-003169f0a499.png)

```html
<form:errors cssClass="error" path="joinForm.mid"/>
```
위의 문장은 html 태그가 아니다.
SpringFramework 에서 제공하는 태그다.
에러메시지를 넣은 입력폼을 생성하기 위해서 사용하는 태그다.
# tablib 지시자
지시자는 이제 다 나온것임
```jsp
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
```
form 이라는 접두사를 붙이면
uri에 포함된 내용의 태그를 작성할 수 있다.

autocomplete="current-password"
힌트를 제공하지 않게 해주는 것.
![image](https://user-images.githubusercontent.com/65274952/131308212-ab75524b-ad25-459a-9013-440438838bc0.png)
에러메시지를 띄우기 위해서는 
properties 파일이 필요하다.
하지만 이클립스에서 제공하는 porperties 편집기는 불편하게 만들어져있다.
ascii 문자안에 있는 값만 사용가능하다.
# properties 편집기 설치
![image](https://user-images.githubusercontent.com/65274952/131309506-806426dc-5a93-47f4-a0e0-118a0c11065e.png)
help - install
![image](https://user-images.githubusercontent.com/65274952/131309019-6039fc0e-1cef-4d96-9e67-598a9fd8b0c1.png)
![image](https://user-images.githubusercontent.com/65274952/131309419-8d2f2c3f-b360-49d3-a9ad-8b7d7ec98932.png)
맨 아래 항목만 체크
![image](https://user-images.githubusercontent.com/65274952/131309799-6286ae94-e4f4-4da1-ad31-3765c3e6f808.png)
메모장에서 확인하면 ascii 코드로 작성된 형태로 보임
리소스아래에 그냥 파일을 넣는게 아니라 패키지를 만들어서 넣어야한다.
![image](https://user-images.githubusercontent.com/65274952/131310390-e08e3352-7731-4186-a89c-d818595c7c3a.png)

![image](https://user-images.githubusercontent.com/65274952/131311014-c6390e46-2d6d-46a5-a10b-ae0128bbddae.png)
en, ko 로 언어 구분
```properties
errors.mid.required=member id is required.
errors.mid.minlength=member id can not be less than {0} characters.
errors.mpassword.required=member password is required.
errors.mpassword.minlength=member password can not be less than {0} characters.
errors.memail.required=member email is required.
errors.memail.invalid=member email is invalid.
errors.mtel.required=member tel is required.
errors.mtel.invalid=member tel is invalid.
```
{}안의 값은 동적으로 변할 수 있다.

스프링이 알아서 영어 한글 구분해서 메시지 보내줌
브라우저가 사용자가 사용하는 언어를 http 헤더에 담아서 서버에 보내주기 때문에 스프링이 알아서 언어별 에러를 띄울 수 ㅣㅇㅆ다.
```properties
errors.mid.required=member id is required.
```
error가  mid 에서 발생, 필요조건이 충족되지 못함
이런식으로 해석


# 정리 
스프링의 설정파일의 위치
스프링의 설정파일의 위치를 기술하는 xml

# 자투리

8080포트를 사용중이라서 서버를 사용 불가능하다는 에러가 호출되었을 때 tomcat 서버를 중지시켜야한다.
![image](https://user-images.githubusercontent.com/65274952/131271090-4c7ea27d-9bbb-4243-b721-b75c2f0ec452.png)

우클릭하여 프로그램 끝내기 해주면 된다.

> include 되는 파일은 절대경로를 사용하는게 좋다. ( 상대경로면어디에 include 되는지에 따라 영향을 받을 수 있어서 ) 

![image](https://user-images.githubusercontent.com/65274952/131273655-df3ac2cd-abf8-4463-90c6-bc9a0a782737.png)
4.0 안뜨면
프로젝트 우클릭 메이븐 업데이트


오류 뜨는것 
![image](https://user-images.githubusercontent.com/65274952/131274986-c340bb5a-5717-41d2-8adc-13921d4e752a.png)

![image](https://user-images.githubusercontent.com/65274952/131275040-d3d14972-b840-4332-bd9b-2c93fad3e68e.png)

 {% endraw %}

![image-20210830152046242](C:\Users\mwe22\AppData\Roaming\Typora\typora-user-images\image-20210830152046242.png)

![image-20210830151209809](C:\Users\mwe22\AppData\Roaming\Typora\typora-user-images\image-20210830151209809.png)
![image-20210830151227117](C:\Users\mwe22\AppData\Roaming\Typora\typora-user-images\image-20210830151227117.png)
![image-20210830152031474](C:\Users\mwe22\AppData\Roaming\Typora\typora-user-images\image-20210830152031474.png)


jq
![image-20210830152559602](C:\Users\mwe22\AppData\Roaming\Typora\typora-user-images\image-20210830152559602.png)

![image](https://user-images.githubusercontent.com/65274952/131302503-6df832a5-7e3a-4894-84c0-bf67de1e8115.png)
![image](https://user-images.githubusercontent.com/65274952/131302337-87a1c81d-808e-4c9b-a81e-76a02dd2d3f5.png)