Spring

[SpringBoot] RequestMapping

shb 2022. 5. 12. 15:59

@Controller ~ @RequestMapping
RequestMapping

 

웹 어플리케이션은 원하는 형태의 request URL을 받아서

URL을 처리하는 동작(handler)를 찾아서 (mapping) 수행하고
원하는 ‘뷰’ 로 response 해주기

 

용어: 메소드? 핸들러? 컨트롤러?
@Controller 클래스 안의 @RequestMapping 등으로 지정된 메소드를 핸들러(Handler) 라고도 함.
그러나, 보통 혼용되어 이야기 됨.
컨트롤러 이야기 할때 메소드, 핸들러, 컨트롤러…   ←  대체로 같은것을 지칭하는 것

 

* 기본적인 Controller 클래스 제작 흐름
@Controller를 이용한 클래스 생성
                     ↓
             요청 경로 지정
@RequestMapping, @GetMapping …. - 다양한 방법의 '경로지정'
                     ↓
요청 처리 메소드 (handler) 구현 - 다양한 방법의 매개변수 지정
                     ↓
“뷰 이름”  혹은 ModelAndView 리턴

 

URL mapping ↔  메소드 이름 ↔ 뷰이름
HomeController.java에  핸들러 메소드 작성
URL mapping , handler(메소드) 이름, 뷰 이름 리턴값  ← 굳이 같을 필요는 없다.

 

BoardController.java

package com.lec.spring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/board")
public class BoardController {
	
		
	@RequestMapping("/list")   // request -->  /board/list
	public String listBoard() {
		return "board/list_board";
	}
	
	@RequestMapping("/write")
	public String writeBoard() {
		return "board/write_board";
	}

	
	@RequestMapping("/view")  // request --> /board/view
	public String viewBoard() {
		return "board/view_board";
	}
	
	@RequestMapping("/update")
	public String updateBoard() {
		return "board/update_board";
	}
	
	@RequestMapping("/delete")
	public String deleteBoard() {
		return "board/delete_board";
	}
	
} // end Controller

MemberController.java

package com.lec.spring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping(value = "/member")    // -> /member 로 시작하는 request 를 처리
public class MemberController {

	
	@RequestMapping(value = "/save")  //  URL ->  /member + /save
	public String saveMember() {      //         =>  /member/save
		return "member/save";
	}
	
	@RequestMapping(value = "/load")
	public String loadMember() {
		return "member/load";        //         => /member/load
	}
	
	// 서버 가동중 에러 발생!
	// mapping url 중복.
//	@RequestMapping(value = "/search")
//	public String searchMember() {
//		return "member/search";      //        => /member/search          
//	}
	
	
	// 핸들러 리턴값이 void 이면
	// mapping 되는 url문자열에 해당하는 .jsp 파일로 forwarding 된다
	// (일반적으로 많이 사용)
	@RequestMapping("/remove")
	public void removeMember() {     //  URL =>  /member/remove
		                             //  JSP =>  /member/remove.jsp
	}
	
	
}

‘뷰’ 에 데이터 전달 : Model 매개변수
Model은 매개변수로 넘겨진다.  ‘스프링 쪽’에서 넘겨주는 것이다.  

핸들러 메소드는 Model 에 담기만 하면, 스프링이 DispatcherServlet에 넘겨준다.

향후 트랜잭션들을 수행한 결과를 model 에 담아서 뷰에 넘길수 있다.

 

‘뷰’ + ‘Model’  : ModelAndView 리턴
ModelAndView 에는 데이터들도 담고 ‘뷰’ 도 지정하고 그리고 리턴되면 OK

 

확장자 패턴 가능  *
@RequestMapping(value = "/member/*.do")
public String doMember() {
return "member/domember";
}

 

* 핸들러 메소드 동작
1. @RequestMapping 으로 매핑된 request가 들어오면
2. 필요한 동작들(ex: 트랜잭션) 수행,  DAO 혹은 @Service 등의 객체 사용
3. 결과는 Model에 담고, 뷰(View) 지정  ⇒ 합해서 ModelAndView 로 담아 리턴 가능

 

컨트롤러 클래스에 @RequestMapping !
일반적으로 request URL 체계도,  다루는 아이템별로 다루게 되는데…
가령 
회원관리 URL 형태는 /member/○○○
상품관리 URL 형태는 /goods/○○○

이런식으로 request URL 이 기획되어 관리될 것이다.
그런데, 과연 이 모든 handler 가 하나의 @Controller 클래스에 있으면 체계적인 관리가 힘들다. 

 

컨트롤러 클래스 작성
패키지 : {base-package}.controller
클래스명 : MemberController

 

@Controller 클래스 추가하면, 반드시 서버 재시작 
DevTool 사용시는 굳이 할필요 없음

 

만약  @RequestMapping 중복되면?
애시당초 서버 가동 중에  Exception 발생한다
/member/search로 request 해보자

'Spring' 카테고리의 다른 글

[Spring Boot] Validation  (0) 2022.05.12
[SpringBoot] Request Parameter  (0) 2022.05.12
[SpringBoot] MVC  (0) 2022.05.12
[SpringBoot] Dependency Injection 의존주입  (0) 2022.05.12
[Spring] Spring이란  (0) 2022.05.11