[Spring] MVC

Gabriela·2023년 10월 4일
0

Spring

목록 보기
4/8

MVC 패턴

MVC : Model, View, Controller


  • Appilcation을 개발할 때 사용하는 디자인 패턴이다.
  • 애플리케이션의 개발 영역을 구분하여 개발할 수 있어 개발과 유지보수가 용이하다.

‣ Spring MVC 동작 원리



• DispatcherServlet

  • 스프링 프레임워크의 핵심 서블릿
  • web.xml에 관련 정보 작성
  • 기본적으로 servlet-context.xml 설정 파일을 읽어서 스프링 프레임워크를 구동함

• servlet-context.xml

<annotation-driven />

  • @Controller Annotation을 활성화
  • Spring MVC에서 Controller에게 요청하기 위해 필요한 HandlerMappingHandlerAdapter자동으로 bean으로 등록

HandlerMapping

  • @Controller가 적용된 객체를 컨트롤러하고 함
  • HandlerMapping요청처리컨트롤러@RequestMapping값을 이용해서 검색

HandlerAdapter

  • 요청처리컨트롤러메소드실행
  • 메소드 실행 결과ModelAndView 객체변환한 뒤 DispatcherServlet에게 반환

<resources> 태그

<resources mapping="/resources/**" location="/resources/">

  • 웹 구성 요소 중에서 정적 자원(css, js, image 등)의 경로와 주소를 관리하는 태그
    • 정적 자원 : 멀티미디어 데이터(이미지, 오디오, 비디오 등), CSS, JS 등
  • mapping="/resources/**" : 주소(URL)가 /resources로 시작하는 경우
    • /resources/** : *이 두개 들어간 경우의 해석은 하위 경로가 여러개를 거칠 수 있다는 의미
  • location="/resources/" : /resources/ 디렉터리로 연결하라는 의미

• 뷰 리졸버

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

  • HandlerAdapter에 의해서 반환ModelAndView 객체저장된 뷰 정보처리

• <context:component-scan base-package="com.spring.app" />

  • base-package에 지정된 패키지에 저장된 클래스들을 스캔하고 자동으로 bean을 생성
  • @Component, @Controller, @Service, @Repository 등의 Annotation이 추가된 클래스bean으로 등록
  • Spring MVC Projecttop-level package동일해야 함

‣ Spring MVC 주요 Annotation

Annotation의미사용
@Controller스프링 MVC의 컨트롤러 객체임을 명시클래스
@RequestMapping특정 RequestURI에 매핑되는 컨트롤러(클래스)나 메소드임을 명시클래스, 메소드
@RequestParam요청에서 특정 파라미터의 값을 가져올 때 사용파라미터
@RequestHeader요청에서 특정 HTTP헤더 정보를 가져올 때 사용파라미터
@ModelAttribute파라미터를 처리한 객체를 뷰까지 전달메소드, 파라미터
@ComponentBean으로 만들어 둬야 할 객체임을 명시클래스
@Service서비스 객체에 추가하는 @Component클래스
@RepositoryDAO 객체에 추가하는 @Component클래스
@PathVariableRequestURI에 포함된 값을 가져올 때 사용파라미터
@RequestBody요청 본문에 포함된 데이터가 파라미터로 전달파라미터
@ResponseBody반환 값이 HTTP 응답 메시지로 전송메소드, 리턴타입
@CookieValue쿠키가 존재하는 경우 쿠키 이름을 이용해서 쿠키 값을 가져올 때 사용파라미터
@SessionAttributeModel의 정보를 세션에서 유지할 때 사용클래스

‣ Controller

  • @Controller가 적용된 클래스
  • @RequestMapping을 이용해 요청 URL요청 메소드 파악
  • 메소드 단위요청처리
  • 메소드결과를 출력할 뷰 이름을 반환

• Controller Method 반환 타입

  • 컨트롤러하나의 요청하나의 메소드로 처리함
  • Spring MVC Pattern에서는 메소드의 반환 타입String 또는 void설정할 수 있음
    • String : 응답할 Jsp의 이름을 반환한다.
    • void : 컨트롤러가 호출한 서비스에서 직접 응답한다. 요청 주소Jsp 이름으로 인식한다.
    • 기타 : 비동기 통신에서 데이터응답한다.

메소드명

  • 아무 일도 안 한다.

매개변수

  • HttpServletRequest를 선언해서 사용할 수 있다.
  • HttpServletResponse를 선언해서 사용할 수 있다.
  • Model을 선언해서 forward정보를 저장할 수 있다.
    • (선언 순서는 상관 없다.)
  • HttpSession을 선언해서 사용할 수 있다.
    (request로 받아오지 않고 session을 선언해서 사용할 수 있다.)

요청(@RequestMapping)

  • 메소드 : GET, POST
  • URL : 요청 주소

‣ @RequestMapping

  • 요청 URL요청 메소드를 인식할 수 있는 Annotation
  • 요청 메소드에 따라서 @GetMapping, @PostMapping 등으로 변경할 수 있음
    (스프링 버전4 부터 적용)

• @RequestMapping 주요 기능

구분예시의미
value@RequestMapping(value="/")"/" 요청
@RequestMapping(value={"/", "index"}) "/"와 "index" 요청
@RequestMapping(value="/member/*.do") "/member" 로 시작하고 ".do"로 끝나는 요청
method@RequestMapping(method=RequestMethod.GET) GET 방식(조회)
@RequestMapping(method=RequestMethod.POST) POST 방식(삽입)
@RequestMapping(method=RequestMethod.PUT) PUT 방식(수정)
@RequestMapping(method=RequestMethod.DELETE)DELETE 방식(삭제)
content type@RequestMapping(consumes="application/json")요청 컨텐트가 JSON임
@RequestMapping(produces="application/json") 응답 컨텐트가 JSON임

‣ web.xml의 기본 URL Pattern

  • 기본 Pattern컨텍스트 패스(Context Path)로 되어 있음
  • 다른 Pattern으로 수정하면 전체 URL다르게 설정

• @RequestMapping(value="members") 처리 방식

컨텍스트 패스<url-pattern>전체 URL
app/http://localhost:8080/app/members
/home/*http://localhost:8080/app/home/members

‣ Encoding Filter

  • web.xmlCharacterEncodingFilter추가
  • request.setCharacterEncoding("UTF-8")을 대체할 수 있는 필터
  • <filter-name>은 동일해야 한다.
  • <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> : 스프링에서 만들어놓은 Char Encoding 필터

‣ Model 인터페이스

  • 뷰가 응답 화면을 구성할 때 필요로하는 데이터전달하는 인터페이스이다.
    (Spring에서 forward할 정보를 저장하는 곳)
  • jsp로 값을 전달할 때 사용한다.
    (JSP/Servlet에서는 request를 이용해서 데이터를 전달하였으나, 스프링에서는 model을 이용하여 데이터를 전달)

메소드

  • addAttribute : Model속성추가하는 메소드
    (Model Attribute를 사용해서 forward하는 정보를 Model에 저장하는 것이 권고사항이나,
    실제 내부 로직(동작)은 request를 이용해서 attribute가 저장된다.)

• @ModelAttribute

  • 커맨드 객체model로 전달할 때 이름을 변경하고자 하는 경우에 사용
  • @ModelAttribute에서 지정한 이름으로 뷰까지 전달함

‣ 요청 파라미터


• 스프링의 요청 파라미터 처리 방식

  • HttpServletRequestgetParameter() 메소드
  • @RequestParam 애너테이션
  • 커맨드 객체

• HttpServletRequest

  • Java EE 표준 방식이다. (사용 권장)
  • 요청처리하는 HttpServletRequest 인터페이스이다.
  • 파라미터로 전달된 값을 getParameter() 메소드를 이용해서 처리한다.
  • 파라미터뿐만 아니라 HttpSession session, String contextPath 와 같은 정보도 꺼낼 수 있으므로 여전히 강력한 도구이다.
    (요청 ip등 많은것을 알 수 있는 방식)

• @RequestParam

  • 파라미터를 인식하고 변수에 저장하는 애너테이션
  • 파라미터의 개수가 적은 경우유용
  • @RequestParam 애너테이션을 생략하고 변수명만 작성할 수 있음
@RequestParam(value="blogNo") int blogNo  == int blogNo

주요 메소드

  • value : 요청 파라미터의 이름 작성
  • required : 요청 파라미터의 필수 여부 지정
    (디폴트 true - 요청 파라미터가 없으면 오류(500번대) 발생)
  • defaultValue : 요청 파라미터가 없는 경우사용문자열 기본값

• 커맨드 객체

  • 요청 파라미터필드로 가지고 있는 객체를 커맨드 객체라고 한다.
  • 요청 파라미터필드저장할 때 Setter가 사용된다.
  • 요청 파라미터가 많은 경우유용하다. (insert 등)
  • 커맨드 객체는 자동으로 Model저장된다.
    • 저장될 때 객체명이 아닌 클래스명으로 저장된다.
      (클래스명을 LowerCamelCase바꿔서 저장한다.)
  • 별도로 model.addAttribute()처리필요없음

‣ Session


• SessionAttributes

  • @SessionAttributes()
  • 클래스 레벨 애너테이션
  • 지정한 이름과 동일한 이름을 HttpSession저장한다.
  • {}로 여러 값(value)의 저장이 가능하다.

• 세션에 저장하기


@SessionAttributes("title")  // Model에 title이 저장되면 HttpSession에도 같은 값을 저장한다. {}로 여러 값(value)의 저장이 가능하다.
@Controller
public class MyController04 {
  • HttpServletRequest로부터 HttpSession 얻기
  @GetMapping("/article/add.do")
  public String articleAdd(HttpServletRequest request) {
   
    // ViewResolver의 prefix : /WEB-INF/views/
    // ViewResolver의 suffix : .jsp
   
    HttpSession session = request.getSession();                    // Java EE 표준방식으로 session 정보 얻기
    session.setAttribute("title", request.getParameter("title"));  // session에 정보 저장 (session에 저장한 정보는 브라우저가 열려있는 상태에서 모든 jsp에서 확인 가능하다.)
   
    return "article/result"; // /WEB-INF/views/article/result.jsp
  }
  • HttpSession 선언하기
  @GetMapping("/article/add.do")
  public String add2(HttpSession session, HttpServletRequest request) {  // 선언 순서는 상관 없다.
    session.setAttribute("title", request.getParameter("title"));
    return "article/result";
  }
  • @SessionAttributes 예제
    • 클래스 레벨의 annotation이다.
    • Model에 값을 저장하면 HttpSession함께 저장된다.
  @GetMapping("/article/add.do")
  public String add3(HttpServletRequest request, Model model) {
    model.addAttribute("title", request.getParameter("title"));
    return "article/result";
  }

• 세션 정보 삭제하기


  • HttpSession의 invalidate() 메소드
  @GetMapping("/article/main.do")
  public String main(HttpSession session) {
   
    // session 정보 초기화
    session.invalidate();  // 세션 무효화 (Java 웹 표준 방식)
   
    return "index";        // main화면으로 돌아가기
  }
  • SessionStatus의 setComplet() 메소드
  @GetMapping("/article/main.do")
  public String main2(SessionStatus sessionStatus) {
   
    // session attribute의 삭제
    sessionStatus.setComplete();  // Spring에서 지원
    return "index";
  }

• 세션 정보 확인하기


  • HttpSession의 getAttribute() 메소드
  @GetMapping("/article/confirm.do")
  public String confirm(HttpSession session) {
   
    String title = (String)session.getAttribute("title");  // Java 웹 표준 방식
    System.out.println(title);
    return "index";
  }
  • @SessionAttribute
  @GetMapping("/article/confirm.do")
  public String confirm2(@SessionAttribute("title") String title) {  // session에 저장된 "title" 속성을 String title에 저장한다.
    System.out.println(title);
    return "index";
  }

‣ Redirect

  • 컨트롤러반환값"redirect:"으로 시작하면 리다이렉트로 이동함
  • response.sendRedirect()대체하는 스프링의 방식
  • "redirect:" 에는 새로운 요청 URL이 오기 때문에 특정 URLMapping값작성해야 함
    (뷰이름을 작성하는 것이 아님!)

• Redirect 하는 방법

  • return "redirect:이동경로";
public String add(){
	return "redirect:/list.do";
}
  • location.href='이동경로';
public void add(HttpServletResponse response){
	PrintWriter out = response.getWriter();
	out.println("<script>");
	out.println("location.href='이동경로'");
	out.println("</script>");
}

redirect 이동경로

  • 반드시 URLMapping 값작성한다.
  • 이동할 JSP 경로작성할 수 없다.

• 응답

  • forwardModel에 값을 저장해서 전달한다.
    • forwardaddAttribute
  • redirectredirectAttributes로 값을 전달할 수 있다.
    • redirectaddFlashAttribute (주의❕)
저장방식
selectModel 사용forward
insert / update / deleteRedirectAttributes 사용redirect

짚어보기

  • base-package 경로가 올바르게 되는지 확인❗중요❗
  • RESTful : 메소드에 따라 구분하는 방식
  • forwordjsp로 이동
  • redirectmapping(주소)로 이동
  • redirectModel의 전달이 없음(원래 없음)


profile
개발이 세상에서 제일 재밌어요

0개의 댓글