스프링 MVC
- 스프링 MVC의 주요 구성 요소
구성요소 | 설명 |
DispatcherServlet | 클라이언트의 요청을 전달받는다. 컨트롤러에게 클라이언트의 요청을 전달하고, 컨트롤러가 리턴한 결과값을 View에 전달하여 알맞은 응답을 생성하도록 한다. |
HandlerMapping |
클라이언트의 요청 URL을 어떤 컨트롤러가 처리할지를 결정한다. 일종의 Actionmap.properties |
컨트롤러 (Controller) |
클라이언트의 요청을 처리한 뒤, 그 결과를 DispatcherServlet에 알려준다. 스트럿츠의 Action과 동일한 역할을 수행한다. String에서 컨트롤러 = 모델클래스 |
ModelAndView | 컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보를 담는다. 직접적으로 request를 호출해서 사용하지않는다. Model : data정보 View : jsp정보 |
ViewResolver | 컨트롤러의 처리 결과를 생성할 뷰를 결정한다. |
뷰(View) | 컨트롤러의 처리 결과 화면을 생성한다. JSP나 Velocity 템플릿 파일 등을 뷰로 사용한다. |
프로젝트를 생성하고 pom.xml설정
프로젝트 Java버전 설정
프로젝트 생성할 때 지정한 탑레이블 패키지(kr.spring.mvc)의 마지막 부분인 mvc로 표시되어있다.
get방식은 서버차원에서 인코딩이 되지만,
post방식으로 데이터를 전송하면 데이터 request.setCharacterIncoding하면서 인코딩처리를 해야하는데
매번 명시해야하므로 일괄적으로 요청이 들어올 때 다 인코딩 처리 하기위해서
Servlet동작 전에 먼저 동작하는 기능을 가지고있는 filter를 사용한다.
Spring에 내장되어있는 <filter>를 사용한다.
<filter>
<filter-name>encodingFilter</filter-name> <!-- 식별하는 이름 -->
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping> <!-- 동작되게 하려면 요청이 있어야 하니까 -->
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern> <!-- *.do가 아니여도 context밑에있는 모든요청에 대해서 인코딩처리하겠다 -->
</filter-mapping>
잘 동작이 되는지 index.jsp파일을 생성하여 확인한다.
잘 동작을 한다면 서버 구성을 해준다.
servlet-context.xml에는 beans: 라는 접두사가 붙어있다.
servlet-context.xml에는 beans: 라는 접두사가 붙어있다.
01. 스프링 MVC 설정
maven 설정 pom.xml 파일에서 jar 파일 설정 web.xml 설정 DispatcherServlet 매핑 root-context.xml 파일에 데이터베이스 연동 설정 servlet-context.xml에 bean 설정 |
1) DispatcherServlet 설정 및 스프링 컨텍스트 설정
DispatcherServlet의 설정은 웹 어플리케이션의 /WEB-INF/web.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> <servlet-mapping> <servlet-name>appServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> |
2) 컨트롤러 구현 및 설정 추가
@Controller public class HelloController { @RequestMapping("/hello.do") public ModelAndView hello() { ModelAndView mav = new ModelAndView(); //뷰 이름 지정 mav.setViewName("hello"); //뷰에서 사용할 데이터 셋팅 mav.addObject("greeting", "Hello World!!"); return mav; } } |
@Controller
@RequestMapping
3) servlet-context.xml 설정
bean 설정 및 viewResolver 설정
<?xml version="1.0" encoding="UTF-8"?> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- bean 설정 --> <beans:bean id="helloController" class="kr.spring.ch01.controller.HelloController" /> <!-- viewResolver 설정 --> <beans:bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <beans:property name="prefix" value="/WEB-INF/views/" /> <beans:property name="suffix" value=".jsp" /> </beans:bean> </beans:beans> |
4) 뷰 코드 구현
<%@ page language="java" contentType="text/html; charset=UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>인사</title> </head> <body> 인사말: <strong>${greeting}</strong> </body> </html> |
index에 링크를 걸어준다.
웹 브라우저 설정한다.
5) 빈 클래스 설정시 사용할 어노테이션
<!-- MVC 기본설정 -->
<!-- @Autowired사용을 위해서 -->
<context:annotation-config/>
어노테이션 | 적용 대상 |
@Repository | 데이터 액세스 계층의 DAO 또는 리포지토리 클래스에 사용됨. DataAccessException 자동변환과 같은 AOP의 적용 대상을 선정하기 위해서도 사용됨 |
@Service | 서비스 계층의 클래스에 사용됨 |
@Controller | 프리젠테이션 계층의 MVC 컨트롤러에 사용된다. 스프링 웹 서블릿의해 웹 요청을 처리하는 컨트롤러 빈으로 선정된다. |
@RequestParam 보통 데이터 하나만 넘길 때
@Autowired
@RequestMapping
@GetMapping/@postMapping
@ModelAttribute
쿠키 값 생성 / 읽어오기
@CookieValue
기본값 0으로 지정해서 0으로 나왔음
여러개의 쿠키를 사용할 경우엔 인자에 HttpServletRequest request로 명시해서 사용한다.request.getCookies()
원래 session은 servlet에서 직접 못받고 request.getSession 이용했지만 여기서는 인자에 직접 명시해서 넣으면 받아서 이용할 수 있다.
주요 폼 관련 커스텀 태그
유효성 체크 시 커스텀 태그 사용해야함
서버차원에서 유효성체크 / 브라우저에서 유효성체크(자바스크립트)
1)주요 폼 태그
커스텀 태그 | 설명 |
<form:form> | <form>태그를 생성할 때 사용 action : 폼 데이터를 전송할 URL을 입력 enctype : 전송될 데이터의 인코딩 타입 method : 전송 방식 |
<form:input> | text 타입의 <input> 태그 path : 바인딩 될 커맨드 객체의 프로퍼티 지정 value : path 속성에서 지정한 커맨드 객체의 프로퍼티 값 출력 |
<form:password> | password 타입의 <input> 태그 path : 바인딩 될 커맨드 객체의 프로퍼티 지정 value : path 속성에서 지정한 커맨드 객체의 프로퍼티 값 출력 |
<form:hidden> | hidden 타입의 <input> 태그 path : 바인딩 될 커맨드 객체의 프로퍼티 지정 value : path 속성에서 지정한 커맨드 객체의 프로퍼티 값 출력 |
<form:select> | <select> 태그를 생성. <option> 태그를 생성하는 데 필요한 콜렉션을 전달 받을 수도 있음 |
<form:options> | 지정한 콜렉션 객체를 이용하여 <option> 태그를 생성 ex) <form:options items=”${jobCodes}” itemLabel=”label” itemValue=”code”/> |
<form:option> | 한 개의 <option> 태그를 생성 |
<form:checkboxes> | 커맨드 객체의 특정 프로퍼티와 관련된 checkbox 타입의 <input> 태그 목록을 생성 ex) <form:checkboxes items=”${favoriteOsNames}” path=”favoriteOs”/> |
<form:checkbox> | 커맨드 객체의 특정 프로퍼티와 관련된 한 개의 checkbox 타입 <input> 태그를 생성 |
<form:radiobuttons> | 커맨드 객체의 특정 프로퍼티와 관련된 radio 타입의 <input> 태그 목록을 생성 ex) <form:radiobuttons items=”${tools}” path=”tool”/> |
<form:radiobutton> | 커맨드 객체의 특정 프로퍼티와 관련된 한 개의 radio 타입 <input> 태그를 생성 |
<form:textarea> | <textarea> 태그를 위한 커스텀 태그 |
2) CSS와 관련된 공통 속성
속성 | 설명 |
cssClass | HTML의 class 속성값 |
cssErrorClass | 폼 검증 에러가 발생했을 때 사용할 HTML의 class 속성값 |
cssStyle | HTML의 style 속성값 |
유효성 체크
Validator 인터페이스를 이용한 폼 값 검증
컨트롤러 생성
vo 생성
vo 받아서 출력하는 서비스클래스 생성
폼호출컨트롤러 폼호출 jsp
.addObject( , )
: request에 저장
메시지 처리
유효성체크 시 코드와 메세지 처리를 분리하여 작업한다.
1) validator로 유효성체크
우선순위 rejectValue()/reject()
1) 어노테이션을 이용한 유효성체크
pom.xml에 라이브러리를 추가해야한다.
VO에 프로퍼티 지정
@Valid
@Pattern
@NotEmpty
@Size
@Range
비어있거나 형식에 맞지않을 때(문자인데 숫자를 넣을 때)
오류 default 메세지를 뿌리는게 typeMismatch라서 재정의 해준다.
@Pattern
을 사용하면 정규 표현식을 이용하여 패턴을 줄 수 있다.
▼ 정규표현식
https://docs.google.com/document/d/12b3WZr_AlGfolq0uXNjLglDs18dhE_6EB8rL5-nmLXs/edit
정규표현식(Regular Expressions)
정규표현식은 문자열에 나타내는 특정 문자 조합과 대응시키기 위해 사용되는 패턴을 의미함.
메타 문자(meta characters)
^ $ + ? { } [ ] \ | ( ) 메타 문자란 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용되는 문자 |
- 문자 클래스 [ ]
문자 클래스로 만들어진 정규식은 ‘[‘ 와 ’]’ 사이의 문자들과 매치라는 의미
정규 표현식이 [abc]라면 이 표현식의 의미는 'a,b,c' 중 한 개의 문자와 매치
정규식 | 문자열 | 매치 여부 |
[abc] | a | YES |
before | YES | |
dude | NO |
[ ] 안의 문자 사이에 하이픈(-)을 사용하게 되면 두 문자 사이의 범위(From -To)를 의미한다.
ex) [a-c]라는 정규 표현식은 [abc]와 동일하고 [0-5]는 [012345]와 동일함 |
문자 클래스 내에 ^메타 문자가 사용될 경우에는 반대(not)라는 의미
[^0-9]라는 정규 표현식은 숫자가 아닌 문자만 매치 |
- Dot(.)
정규 표현식의 Dot(.) 메타 문자는 줄바꿈 문자인 \n를 제외한 모든 문자와 매치됨을 의미
정규식 | 문자열 | 매치 여부 |
a.b | aab | YES |
a0b | YES | |
abc | NO |
- 반복(*)
ca*t <--- *문자 바로 앞에 있는 a가 0번 이상 반복되면 매치
정규식 | 문자열 | 매치 여부 |
ca*t | ct | YES |
cat | YES | |
caaat | YES |
- 반복(+)
+는 최소 1번 이상 반복
ca+t <--- + 문자 바로 앞에 있는 a가 1번 이상 반복되면 매치
정규식 | 문자열 | 매치 여부 |
ca+t | ct | NO |
cat | YES | |
caaat | YES |
- 반복({m,n})
{m,n} 정규식을 사용하면 반복 횟수가 m부터 n까지인 것을 매치
{m}
ca{2}t <--- a가 2번 반복되면 매치
정규식 | 문자열 | 매치 여부 |
ca{2}t | cat | NO |
caat | YES |
자바스크립트 정규표현식의 메타 문자
메타문자 | 의미 |
. | 개행 문자를 제외한 문자 1자 |
\s | 공백 문자(공백문자는 공백, 탭, 줄바꿈, 리턴키 값 포함) |
\S | 공백 문자 아님 |
\w | 아무 단어(숫자 포함) |
\W | 아무 단어 아님 |
\d | 숫자 |
\D | 숫자 이외의 문자 |
^ | 행의 시작, 문자열의 시작(패턴의 시작, 이 문자만 패턴의 앞에 올 수 있음) |
$ | 행 꼬리, 문자열의 종료(이 문자는패턴의 끝을 알림, 문자열에서 패턴의 마지막 문자는 반드시 이 문자로 끝나야 함) |
X? | X의 0문자 또는 1문자 |
X* | X의 0문자 이상 반복 |
X+ | X의 1문자 이상 반복 |
X{n} | X의 n회 반복 |
X{n,} | X의 n회 이상 반복 |
X{n,m} | X의 n부터 m회 반복 |
X|Y | X또는 Y |
[XYZ] | X또는 Y 또는 Z의 1문자(문자의 집합을 나타냄) |
[^XYZ] | X도 Y도 Z도 아닌 1문자(문자의 집합을 나타냄) |
옵션 | 개요 |
g | 문자열 전체에 대해 매치하는가(지정하지 않은 경우, 한 번 매칭한 시점에서 처리를 종료) |
i | 대문자/소문자를 구별하는가 |
m | 복수행에 대응하는가(개행 코드를 행의 시작과 끝으로 인식) |
활용 예
/./ | 한 자리 문자 | “A”, “1”, “%” |
/\w/ | 한 자리 문자, 숫자 | “A”,”1” |
/^\d/ | 문자열의 시작이 한 자리 숫자 | "1" |
/bi$/ | 문자열 끝에 bi이 있는 경우 | “nabi” |
/^na/ | 문자열 시작에 na가 있는 경우 | “nabi” |
/^\d/ | 문자열 시작에 한 자리 숫자 | “2ne1” |
/[abc]/ | 괄호 안의 글자 | |
/[^abc]/ | 괄호 안의 글자 제외 | |
/[a-z]/ | 알파펫 a부터 z까지 | |
/[A-Z]/ | 알파펫 A부터 Z까지 | |
/[0-9]/ | 숫자 0부터 9까지 | |
/\d{6}-[1234]\d{6}/ | 주민등록번호 숫자 6개 - 숫자1~4중에서 한개 6개의 숫자 |
900101-1012345 |
/\w+@\w+\.\w+/ | 이메일 숫자포함 문자 하나 이상 반복 @ 숫자포함 문자 하나 이상 반복 . 숫자포함 문자 하나 이상 반복 |
test@test.com |
정규 표현식 객체의 메서드
메서드 이름 | 설명 |
test() | 정규 표현식과 일치하는 문자열이 있으면 true를 아니면 false를 반환 |
파일 업로드/다운로드 처리
1) 파일 업로드 처리
form.xml에 라이브러리 추가한다.
파일 업로드를 제어하는 객체를 생성을 해야한다.
webapp/upload 폴더를 생성하고, src/main/resources/config/file.properties를 생성한다.
절대경로를 알아야 업로드가 되므로 upload파일 우클릭 - properties에서
Location경로를 복사해서 file.properties에
key는"file_path"로 지정하고 value값에 절대경로를 넣어준다.
이때, 경로중에 '\'를 '/'로 변경하거나, '\\'로 변경한다.
servlet-context.xml에서 업로드폴더를 등록해준다.
이 때 classpath: 는 src/main/resources 경로가 된다.
이것을 컨트롤러에서 읽어온다.
[ 파일 업로드 폼 작업 ]
vo/validator/controller를 생성한다. 그리고 Form.jsp생성 후 servlet-context.xml 설정
vo
파일을 업로드하게되면 MultipartFile타입으로 처리된다. File에대한 정보를 갖게된다.
validator
controller
jsp
servlet-context.xml에서 파일 업로드 처리를 등록해준다.
[ 파일 업로드 데이터 처리 작업 ]
controller
jsp
실행 결과
1) MulipartResolver 설정
<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <beans:property name="maxUploadSize" value="52428800" /><!-- 50M --> <beans:property name="defaultEncoding" value="UTF-8" /> </beans:bean> |
CommonsMultipartResolver 클래스의 프로퍼티
프로퍼티 | 타입 | 설명 |
maxUploadSize | long | 최대 업로드 가능한 바이트 크기, -1은 제한이 없음을 의미한다. 기본값은 -1이다. |
maxInMemorySize | int | 디스크에 임시 파일을 생성하기 전에 메모리에 보관할 수 있는 최대 바이트 크기. 기본값은 10240 바이트이다. |
defaultEncoding | String | 요청을 파싱할 때 사용할 캐릭터 인코딩. 지정하지 않을 경우, HttpServletRequest.setCharacterEncoding() 메서드로 지정한 캐릭터 셋이 사용된다. 아무 값도 없을 경우 ISO-8859-1을 사용한다. |
2) 구현 예
try { File file = new File(path + "/" + command.getReportFile().getOriginalFilename()); command.getReportFile().transferTo(file); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } |
2) 파일 - 다운로드 처리
jsp말고 만든class를 view역할로 사용가능
이 객체를 view역할로 사용한다.
이 클래스에서 동작되서 보내는 스트림을 브라우저가 다운로드처리한다.
이미지, 텍스트파일은 브라우저가 viewer역할을 하는데
ContentType을 application/download 로 했기 때문에 다운로드처리한다.
파일을 생성하고 이 파일을 다운로드 받아볼 수 있다.
뷰의 이름과 빈의 이름이 같으면 해당 빈을 뷰로 호출하고 우선순위를 주어서 기존 것과 충돌을 방지한다.
로그인(db연동없이 )
VO생성.Getters,Setters, toString
validator생성 유효성체크
controller에서 폼 호출
form.jsp생성
context.xml에 등록
유효성 체크, 아이디비밀번호 일치여부확인해야하는데 일단 유효성체크먼저
controller에서 폼에서 전송된 데이터 처리
loginservice생성하고 controller에 주입
- 에러 코드 호출시 메서드 사용
reject() 메서드를 이용하여 커맨드 객체 자체에 대한 에러 코드를 입력한 경우, 다음의 순서로 메시지 코드를 생성
|
rejectValue() 메서드를 이용하여 특정 필드에 대한 에러 코드를 입력했다면, 다음의 순서로 메시지 코드를 생성
|
국제화 지원을 위해 org.springframework.context.MessageSource 인터페이스를 제공
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames"> <value>message.greeting</value> </property> </bean> |
locale 변경하기 (국제화 처리)
1) 메시지 국제화 처리 - localeResolver지정
별도의 controller클래스를 만들어서 작업한다.
- ResourceBundle은 프로퍼티 파일의 이름을 이용해 언어 및 지역에 따른 메시지 로딩
message.properties : 기본 메시지 message_ko.properties : 한글 메시지 message_en_US.properties : 미국을 위한 영어 메시지 |
session영역에 locale정보를 저장한다. session영역이기에 브라우저를 닫아버리면 사라짐
<beans:bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>
2) 메시지 국제화 처리 - localeChangeInterceptor
servlet-context.xml에 코드 추가작성하고
p네임 스페이스를 이용해서 속성을 지정해준다.
인터셉터가 language에 지정한 ko, en을 셋팅하고, login.do가 호출되게끔 한다.
Json 변환
1) jackson라이브러리 사용하기
pom.xml에 라이브러리를 추가해야한다.




@ResponseBody
2) Rest API 사용하기
@RestController
@PathVariable
@PathVariable
@RestController사용 시 확장자 명시 안하므로
web.xml의 <servlet-mapping>을 *.do에서 /로 수정한다.

'WEB > ✿Spring Framework' 카테고리의 다른 글
[Spring] 🔗8) MyBatis (0) | 2022.03.05 |
---|---|
[Spring] 🔗6) 로깅처리 (0) | 2022.03.05 |
[Spring] 🔗3) AOP (0) | 2022.02.25 |
[Spring] 🔗1) IoC컨테이너(Spring 컨테이너) (0) | 2022.02.24 |
[Spring] 🔗Spring Framework (0) | 2022.02.24 |
댓글