Spring | MVC 구조와 동작원리, Controller, @RequestMapping

brightbell·2023년 9월 26일

Spring

목록 보기
6/12

Spring MVC Project의 기본 구조

Spring MVC 동작원리

Controller

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

@RequestMapping
요청 URL 과 요청 메소드를 인식할 수 있는 Annotation
요청 메소드에 따라서 @GetMapping, @PostMapping 등으로 변경할 수 있음(spring 4 이상)

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 방식(삭제)

contenttype
@RequestMapping(consumes="application/json") 요청 컨텐트가 JSON 임
@RequestMapping(produces="application/json") 응답 컨텐트가 JSON 임

@Controller  // 컨트롤러를 만드는 Annotation
public class MyController01 {

  /*
   * 요청/응답을 처리할 메소드를 만든다.
   * 1. 반환타입
   *  1) String : 응답할 Jsp의 이름을 반환한다.
   *  2) void   : 컨트롤러가 호출한 서비스에서 직접 응답한다. 요청 주소를 Jsp 이름으로 인식한다.
   *  3) 기타   : 비동기 통신에서 데이터를 응답한다.
   * 2. 메소드명
   *  - 아무 일도 안 한다.(임의로 작성가능)
   * 3. 매개변수
   *  1) HttpServletRequest를 선언해서 사용할 수 있다.
   *  2) HttpServletResponse를 선언해서 사용할 수 있다.
   *  3) Model을 선언해서 forward할 정보를 저장할 수 있다.
   *  4) HttpSession을 선언해서 사용할 수 있다.   
   * 4. 요청(@RequestMapping)
   *  1) 메소드 : GET, POST
   *  2) URL    : 요청 주소 
   */

  // value="/"  : contextPath 요청을 의미한다. http://localhost/app03/ 주소를 의미한다.
  @RequestMapping(value = {"/", "/index.do"} method = RequestMethod.GET)
  public String welcome() {
    // ViewResolver의 prefix : /WEB-INF/views/
    // ViewResolver의 suffix : .jsp
    return "index";
  }
}

spring 설정 정보가 들어있는 servlet-context.xml

    <!-- 
      <resources> 태그(추가,변경가능)
      정적 자원(css, js, image 등)의 경로와 주소를 관리하는 태그
      mapping="/resources/**"   : 주소(URL)가 /resources로 시작하는 경우
      location="/resources/"    : /resources/ 디렉터리로 연결하시오.
    -->
    <resources mapping="/resources/**" location="/resources/" />
	<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를 통해 views/모든 jsp에 대한 요청 Mapping이 처리된다.
이로인해 views/.jsp 요청에서 파일명만 return 하게 된다.
정확히는 HandlerAdapter 에 의해서 반환된 ModelAndView 객체에 저장된 뷰 정보를 처리함

아래의 경우에서

                            // 요청 주소
  @RequestMapping(value = "/board/list.do", method = RequestMethod.GET)
  public String boardList() {
    // ViewResolver의 prefix : /WEB-INF/views/
    // ViewResolver의 suffix : .jsp
    return "board/list";  //   /WEB-INF/views/board/list.jsp
            // jsp 경로
  }

실제 프로젝트 구조에서의 위치는 그림과 같다.

외부에서 구조를 파악하기 어렵게 하기 위해서 요청 주소를 a/b/c/d/list.do처럼 꼬아놓는 경우도 있다.


Spring 4 버전 이후 사용 가능한 @RequestMapping
1. @GetMapping : @RequestMapping(method = RequestMethod.GET) 을 생략할 수 있다.
2. @PostMapping : @RequestMapping(method = RequestMethod.POST)을 생략할 수 있다.

@Controller
public class MyController02 {
  
  // @PostMapping(value = "/board/list.do")과 다른 요청이다.
  @GetMapping(value = "/board/list.do")
  public String boardList() {
    // ViewResolver의 prefix : /WEB-INF/views/
    // ViewResolver의 suffix : .jsp    
    return "board/list";    // /WEB-INF/views/board/list.jsp
  }

반환이 없는 경우에는 요청 주소를 Jsp 경로로 인식한다.
/member/list.do 요청을 /member/list.jsp 경로로 인식한다.(.do가 생략되도 같은 결과)

 @GetMapping(value = "/member/list.do")
  public void memberList() {
  	// 본문없음
  }
}

0개의 댓글