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