Spring

[ MVC 패턴 ] Spring으로 표현하기

주니홍 2022. 9. 20. 19:27

 

기존에 배웠던 MVC 패턴을 Spring으로 표현한다면 어떤 장점이 있는가?

 

기존의 MVC 패턴실행 순서

 

사용자의 요청 >> *.do >> FrontController 서블릿 에서 C 호출 >> 경로정보 반환 >> 사용자에게 화면제공

 

FrontController.java (서블릿)

 

 InsertMemberAction.java

 

FrontController.java (서블릿)

 


기존의 MVC 패턴을 Spring에 접목시켰을 경우

 

1. 메모리를 불필요하게 사용하던 객체들이 현저히 줄어듦

>> Spring에서 제공하는 객체들을 사용하여, 객체를 생성할 필요가 없음

 

2. 하드코딩이 줄어들었다 (코드의 불필요한 반복패턴이 줄어듦)

>> 사용할메서드().execute(request, response); 항상 붙여왔던 것을 안해도 됨

>> JDBC에서 conn pstmt 같은 반복패턴이 줄어듦

 

3. 결합도가 낮아지고 응집도가 높아짐

>> new가 사라졌다

>> 유지보수가 용이

즉, 유지보수가 용이해짐 ex) 로그인로직을 바꿔끼워도 다른파트를 수정할 필요가 없음

 


Spring으로 표현해보자

 

실행순서

사용자의 요청 >> * . do >> DS >> HM >> DAO호출 >> 경로정보를 반환 >> VR >> 화면을 제공

 

1. 사용자의 요청으로인해 *.do가 실행됨

 

2. web.xml에서 *.do요청을 캐치하여 DS를 실행함

>> DS란 DispatcherServlet 이며, 기존의 FrontController 역할을 한다

 

3. DS는 HM을 통해서 DAO를 호출하여 사용한다 

>> HM란 HandlerMapping 이며, *.do를 키값으로 해당된 DAO를 호출해준다

 

4. DAO실행이후 돌아갈 경로정보를 VR에 저장하여 화면을 제공한다

>> VR란 ViewResolver 이며, 경로정보를 저장하여 사용자에게 화면을 제공해준다

 

 


 

스프링으로 인해 바뀌는부분

 

1. *.do 요청을 반응하도록 web.xml에서 설정 (서블릿 컨테이너)

1. DispatcherServlet 생성 ( 스프링 컨테이너 )

DispatcherServlet.java (서블릿) 파일을 생성시 자동으로 생성되지만

현재 Spring을 사용하기때문에 수기로 작성해야 할 것이고

servlet-class 태그바디에 org.springframework.web.servlet.DispatcherServlet 을 작성하여

Spring 프레임워크에 있는 DispatcherServlet을 사용한다고 해야한다

 

servlet-mapping을 통해 위에서 생성한 DispatcherServlet은 *.do 요청에 반응한다

 

※ Spring에서 제공하는 DS 객체를 생성해줄때에 init() 자동실행되는데

[/WEB-INF/디스패쳐이름-servlet.xml] 를 참고하여 객체를 생성한다

그래서 생성한 DispatcherServlet-servlet.xml 을 WEB-INF 폴더안에 생성해주어야 한다

>> 디스패쳐이름-servlet 은 Spring에서 정해진 형식이다

DS-servlet.xml 은 DS가 사용할  ( POJO ) HM,C,VR 객체 생성을 한다

 

( DispatcherServlet-servlet.xml )

DispatcherServlet-servlet.xml에 등록해야할 ( HM, 필터, C )

1) HandlerMapping 등록

org.springframework.web.servlet.handler.SimpleUrlHandlerMapping

Spring 프레임워크에서 제공하는 HandlerMapping을 사용합니다.

<property name="mappings"> 는 Spring에서 제공하는 형식이므로 지켜야합니다

props 태그를 이용하여 prop 안에 속성 Key값과 바디에 객체id를 작성합니다

 

2) Cotroller 객체 등록

HandlerMapping에 등록할 객체를 생성합니다

 Mapping에서 사용할 id는 객체화한 클래스의 id명을 적습니다 

 

3) ViewResolver 등록

org.springframework.web.servlet.view.InternalResourceViewResolver

Spring 프레임워크에서 제공하는 ViewResolver를 사용합니다

기능수행후 경로지정시 앞에붙여줄 prefix값, 뒤에붙여줄 suffix값을 주입한다

name값 prefix, suffix 는 Spring에서 제공하는 형식이므로 지켜야합니다

 

 


 

2. 필터등록

Spring에서 제공하는 클래스를 사용한다

org.springframework.web.filter.CharacterEncodingFilter

param encoding 이름은 Spring에서 제공하는 형식이므로 지켜야합니다

필터를 *.do로 반응하도록 mapping태그로 설정해준다

 

 

 

 

 

3. 기존에 만든 interface가 아닌 Spring에서 제공하는 interface 사용

@Override

public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception
메서드 오버라이딩 강제를 시키고 있음
>> 아웃풋을 mav 객체로 해줘야함

 

mav.setViewName("사용자에게 제공할 경로명")
>> mav 객체는 멤버변수로 viewName을 가짐

 

mav.addObject(사용할이름, 객체)

>> 다음 new ModelAndview() 까지 쓸 수 있다

>> Spring 컨테이너가 유지를 해주는것

 

이후 mav를 리턴해 준다

 

 

 

 

4. ViewResolver를 등록하여 VR 통해 사용자에게 화면을 제공할 예정

( DispatcherServlet-servlet.xml )

( LogoutController.java )

( MainController.java )

board.jsp, main.jsp 등은 데이터 출력을 필요로하는 페이지
>> 브라우저에서 절때 접근할 수 없도록 WEB-INF 하위에 관리
>> 브라우저에서 접근할경우 데이터없이 페이지를 보여줄 수 있기때문에

(데이터가없는 빈 페이지를 보여주고 싶지 않아서 = 사용자편의성)

ViewResolver를 등록하여 VR를 통해서 화면을 제공할 예정입니다
>> redirect: 입력하지않는다면 디폴트로 Forward 액션이다