javaboiii의 Spring

Spring - ViewResolver와 요청 처리 흐름 (feat.@controller)

javaboiii 2024. 10. 8. 18:51

Spring

ViewResolver

ViewResolver는 Spring MVC에서 클라이언트 요청에 따라 적절한 뷰(화면)를 선택하는 역할을 함

다양한 종류의 ViewResolver가 존재하기 때문에, 객체를 생성할 때 반드시 ID를 명시해야 됨

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

화면 이동의 책임

실질적인 화면 이동은 DispatcherServlet(DS)이 담당

따라서 ViewResolver의 설정은 개발자가 명시적으로 해주어야 하며,

상황에 따라 어떤 ViewResolver를 사용할지를 선택해야 함

 

데이터 출력이 필요한 경우

WEB-INF을 통해 보을 강화할 수 있음

 

WEB-INF 폴더 하위의 파일은 사용자가 직접 접근할 수 없으므로, 보안이 강화됨

WEB-INF 폴더 하위에 위치한 JSP 파일들은 반드시 서버를 통해 접근해야 됨

 

ViewResolver의 Redirect와 Forward

보내는 데이터가 없을 시

return "redirect:login.jsp";

 

보내는 데이터가 있을 시

return "main";

Spring MVC 동작 순서

  1. JSP 동작
  2. Tomcat 구동
  3. 서블릿 컨테이너 초기화
  4. web.xml 파일 읽기
  5. DispatcherServlet의 XML 설정 (ds-servlet.xml)을 로드하여 DS 개입
  6. 핸들러맵퍼와 리졸버 의존 주입 수행
  7. 핸들러맵퍼에 등록된 controller의 멤버변수에 @Autowired가 있다면
  8. 해당 객체를 찾아 객체 생성

Controller 구현

implements Controller를 사용할 경우, 메서드의 자유도가 낮아짐

  • public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response)
    메서드를 강제함
  • 해당 컨트롤러에 DI(의존주입)를 해줘야됨
  • 개발자 편의 상승
public class LoginController implements Controller {
	@Autowired
	private MemberDAO memberDAO;

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		// 1. 사용자(클라이언트,브라우저)가 보낸 파라미터에서 값 추출
		String mid=request.getParameter("mid");
		String password=request.getParameter("password");

		// 2. DB 연동
		MemberDTO memberDTO=new MemberDTO();
		memberDTO.setMid(mid);
		memberDTO.setPassword(password);
		memberDTO = memberDAO.selectOne(memberDTO);

		// 3. 페이지 이동 == 네비게이션
		ModelAndView mav=new ModelAndView();
		mav.setViewName("login");
		if(memberDTO != null) {
			mav.addObject("userName", memberDTO.getName());
			mav.setViewName("main.do");
		}
		return mav;
	}
}

 

@Controller를 사용하면 성능이 향상되고 메서드의 자유도가 높아짐

  • handleRequest 메서드를 강제하지 않기 때문에
    메서드시그니쳐를 자유롭게 작성할 수 있음
    HttpServletRequest를 사용하지 않는다면 생략이 가능
  • 컨트롤러 통합이 가능함
@Controller("login")
public class LoginController {
	@RequestMapping(value="/login.do")
	public String login(HttpSession session, MemberDAO memberDAO, MemberDTO memberDTO) throws Exception {
																// 커맨드 객체
		/*
		// 1. 사용자(클라이언트,브라우저)가 보낸 파라미터에서 값 추출
		String mid=request.getParameter("mid");
		String password=request.getParameter("password");

		// 2. DB 연동
		memberDTO.setMid(mid);
		memberDTO.setPassword(password);
		*/
		memberDTO = memberDAO.selectOne(memberDTO);

		// 3. 페이지 이동 == 네비게이션
		if(memberDTO != null) {
			session.setAttribute("userName", memberDTO.getName());
			return "redirect:main.jsp";
		}
		return "redirect:login.jsp";
	}
    
    @RequestMapping("/logout.do")
	public String logout(HttpSession session) {
		session.removeAttribute("userName");
		return "redirect:login.jsp";
	}
}

Spring 컨테이너

  • @controller가 붙은 클래스의 메서드가
    인자로 객체를 받으면 컨테이너가 자동으로 객체를 생성하고 초기화해줌
  • 요청 파라미터의 이름과 DTO의 멤버 변수 이름이 같을 경우 자동으로 값을 바인딩해줌
  • 해당 인자의 DTO를 커맨드 객체라고 부름

이렇게 HttpServletRequest를 줄이면 가벼운 코드를 작성할 수 있고

사용하지 않으면 순수 자바 객체(POJO)로만 작성할 수 있어

더욱 간결한 코드 작성이 가능함

'javaboiii의 Spring' 카테고리의 다른 글

Spring - 비동기 처리  (0) 2024.10.14
Spring - 성능개선(Controller맛)  (2) 2024.10.10
Spring - SpringFramework구조의 흐름  (1) 2024.10.07
Spring - 개념 복습 / 어노테이션  (0) 2024.10.04
Spring - 의존성 주입  (1) 2024.10.02