일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- type assertion
- AJIT
- 명시적 타입 변환
- docker
- Microtask Queue
- jotai
- Custom Hook
- JavaScript
- 주니어개발자
- useCallback
- 암묵적 타입 변환
- zustand
- 프로세스
- Sparkplug
- CS
- linux 배포판
- Recoil
- useLayoutEffect
- TypeScript
- Redux Toolkit
- 클라이언트 상태 관리 라이브러리
- Compound Component
- 좋은 PR
- helm-chart
- 타입 단언
- Render Queue
- prettier-plugin-tailwindcss
- task queue
- Headless 컴포넌트
- react
- Today
- Total
구리
TIL_210622_Spring MVC_스프링 설정파일, 인코딩 설정 본문
목차
Spring MVC 구조
DispatcherServlet 등록 및 스프링 컨테이너 구동
스프링 설정 파일 변경 방법
인코딩 설정
Controller 설정
HandlerMapping 등록
ViewResolver 활용
프로젝트 구조도 (BoardWeb_SpringMVC)
프로젝트 수정 사항
- <pom.xml>에서 <name> 값은 프로젝트명으로 변경 후 톰캣 서버 모듈에서 해당 프로젝트 Path가 /프로젝트명 으로 되어 있는지 확인 후 변경
Spring MVC 구조
① 클라이언트로부터 모든 요청을 DispatcherServlet이 받습니다
② DispatcherServlet은 HandlerMapping을 통해 요청 처리할 Controller를 검색합니다
③ DispatcherServlet은 검색된 Controller를 실행하여 클라이언트의 요청을 처리합니다
④ Controller는 비즈니스 로직의 수행 결과로 얻어낸 Model, View 정보를 ModelAndView 객체에 저장하여 리턴합니다
⑤ DispatcherServlet은 ModelAndView 로부터 View 정보를 추출하고 VIewResolver를 이용해 응답으로 사용할
View를 얻어냅니다
⑥ DispatcherServlet은 VIewResolver를 통해 찾아낸 View를 실행하여 응답을 전송합니다.
DispatcherServlet 등록 및 스프링 컨테이너 구동
1) web.xml 파일에 DispatcherServlet 등록
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<servlet>
<description></description>
<display-name>action</display-name>
<servlet-name>action</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/presentation-layer.xml</param-value>
<!-- 해당 부분은 밑에서 설명할 예정 -->
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
2) 스프링 컨테이너 구동
클라이언트 요청으로 DisptacherServlet 객체 생성시 init() 메소드 자동 실행 (서블릿 객체 생성 후 멤버변수 초기화 위해)
-> 스프링 설정 파일(action-servlet.xml)을 로딩해 ApplicationContext 구현 클래스인 XmlWebApplicationContext 생성
따라서 action-servlet.xml(스프링 설정 파일)에 디스패쳐 서블릿이 사용할 핸들러 맵핑, 컨트롤러, 뷰리졸버 클래스를 <bean> 으로 등록합니다.
Q) DisptacherServlet가 스프링 컨테이너를 구동하는 이유?
SpringMVC 구성 요소 중 유일한 서블릿으로 서블릿 컨테이너는 web.xml에 등록된 DisptacherServlet만 생성됩니다.하지만 혼자서 클라이언트 요청을 할 수 없고 HandlerMapping, Controller, ViewResolver 객체들과 상호작용해야 하기에이 객체들을 메모리에 생성하기 위해 스프링 컨테이너를 구동합니다.
3) 스프링 설정 파일 등록
스프링 컨테이너 구동시 web.xml에 등록된 서블릿명 - servlet.xml 파일을 찾아서 구동합니다.
위 프로젝트 파일 구성에 따르면 현재 상태에서는 DisptacherServlet 이 스프링 컨테이너 구동시 무조건 /WEB-INF/action-servlet.xml 파일을 찾아 로딩합니다.
(파일 생성시 Spring Bean configuration file로 생성)
스프링 설정 파일 변경 방법
보통은 스프링 컨테이너를 위한 설정 파일 이름, 위치는 서블릿 이름을 기준으로 자동으로 결정되지만 변경하는 방법도 존재합니다.
바로 서블릿 초기화 파라미터를 이용합니다.
① DisptacherServlet 클래스 등록한 곳에 <init-param> 설정을 추가합니다.
② <param-value> 엘리먼트에 스프링 설정 파일 경로 및 파일명을 표기하고 <param-name> 에는 contextConfigLocation
대소문자 구분하여 작성
<servlet>
<description></description>
<display-name>action</display-name>
<servlet-name>action</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/presentation-layer.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
서버 실행시 콘솔창
<참고>
이렇게 DisptacherServlet 를 설정하면 스프링 컨테이너가 DisptacherServlet 객체를 생성한 후, 다음과 같이 init() 메소드를 호출하게 되고 contextConfigLocation 이라는 파라미터로 설정한 정보를 추출하여 스프링 컨테이너 구동시 사용합니다.
public class DisptacherServlet extends HttpServlet {
private String contextConfigLocation;
public void init(ServletConfig config) throws ServletException{
contextConfigLocation = config.getInitParameter("contextConfigLocation");
new XmlWebApplicationContext(contextConfigLocation);
}
}
인코딩 설정
1) POST 방식 요청일시 인코딩 설정
web.xml 파일에 CharacterEncodingFilter 등록
<filter>
<filter-name>characterEncoding</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>characterEncoding</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
characterEncoding 이름으로 등록한 CharacterEncodingFilter 객체가 생성되면서 <init-param>으로 설정한 encoding 파라미터 정보를 읽어 인코딩 방식을 설정합니다.
그리고 <filter-mapping>에서 <url-pattern> 설정을 "*.do" 로 했으므로 모든 클라이언트의 ".do" 요청에 대해서 CharacterEncodingFilter 객체가 일괄적으로 한글을 처리합니다.
Controller 설정
스프링이 제공하는 Controller 인터페이스를 구현한 Controller 클래스를 작성하는 데 handlerRequest() 메소드의 리턴타입은 ModelAndView로 설정합니다.
예시(로그인 기능 구현 컨트롤러)
package com.springbook.view.user;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import com.springbook.biz.board.UserVO;
import com.springbook.biz.board.impl.UserDAO;
public class LoginController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
System.out.println("로그인 처리");
// 1. 사용자 입력 정보 추출
String id = request.getParameter("id");
String password = request.getParameter("password");
// 2. DB 연동 처리
UserVO vo = new UserVO();
vo.setId(id);
vo.setPassword(password);
UserDAO userDAO = new UserDAO();
UserVO user = userDAO.getUser(vo);
// 3. 화면 네비게이션
ModelAndView mav = new ModelAndView();
if(user != null){
mav.setViewName("redirect:getBoardList.do");
}else{
mav.setViewName("redirect:login.jsp");
}
return mav;
}
}
HandlerMapping 등록
작성된 LoginController가 클라이언트의 "/login.do" 요청에 대해 동작하게 하기 위해 스프링 설정 파일에 HandlerMapping 과
LoginController를 <bean>으로 등록합니다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="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-4.2.xsd">
<!-- HanlderMapping 등록 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/login.do">login</prop>
</props>
</property>
</bean>
<!-- Controller 등록 -->
<bean id="login" class="com.springbook.view.user.LoginController"></bean>
</beans>
SimpleUrlHandlerMapping 객체는 Setter 인젝션을 통해 Properties 타입의 컬렉션 객체를 의존성 주입합니다.
Properties 컬렉션에는 "/login.do" 경로 요청에 대해 아이디가 login인 객체가 매핑되어 있습니다.
LoginController 클래스를 <bean>으로 등록시, 반드시 SimpleUrlHandlerMapping에서 '/login.do' 킷값으로 매핑한 값과 같은 아이디로 등록해야 합니다.
ViewResolver 활용
InternalResourceViewResolver를 이용하여 WEB-INF 폴더 내의 JSP 파일에 접근할 수 있습니다.
(presentation-servlet.xml에 작성 및 getBoard.jsp, getBoardList.jsp는 WEB-INF/board 폴더 생성하여 이동 )
<!-- ViewResolver 등록 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/board/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
프로젝트 결과 코드
자바코드
package com.springbook.view.user;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class LogoutController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
System.out.println("로그아웃 처리");
HttpSession session = request.getSession();
session.invalidate();
ModelAndView mav = new ModelAndView();
mav.setViewName("redirect:login.jsp");
return mav;
}
}
package com.springbook.view.user;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import com.springbook.biz.board.UserVO;
import com.springbook.biz.board.impl.UserDAO;
public class LoginController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
System.out.println("로그인 처리");
// 1. 사용자 입력 정보 추출
String id = request.getParameter("id");
String password = request.getParameter("password");
// 2. DB 연동 처리
UserVO vo = new UserVO();
vo.setId(id);
vo.setPassword(password);
UserDAO userDAO = new UserDAO();
UserVO user = userDAO.getUser(vo);
// 3. 화면 네비게이션
ModelAndView mav = new ModelAndView();
if(user != null){
mav.setViewName("redirect:getBoardList.do");
}else{
mav.setViewName("redirect:login.jsp");
}
return mav;
}
}
package com.springbook.view.board;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.springbook.biz.board.BoardVO;
import com.springbook.biz.board.impl.BoardDAO;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class GetBoardListController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
System.out.println("글목록 처리");
// 1. 사용자 입력 정보 추출
// 2. DB 연동 처리
BoardVO vo = new BoardVO();
BoardDAO boardDAO = new BoardDAO();
List<BoardVO> boardList = boardDAO.getBoardList(vo);
// 3. 검색 결과 세션에 저장후 목록 화면 리턴
// HttpSession session = request.getSession();
// session.setAttribute("boardList", boardList);
// return "getBoardList";
// 3. 검색 결과, 화면 정보를 ModelAndView에 저장하여 리턴
ModelAndView mav = new ModelAndView();
mav.addObject("boardList", boardList);
mav.setViewName("getBoardList");
return mav;
}
}
package com.springbook.view.board;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.springbook.biz.board.BoardVO;
import com.springbook.biz.board.impl.BoardDAO;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class GetBoardController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
System.out.println("글 상세 조회 처리");
// 1. 사용자 입력 정보 추출
String seq = request.getParameter("seq");
// 2. DB 연동 처리
BoardVO vo = new BoardVO();
vo.setSeq(Integer.parseInt(seq));
BoardDAO boardDAO = new BoardDAO();
BoardVO board = boardDAO.getBoard(vo);
// 3. 검색 결과 세션에 저장후 목록 화면 리턴
ModelAndView mav = new ModelAndView();
mav.addObject("board", board);
mav.setViewName("getBoard");
return mav;
}
}
package com.springbook.view.board;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.springbook.biz.board.BoardVO;
import com.springbook.biz.board.impl.BoardDAO;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class InsertBoardController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
System.out.println("글 등록 처리");
//request.setCharacterEncoding("UTF-8");
// 1. 사용자 입력 정보 추출
String title = request.getParameter("title");
String writer = request.getParameter("writer");
String content = request.getParameter("content");
// 2. DB 연동 처리
BoardVO vo = new BoardVO();
vo.setTitle(title);
vo.setWriter(writer);
vo.setContent(content);
BoardDAO boardDAO = new BoardDAO();
boardDAO.insertBoard(vo);
// 3. 검색 결과 세션에 저장후 목록 화면 리턴
ModelAndView mav = new ModelAndView();
mav.setViewName("redirect:getBoardList.do");
return mav;
}
}
package com.springbook.view.board;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.springbook.biz.board.BoardVO;
import com.springbook.biz.board.impl.BoardDAO;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class UpdateBoardController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
System.out.println("글 수정 처리");
request.setCharacterEncoding("UTF-8");
// 1. 사용자 입력 정보 추출
String title = request.getParameter("title");
String seq = request.getParameter("seq");
String content = request.getParameter("content");
// 2. DB 연동 처리
BoardVO vo = new BoardVO();
vo.setTitle(title);
vo.setSeq(Integer.parseInt(seq));
vo.setContent(content);
BoardDAO boardDAO = new BoardDAO();
boardDAO.updateBoard(vo);
// 3. 검색 결과 세션에 저장후 목록 화면 리턴
ModelAndView mav = new ModelAndView();
mav.setViewName("redirect:getBoardList.do");
return mav;
}
}
package com.springbook.view.board;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.springbook.biz.board.BoardVO;
import com.springbook.biz.board.impl.BoardDAO;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class DeleteBoardController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {
System.out.println("글 삭제 처리");
// 1. 사용자 입력 정보 추출
String seq = request.getParameter("seq");
// 2. DB 연동 처리
BoardVO vo = new BoardVO();
vo.setSeq(Integer.parseInt(seq));
BoardDAO boardDAO = new BoardDAO();
boardDAO.deleteBoard(vo);
// 3. 검색 결과 세션에 저장후 목록 화면 리턴
ModelAndView mav = new ModelAndView();
mav.setViewName("redirect:getBoardList.do");
return mav;
}
}
xml 문서
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<filter>
<filter-name>characterEncoding</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>characterEncoding</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<servlet>
<description></description>
<display-name>action</display-name>
<servlet-name>action</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/presentation-layer.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="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-4.2.xsd">
<!-- HanlderMapping 등록 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/login.do">login</prop>
<prop key="/getBoardList.do">getBoardList</prop>
<prop key="/getBoard.do">getBoard</prop>
<prop key="/insertBoard.do">insertBoard</prop>
<prop key="/updateBoard.do">updateBoard</prop>
<prop key="/deleteBoard.do">deleteBoard</prop>
<prop key="/logout.do">logout</prop>
</props>
</property>
</bean>
<!-- Controller 등록 -->
<bean id="login" class="com.springbook.view.user.LoginController"></bean>
<bean id="logout" class="com.springbook.view.user.LogoutController"></bean>
<bean id="getBoardList" class="com.springbook.view.board.GetBoardListController"></bean>
<bean id="getBoard" class="com.springbook.view.board.GetBoardController"></bean>
<bean id="insertBoard" class="com.springbook.view.board.InsertBoardController"></bean>
<bean id="updateBoard" class="com.springbook.view.board.UpdateBoardController"></bean>
<bean id="deleteBoard" class="com.springbook.view.board.DeleteBoardController"></bean>
<!-- ViewResolver 등록 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/board/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
'SPRING FRAMEWORK' 카테고리의 다른 글
TIL_210623_SpringMVC_비즈니스 컴포넌트 사용, 비즈니스 컴포넌트 로딩, 검색 기능 구현 (0) | 2021.06.22 |
---|---|
TIL_210623_SpringMVC_어노테이션 설정(@RequestMapping, ModelAttribute, RequestParam, SessionAttributes) (0) | 2021.06.22 |
TIL_210621_스프링 트랜잭션 처리 (0) | 2021.06.21 |
TIL_210618_어노테이션 기반 AOP (0) | 2021.06.18 |
TIL_210618_AOP (0) | 2021.06.18 |