Spring Web MVC

CO빈·2024년 10월 27일
0

백엔드

목록 보기
3/8

Spring Web MVC

  • 어플리케이션의 확장을 위해 model,view, controller 세가지 영역으로 분리

  • 화면과 비즈니스 로직을 분리해서 작업 가능

  • 영역별 개발로 인하여 확장성이 뛰어남

  • 표준화된 코드를 사용하므로 공동작업이 용이하고 유지보수성이 좋음

Spring MVC 특징

  • 스프링은 DI나 AOP같은 기능 뿐만 아니라, 서블릿 기반 웹개발을 위한 MVC프레임워크 제공
  • Spring MVC 프레임워크는 스프링 기반이므로 스프링이 제공하는 트랜잭션 처리나 DI 및 AOP 등을 쉽게 사용

Spring MVC 구성요소

  • DispatcherServlet(Front Controller)

    • 모든 클라이언트 요청 전달받음
    • 컨트롤러에게 클라이언트 요청을 전달하고, 컨트롤러가 리턴 한 결과값을 뷰에게 전달하여 알맞은 응답 생성
  • HandlerMapping

    • 클라이언트 요청 URL을 어떤 컨트롤러가 처리할지 결정
    • DispathcherServlet은 하나 이상 핸들러 매핑을 가질 수 있음
  • Controller

    • 클라이언트 요청 처리 후, Model을 호출하고 결과를 DispatcherServlet에 알려줌
  • ModelAndView

    • 컨트롤러가 처리한 데이터 및 화면에 대한 정보를 보유한 객체
  • ViewResolver

    • 컨트롤러가 리턴한 뷰 이름을 기반으로 컨트롤러 처리 결과를 보여줄 View를 결정
  • View

    • 컨트롤러의 처리결과를 보여줄 응답화면 생성

Spring MVC를 이용한 Application구현

  • web.xml에 dispatcherServlet 등록 및 Spring 설정파일 등록
    • context 설정 파일들을 로드하기 위해 리스너 설정
<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

리스터 설정 후 최상위 context를 생성

<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/root-context.xml</param-value>
	</context-param>
  • 설정 파일에 HandlerMapping 설정
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<!-- DispatcherServlet이 해당 mapping을 찾지 못할 경우 NoHandlerFoundException를 throw하게 설정 -->
		<init-param>
			<param-name>throwExceptionIfNoHandlerFound</param-name>
			<param-value>true</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
		
	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
  • 컨트롤러 구현 및 context 설정 파일(servlet-context.xml, root-context.xml)에 등록
  • 컨트롤러와 jsp 연결을 위해 view resolver설정
  • jsp코드 작성

Controller

💻코드 예시

@Controller
//@RequestMapping("/test")
public class HelloController {
	
//	@RequestMapping(value = "/", method = RequestMethod.GET)
	@GetMapping("/")
	public ModelAndView index() {
		ModelAndView mav = new ModelAndView();
		mav.setViewName("index");
		mav.addObject("name","박효빈");
		return mav;
	}
}

파라미터 타입

✏ 1번

@PostMapping("/parameter")
	public String param(
			@RequestParam(value = "userName", required = true)  String name,
			@RequestParam( value = "userAge", required = false, defaultValue ="25" ) String age,
			@RequestParam("fruit") String[] fruits,
			Model model
			) {
		String userInfo = name + "(" + age + ")";
		model.addAttribute("userInfo" ,userInfo);
		model.addAttribute("fruits", fruits);
		return "param/result";
	}

✏ 2번 Map, Model, ModelMap사용

	@PostMapping("/paramdto")
	public String param(HelloDto helloDto, Model model) {
		model.addAttribute("result",helloDto);
		return "param/result_dto";
	}

✏ 3번 dto대신

	@PostMapping("/paramdto")
	public String param( @RequestParam Map<String, Object> map, Model model) {
		model.addAttribute("result",map);
		return "param/result_dto";
	}

View

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

viewresolver: 논리적 view와 실제 jsp파일 mapping


@PostMapping("/write")
	public String write(BoardDto boardDto, HttpSession session, RedirectAttributes redirectAttributes) throws Exception {
		logger.debug("write boardDto : {}", boardDto);
		MemberDto memberDto = (MemberDto) session.getAttribute("userinfo");
		boardDto.setUserId(memberDto.getUserId());
		boardService.writeArticle(boardDto);
		redirectAttributes.addAttribute("pgno", "1");
		redirectAttributes.addAttribute("key", "");
		redirectAttributes.addAttribute("word", "");
		return "redirect:/article/list";
	}

view 자동 지정

ReqeustToViewNameTranslator을 이용해 URL로 부터 view 이름 결정

redirect view

view 이름에 "redirect:" 접두어를 붙임

Model

ModelAndView mav = new ModelAndView();
mav.setViewName("index");
mav.addObject("name","박효빈");

Spring Web MVC 동작원리

  1. 웹 어플리케이션이 실행되면 톰캣에 의해 web.xml이 로딩
  2. web.xml에 등록되어 있는 ContextLoaderListener가 생성
    ContextLoaderListener class는 SeveletControllerListener interface를 구현하고 있으며, ApplicationContext를 생성하는 역할 수행
  3. 생성된 ContextLoaderListener는 root-context.xml을 로딩
  4. root-context.xml에 등록되어 있는 Spring Container가 구동. 이때 개발자가 작성한 service, dao 객체들이 생성
  5. DispatherServelet생성 -> frontcontoller 역할 수행
  6. dispatcherservletdms servlet-context.xml을 로딩 -> pagecontroller생성
  7. 클라이언트로부터 요청이 들어옴
  8. 두번째 spring container가 등록되며 응답에 맞는 pageController들이 동작, 이때 첫번째 springContainer가 구동되면서 생성된 dao,service 클래스들과 협업하여 알맞은 작업 처리

+) @WebServlet("/")는 web.xml로 서블릿과 서블릿매핑을 대신함

0개의 댓글

관련 채용 정보