[SPRING] Dispatcher-servlet

Yuri Lee·2022년 12월 27일
0

스프링

목록 보기
13/13

내가 배운 스프링5에선 Dispatcher-servlet이 web.xml에 정의되어 있고, HandlerMapping/HandlerAdapter/ViewResolver 등을 java 파일에서 override 해서 간단하게 설정할 수 있었다.
국가정부프레임워크 3.5는 이 모든게 xml 파일에 따로 설정되어 있었기에 Dispatcher-servlet.xml 파일에 설정된 것들을 한 번 정의하고 넘어가려 한다.
그런데 정리하면서도 이해가 가지 않는 부분들이 있어 언젠가 짬이 차서 이해하게 된 날 다시 정리해야할 것 같다ㅋㅋㅋ

component-scan

빈으로 등록 될 준비를 마친 클래스들을 스캔하여, 빈으로 등록해주는 것이다.
우리가 @Controller, @Service, @Component, @Repository 어노테이션을 붙인 클래스들이 빈으로 등록 될 준비를 한 것이다.

<context:component-scan base-package="com.rcod.lifelog">
	<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>

위와 같이 xml 파일에 설정하고, base package를 적어주면 해당 패키지를 기준으로 클래스들을 스캔해서 빈으로 등록해준다.
include-filter나 exclude-filter를 통해 특정스캔대상이나 스캔제외대상을 설정할 수 있다.

* 스프링5 와 비교되는 점
5에서는 @Configuration이 붙은 스프링 설정클래스에 @Bean으로 등록된 클래스는 사용클래스에서 객체주입 애노테이션을 통해 인스턴스를 부여받을 수 있었음.
국가정부프레임워크 3.5에서는 xml에서 Component-scan 대상 패키지만 정의해놓으면 객체주입이 가능하니 설정클래스가 따로 필요없어 오히려 간단하게 느껴진다...?!

RequestMappingHandlerMapping

말 그대로 @RequestMapping를 핸들링하는 매핑인듯..?!

RequestMappingHandlerAdapter

@RequestMapping annotation을 지원

WebBindingInitializer

컨트롤러 메소드에서 바인딩이 어떻게 일어날까?
@Controller 메소드를 호출해줄 책임이 있는 AnnotationMethodHandlerAdapter는 @RequestParam이나 @ModelAttribute 처럼 HTTP 요청을 파라미터 변수에 바인딩해주는 작업이 필요한 애노테이션을 만나면 WebDataBinder를 만든다.

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter>
	<property name="webBindingInitializer">
    	<bean class="egovframework.miris.cmmn.web.EgovBindingInitializer"/>
    </property>
</bean>

WebDataBinder에 추가한 커스텀 프로퍼티 에디터는 메소드가 있는 컨트롤러 클래스 안에서만 동작한다. 따라서 모든 컨트롤러에 적용해도 될 만큼 많은 곳에서 필요한 프로퍼티 에디터라면 WebBindingInitializer를 이용해서 등록할 수 있다.
? 무슨 말인지 모르겟음 크크

localeResolver,LocaleChangeInterceptor

Session에 Locale 정보를 박아 넣고 이를 통해 다국어를 처리해주는 역할
localeResolver는 locale을 결정하는 역할
LocaleChangeInterceptor는 url 뒤에 특정 locale 인자값을 넘겨서 변경하도록 하는 것이다. 위의 소스로 예를 들자면 ip:port/abc/dev?lang=en 이런식으로 요청이 들어온다면 locale을 en으로 변경을 해준다.

SimpleMappingExceptionResolver

Exception 별로 원하는 화면에 연결해줌

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
	<property name="defaultErrorView" value="error/common_error"/>
    </property>
    <property name="exceptionMappings">
    	<props>
        	<prop key ="org.springframework.java.lang.NullException">common/error</props>
            <prop key ="org.springframework.java.lang.NullException2">common/error2</props>
        </props>
    </property>
</bean>

beanNameViewResolver

-Spring container에 bean으로 등록된 view 이름을 찾아 사용하는 resolve.
-ModelAndView 객체를 반환할 때 ViewName을 세팅하여 리턴하면 해당 -beanName을 가진 view를 찾는다.
-커스텀 view 클래스를 view로 사용하는 경우 주로 사용 ?

<bean id = "beanNameVeiwResolver" class = "org.springframework.web.servlet.view.VeanNameVeiwResolver" p:order="1"/>

p:order 는 다수의 viewResolver에 우선순위를 부여

주의 : InternalResourceViewResolver 는 항상 우선순위 마지막에 지정

InternalResourceViewResolver

-Resource를 대상으로 view를 찾는데, 정적 자원 즉, webapp 아래 자원들을 반환값으로 찾게된다.
-컨트롤러가 지정한 뷰 이름 앞뒤로 prefix 프로퍼티와 suffix 프로퍼티를 붙인 값이 실제로 사용될 자원의 경로가 된다.

<bean id = "InternalResourceViewResolver" 
class = "org.springframework.web.servlet.view.InternalResourceViewResolver" 
p:order="2" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>

jsonView 설정

ModelAndView를 json 형식으로 반환해줌

<bean id ="jsonView" 
	class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"/>
    

-> Controller 에서 return 할 ModelAndView 를 생성할 때 view를 "jsonVeiw" 로 설정해줌

ModelAndView mv = new ModelAndView("jsonView");
userVO.setOrderBy(orderDir);
userVO.setOrderId(orderColNm);

List<UserVO> userList = userMgmtSvc.selectUserList(userVO);
int totalCnt = userMgmSvc.selectUserListCount(userVO);

mv.addObject("recordsTotal", totalCnt);
mv.addObject("recordsFiltered", totalCnt);
mv.addObject("data", userList);

return mv;

paginationManager

전자정부프레임워크에서 페이징 처리를 편하게 하기 위해 제공하는 태그

<bean id="paginationManager" class="egovframework.rte.ptl.mvc.tags.ui.pagination.DefaultPaginationManager">
		<property name="rendererType">
			<map>
				<entry key="image" value-ref="imageRenderer"/>
				<entry key="text" value-ref="textRenderer"/>
			</map>
		</property>
</bean>

사용자가 페이징 jsp페이지에서 image를 사용하고 싶다면 아래와 같이 넣어주면 된다.

<ui:pagination paginationInfo = "${paginationInfo}"
	type="image"
	jsFunction="linkPage"/>

text또한 큰차이 없이 type부분을 text로 변경하여 주기만 하면 된다.

excelView

엑셀 다운로드 구현

<bean id ="excelView" class="egovframework.EgovExcelView"/>

mvc:view-controller

특정 URL에 대해 정적 페이지를 제공하는 기능이다.

즉 isYourURL에는 정적 페이지로 이동이 될 URL을 작성하고, View/Location 항목에는 정적 페이지의 경로(jsp등이 있는 경로)를 적어주면 된다.

**XML 버전**

<mvc:view-controller path="/isYourURL" view-name="/View/Location"/>

**Java 버전**

@Override
public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/isYourURL").setViewName("/View/Location");
}

references

profile
개발자 이유리

0개의 댓글