[Spring] ViewResolver

2024. 10. 9. 01:45·Spring
목차
  1. ViewResolver ?
  2. ViewResolver 경로
  3. ViewResolver의 필요성
  4. ViewResolver가 없는 경우
  5. ViewResolver 처리 순서
  6. ViewResolver의 의존성 주입(DI)

ViewResolver ?

ViewResolver(VS)는 말 그대로 뷰(View)를 결정하는 역할을 한다.

Spring MVC 구조에서, 컨트롤러가 요청을 처리한 후, 클라이언트에게 어떤 뷰 페이지를 보여줄지 결정할 때 ViewResolver가 개입하게 된다.

 

페이지 이동 시 VR이 관여하고, setter 주입 방식을 사용하므로 prefix와 suffix를 property로 설정한다.

컨트롤러가 반환하는 뷰의 이름(예: "login" 또는 "main")을 받아서 실제 JSP 파일 경로로 변환해주는 객체가 바로 ViewResolver다.

 

Spring에서는 다양한 ViewResolver를 제공하는데, 그 중 가장 많이 사용하는 것은 InternalResourceViewResolver다.

이 ViewResolver는 JSP, HTML과 같은 서버 쪽에서 처리할 수 있는 파일들에 대한 뷰를 반환해준다.

InternalResourceViewResolver 설정

InternalResourceViewResolver는 JSP 파일을 사용해서 화면을 렌더링할 때 주로 쓰인다.

여기서 렌더링이란, 코드를 실제 화면으로 바꾸는 과정을 뜻한다.

 

 

이 때 중요한 게 prefix와 suffix 속성이다.

 

prefix는 JSP 파일의 경로 앞부분을 설정한다.

suffix는 파일의 확장자를 설정한다.

ViewResolver 경로

ViewResolver는 xml 파일 안에 설정한다.

WEB-INF/web.xml이 다음과 같다면, 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://jakarta.ee/xml/ns/jakartaee" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd" version="6.0">
 	<servlet>
    <servlet-name>ds</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ds</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>

 

위 web.xml 코드에 의해 Spring은 (같은 경로의)ds-servlet.xml 파일을 찾게 된다. 

ViewResolver는 WEB-INF/ds-servlet.xml 파일안에 설정한다.

<?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">
	
	<context:component-scan	base-package="com.yn.app.view.member" />
	<context:component-scan base-package="com.yn.app.view.board" />
	<context:component-scan	base-package="com.yn.app.biz.member" />
	<context:component-scan base-package="com.yn.app.biz.board" />
	
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver">
		<property name="prefix" value="/WEB-INF/views/"/>
		<property name="suffix" value=".jsp"/>
	</bean>
</beans>

 

위 코드는 xml 전체 코드이고, 아래부분만 설명해보려고 한다.

 

여기서는 prefix로 "/WEB-INF/views/"를 주고, suffix로 ".jsp"를 줬기 때문에,

컨트롤러가 반환하는 뷰의 이름이 "main"이면 실제 파일 경로는 "/WEB-INF/views/main.jsp"가 된다.

 

이런 방식으로 JSP 파일을 WEB-INF 폴더에 숨겨서 외부 클라이언트가 직접 접근하지 못하게 하고,

Spring의 ViewResolver를 통해서만 접근하게 만들 수 있다.

 

ViewResolver의 필요성

ViewResolver는 클라이언트가 요청한 작업이 끝난 후 어떤 페이지로 이동할지 결정한다. 그럼 왜 이게 필요할까?

  • URL 구조의 통일성: 뷰 파일의 경로가 매번 다르면 코드가 지저분해지고 관리가 어려워진다. ViewResolver는 경로 앞뒤를 고정적으로 설정해줌으로써 개발자가 깔끔하게 관리할 수 있게 해준다.
  • 보안성 강화: 중요한 페이지는 WEB-INF 하위에 넣어두면 클라이언트가 직접 접근할 수 없다. ViewResolver를 통해서만 접근하게 되어 보안이 강화된다.
  • 유연성: ViewResolver를 활용하면 같은 이름의 뷰를 여러 경로에 맞춰 다르게 설정할 수 있다. 예를 들어, 관리자의 페이지는 /WEB-INF/admin/, 일반 사용자의 페이지는 /WEB-INF/user/에 배치하는 식으로 설정할 수 있다.

ViewResolver가 없는 경우

간혹, ViewResolver가 필요 없는 경우도 있다.

특정 페이지에서 리다이렉트를 해야 할 때는 ViewResolver를 거치지 않고 직접 JSP 파일로 이동시킬 수 있다.

ModelAndView mav = new ModelAndView();
mav.setViewName("redirect:login.jsp");

 

위 코드에서 보면, redirect:를 붙여주면 직접 해당 JSP 파일로 이동시키면서 ViewResolver는 사용하지 않게 된다.

이 경우는, 로그인 페이지나 외부 리다이렉션이 필요한 상황에서 유용하다.

ViewResolver 처리 순서

Spring MVC의 전체적인 흐름을 보면, ViewResolver가 어떻게 동작하는지 쉽게 이해할 수 있다.

  1. Tomcat 서버 구동: Spring 애플리케이션이 실행되면 Tomcat(또는 다른 서블릿 컨테이너)이 구동된다. 이때, 서블릿 컨테이너는 web.xml 또는 애너테이션 기반 설정 파일을 읽어들여 설정을 초기화한다.
  2. DispatcherServlet이 요청을 받음: 클라이언트로부터 요청이 들어오면, Spring의 DispatcherServlet이 모든 요청을 처리하기 위해 가장 먼저 요청을 받는다. web.xml에서 이 서블릿이 요청을 처리하도록 설정되어 있어야 한다.
  3. HandlerMapper가 컨트롤러 호출: DispatcherServlet은 요청 URL을 분석한 후, HandlerMapper를 사용해 요청을 처리할 적절한 컨트롤러 메서드를 찾는다. 이 컨트롤러 메서드는 비즈니스 로직을 처리하거나, 데이터를 조회하고 가공하는 작업을 수행한다.
  4. 컨트롤러에서 뷰 이름 반환: 컨트롤러는 비즈니스 로직을 처리한 후, JSP와 같은 뷰를 렌더링하기 위해 뷰 이름(String 형태)을 반환한다. 이 뷰 이름은 실제 파일의 이름이 아니라 ViewResolver가 경로를 완성해줄 (파일명을 제외한) 뷰 이름이다.
  5. ViewResolver가 View 경로 결정: ViewResolver는 이 뷰 이름을 받아서 미리 설정된 prefix와 suffix를 붙여서 실제 파일 경로로 변환한다. View 이름이 "main"이라면, ViewResolver는 prefix와 suffix를 붙여 "/WEB-INF/views/main.jsp"로 변환한다.
  6. JSP 파일 렌더링: ViewResolver가 찾아낸 파일 경로에 해당하는 JSP 파일을 브라우저에 표시할 수 있도록 처리한다. 이 때 JSP 파일이 실행되어 HTML 코드로 변환되며, 최종적으로 클라이언트에게 렌더링되어 화면에 표시된다.

이 순서에서 ViewResolver는 뷰 이름을 파일 경로로 매핑해주는 중요한 역할을 한다.

 

ViewResolver의 의존성 주입(DI)

Spring에서 ViewResolver는 의존성 주입을 통해 관리된다.

앞서 말했듯이 보통 setter 주입을 통해 prefix와 suffix를 설정하게 된다.

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
</bean>

 

위 설정에서 prefix와 suffix는 Spring의 DI에 의해 주입되며,

개발자는 각각의 뷰에 대해 따로 경로를 설정할 필요 없이 편리하게 관리할 수 있다.

 

 

 

 

'Spring' 카테고리의 다른 글

[Spring] 2-Layered 아키텍처 정리  (0) 2024.10.10
[Spring] 스테레오타입 어노테이션과 @RequestMapping  (0) 2024.10.09
[Spring] DispatcherServlet과 Spring MVC의 핵심 흐름 분석  (0) 2024.10.07
[Spring] DispatcherServlet, ViewResolver , DI 방식 정리  (0) 2024.10.07
[Spring] Spring DI와 비즈니스 로직  (2) 2024.10.06
  1. ViewResolver ?
  2. ViewResolver 경로
  3. ViewResolver의 필요성
  4. ViewResolver가 없는 경우
  5. ViewResolver 처리 순서
  6. ViewResolver의 의존성 주입(DI)
'Spring' 카테고리의 다른 글
  • [Spring] 2-Layered 아키텍처 정리
  • [Spring] 스테레오타입 어노테이션과 @RequestMapping
  • [Spring] DispatcherServlet과 Spring MVC의 핵심 흐름 분석
  • [Spring] DispatcherServlet, ViewResolver , DI 방식 정리
yn98
yn98
좌우명 : 여전할 것 인가, 역전할 것 인가? 백엔드 개발자가 되고싶은 역전하고 있는 개발자 꿈나무의 블로그입니다. 개발을 하면서 공부한 것들을 기록합니다. 24.06 ~
  • yn98
    개발 꿈나무
    yn98
  • 전체
    오늘
    어제
    • 분류 전체보기 (131)
      • Python (3)
      • 공부 (7)
      • DB (7)
      • JAVA (24)
      • JSP (9)
      • jQuery (2)
      • HTML (3)
      • Spring (20)
      • 웹 (4)
      • C (1)
      • Git (2)
      • 에러일기 (19)
      • 프로젝트 (6)
      • 책 (21)
        • 멘토씨리즈 자바 (14)
        • 2024 수제비 정보처리기사 (7)
      • 기타 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
    • Notion
  • 공지사항

  • 인기 글

  • 태그

    @service
    jsp
    스프링 프레임워크
    오버로딩
    Spring
    java
    정보처리기사
    멘토씨리즈 자바
    html
    정처기 실기
    aop
    상속
    ViewResolver
    생성자
    codeup 4891 : 행복
    티스토리챌린지
    정보처리기사 실기
    Di
    이벤트 스케줄러
    오블완
    2-layered 아키텍처
    MVC
    수제비
    정처기
    어노테이션
    @repository
    DispatcherServlet
    @Component
    recoverabledataaccessexception
    객체지향
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
yn98
[Spring] ViewResolver

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.