[Spring] 스프링 MVC 구조

2020. 8. 3. 03:10Spring/Spring

1. 스프링 MVC 구조 설정

1) MVC 구조 (1), (2)

1. DispatcherServlet에서 클라이언트의 요청을 받는다.

2. DispatcherServlet에서는 HandlerMapping 객체를 통해 요청 처리할 Controller 검색한다.

3. 검색된 Controller에서 handleRequest() 메서드 호출 시 로직을 수행한다.

4. Controller에서 로직 수행 후 이동할 화면 정보를 DispatcherServlet에 전달한다.

5. DispatcherServlet에서 ViewResolver 객체를 통해 파일명과 경로를 받는다.

6. 최종적으로 받은 파일명과 경로를 실행하여 브라우저에 응답한다.

 

기본 동작 흐름은 동일하지만, Controller를 통해서 반환되는 값이 이전에는 문자열이였다면, 스프링 MVC 구조에서는 ModleAndView 객체를 반환하는 차이가 있다.

 

※ ModelAndView는 말 그대로 Model 정보와 Model을 보여줄 View 정보를 담고 있는 객체이다.

2) DispatcherServlet 등록

스프링 프레임워크에서 제공하는 DispatcherServlet으로 변경한다.

/src/main/webapp/WEB-INF/
web.xml

web.xml

3) 스프링 컨테이너 구동 및 스프링 설정 파일 생성

서블릿 컨테이너는 클라이언트의 '.do'의 요청이 있어야 DispatcherServlet 객체를 생성한다. 객체 생성 후 클래스에 재정의된 init() 메서드가 자동으로 실행이 되어 XmlWebApplicationContext 스프링 컨테이너가 동작한다.

 

이전에는 DispatcherServlet 클래스의 init() 메서드를 이용하여 서로 상호작용하는 각 객체들(DispatcherServlet, HandlerMapping, Controller, ViewResolver)을 생성하였지만, 스프링에서는 스프링 컨테이너로 객체를 생성한다는 차이가 있다.

스프링 컨테이너 구동 과정

DispatcherServlet은 스프링 컨테이너를 구동할 때, web.xml 파일에 등록된 서블릿 이름(<servlet-name>) 뒤에 '-servlet.xml' 문자열을 붙여 설정 파일(/WEB-INF/action-servlet.xml)을 찾아 로딩하여 구동한다.

/src/main/webapp/WEB-INF/
action-servlet.xml

action-servlet.xml

4) 스프링 설정 파일명, 위치 변경

DispatcherServlet은 자신이 사용할 객체들을 생성하기 위해서 스프링 컨테이너를 구동한다. web.xml 파일의 서블릿 이름대로 설정 파일의 이름과 위치는 결정되지만, 상황에 따라 변경이 가능하다.

 

이전에 설정한 설정 파일의 위치를 /config 폴더 생성 후 옮기고, 파일명을 수정한다.

/src/main/webapp/WEB-INF/
presentation-layer.xml, web.xml

presentation-layer.xml, web.xml

스프링 컨테이너가 DispatcherServlet 객체를 생성한 후 init() 메서드를 호출하여 사용한다.

public class DispatcherServlet extends HttpServlet {
	
    private String contextConfiguration;
    
    public void init(ServletConfig config) throws ServletException {
    	
        contextConfigLocation = config.getInitParameter("contextConfigLocation");
        new XmlWebApplicationContext(contextConfigLocation);
    }

}

5) 인코딩 설정

현재 시점에서는 POST 요청 시 한글 인코딩 처리를 하도록 DispatcherServlet 클래스에서 처리를 한다. 하짐나 스프링에서는 인코딩 처리를 위해 CharacterEncodingFilter 클래스를 제공하며, web.xml에 등록만 하면 클라이언트의 요청에 인코딩을 처리할 수 있다.

/src/main/java/
DispatcherServlet.java

DispatcherServlet.java

/src/main/webapp/WEB-INF/
web.xml

web.xml

 

 

 

2. Spring MVC 적용 (1)

1) 로그인 기능

/src/main/java/
LoginController.java

LoginController.java

2) HandlerMapping

클라이언트의 요청에 대해 동작하도록 스프링 설정 파일에서 HandlerMapping과 Controller를 <bean> 등록해야한다. SimpleUrlHandlerMapping 객체는 Setter 인젝션을 통해 의존성 주입을 한다. 'login.do' 경로 요청에 대해 아이디가 login인 객체가 매핑되어 있다. (SimpleUrlHandlerMapping 객체는 직접 구현한 HandlerMapping과 동일하다.)

/src/main/webapp/WEB-INF/config/
presentation-layer.xml

presentation-layer.xml

 

 

 

3. Spring MVC 적용 (2)

1) 글 목록 기능

기존 세션 저장 방식은 서버에 부담이 되기 때문에 HttpServletRequest 객체에 저장해야한다. 하지만 ModelAndView에 저장하고 있기 때문에 Controller가 반환한 ModelAndView 객체에서 Model 정보를 추출 후 HttpServletRequest 객체에 검색 결과에 해당하는 Model 정보를 저장하여 JSP로 포워딩한다.

/src/main/java/
GetBoardListController.java

GetBoardListController.java

/src/main/webapp/WEB-INF/config/
presentation-layer.xml

presentation-layer.xml

2) 글 상세 기능

/src/main/java/
GetBoardController.java

GetBoardController.java

/src/main/webapp/WEB-INF/config/
presentation-layer.xml

presentation-layer.xml

3) 글 등록 기능

/src/main/java/
InsertBoardController.java

InsertBoardController.java

/src/main/webapp/WEB-INF/config/
presentation-layer.xml

presentation-layer.xml

4) 글 수정 기능

/src/main/java/
UpdateBoardController.java

UpdateBoardController.java

/src/main/webapp/WEB-INF/config/
presentation-layer.xml

presentation-layer.xml

5) 글 삭제 기능

/src/main/java/
DeleteBoardController.java

DeleteBoardController.java

/src/main/webapp/WEB-INF/config/
presentation-layer.xml

presentation-layer.xml

6) 로그아웃 기능

/src/main/java/
LogoutController.java

LogoutController.java

/src/main/webapp/WEB-INF/config/
presentation-layer.xml

presentation-layer.xml

10) ViewResolver

ViewResolver를 사용하면 클라이언트로부터의 직접적인 JSP 호출을 차단할 수 있어서 거의 필수이다. JSP를 View로 사용하는 경우 InternalResouceViewResolver를 사용한다.

 

우선 WEB-INF 폴더 하위에 board 폴더를 생성 후, getBoard.jsp와 getBoardList.jsp 파일을 옮긴다. 기본적으로 WEB-INF 폴더는 브라우저에서 접근할 수 없다. 따라서 WEB-INF로 이동한 JSP 파일은 View 화면으로 사용할 수 없으므로 직접적인 접근을 차단할 수 있다. 하지만 여기서 InternalResourceViewResolver를 사용하면 JSP 파일을 View로 사용할 수 있다.

/src/main/webapp/WEB-INF/config/
presentation-layer.xml

presentation-layer.xml

ViewResolver가 설정이 되면 Controller 파일에 수정이 필요하다. 로그인 Controller 화면 네비게이션 코드는 'redirect:' 키워드를 넣어 수정한다. 'redirect:' 의 경우 ViewResolver가 있더라도 무시하고 리다이렉트를 수행한다. 그 외에는 ViewResolver로 인해 처리되는 부분(.jsp)에 대한 수정을 진행한다. 즉, '.do'에 대한 요청은 리다이렉트, '.jsp'에 대한 요청은 ViewResolver로 처리하기에 제거한다.

/src/main/java/
LoginController.java, GetBoardListController.java, GetBoardController.java, InsertBoardController.java, UpdateBoardController.java, DeleteBoardController.java, LogoutController.java

LoginController.java, GetBoardListController.java, GetBoardController.java, InsertBoardController.java, UpdateBoardController.java, DeleteBoardController.java, LogoutController.java

11) 패키지 파일 정리

패키지 파일 정리


[참고] 스프링 퀵 스타트

728x90