본문 바로가기
WEB/✿Spring Framework

[Spring] 🔗4) Spring MVC

by W_W_Woody 2022. 2. 25.

스프링 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

쿠키 생성했을 때
쿠키 생성안하고 읽기만 했을 때&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;nbsp;

기본값 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로 유효성체크

인터페이스이므로 implement

우선순위 rejectValue()/reject()

 

1) 어노테이션을 이용한 유효성체크

pom.xml에 라이브러리를 추가해야한다.

라이브러리 추가

VO에 프로퍼티 지정

@Valid

@Pattern

@NotEmpty

@Size

@Range

@Email

비어있거나 형식에 맞지않을 때(문자인데 숫자를 넣을 때)

오류 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역할로 사용가능

DownloadView.java
0.00MB

이 객체를  view역할로 사용한다.

이 클래스에서 동작되서 보내는 스트림을 브라우저가 다운로드처리한다.

이미지, 텍스트파일은 브라우저가 viewer역할을 하는데

ContentType을 application/download 로 했기 때문에 다운로드처리한다.

파일을 생성하고 이 파일을 다운로드 받아볼 수 있다.

뷰의 이름과 빈의 이름이 같으면 해당 빈을 뷰로 호출하고 우선순위를 주어서 기존 것과 충돌을 방지한다.

 

 

로그인(db연동없이 )

VO생성.Getters,Setters, toString

validator생성 유효성체크

controller에서 폼 호출

form.jsp생성

context.xml에 등록

 

유효성 체크, 아이디비밀번호 일치여부확인해야하는데 일단 유효성체크먼저

controller에서 폼에서 전송된 데이터 처리 

loginservice생성하고 controller에 주입

 

-  에러 코드 호출시 메서드 사용

reject() 메서드를 이용하여 커맨드 객체 자체에 대한 에러 코드를 입력한 경우, 다음의 순서로 메시지 코드를 생성

  1. 에러코드 + “.” + 커맨드 객체 이름
  2. 에러코드

rejectValue() 메서드를 이용하여 특정 필드에 대한 에러 코드를 입력했다면, 다음의 순서로 메시지 코드를 생성

  1. 에러코드 + “.” + 커맨드 객체 이름 + “.” + 필드명
  2. 에러코드 + “.” + 필드명
  3. 에러코드 + “.” + 필드 타입
  4. 에러코드
예)
  1. required.loginCommand.userId
  2. required.userId
  3. required.java.lang.String
  4. required

국제화 지원을 위해 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

댓글