Spring - 14. MVC mapping

DispatcherServlet은 웹 요청을 받는 즉시 @Controller가 달린 컨트롤러 클래스에 처리를 위임

그 과정은 컨트롤러 클래스의 핸들러 메소드에 선언 된 다양한 @RequestMapping 설정 내용에 따름

 

매핑 실습에 사용되는 애너테이션은 총 3개입니다.

1. @RequestMapping(value="매핑할 이름", method="요청 타입") : get,post 설정하여 받을수있음

2. @GetMapping("매핑할 이름") : get요청만 받을수있음

3. @PostMapping("매핑할 이름") : post 요청만 받을수 있음

 

2,3 번 애너테이션은 핸들러 메소드를 조금 더 간결하게 코딩할수 있게 해줍니다.

 

 

아래는 실습입니다.

1. '/' 요청시 메인화면 으로 이동하기

MainController.java

package com.memory.mapping;

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

@Controller
public class MainController {

	@RequestMapping({"/", "/main"})
	public String main() {
		return "main";
	}
	
	
}

위의 소스설명은

매핑명을 "/" 또는 "/main" 으로 요청하게 처리하였습니다.

만약 요청이들어오면 main을 return 한다고 나오는데 이부분은 

servlet-context.xml 파일에 설정되어있어서 그렇습니다.

이부분이 처리를 해주는데 

풀어보면 /WEB-INF/views/main.jsp 

이렇게 됩니다. 

 

정삭적으로 요청이 되었다면 아래의 페이지로 이동하게됩니다.

 

get, post 요청명을 나누어 메소드 매핑으로 요청하기

에서 버튼을클릭시 get 혹은 post 요청을 하게됩니다.

이걸 Controller에서 어떻게 요청을받아들일지 작성합니다.

 

MenuMethodController.java

package com.memory.mapping;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class MenuMethodController {
	// 1. GET : /menu/insert
		@RequestMapping(value="/menu/insert", method=RequestMethod.GET)
		public String getInsert(Model model) {
			String message = "GET : /menu/insert 으로 전송되었습니다.";
			
			model.addAttribute("message", message);
			return "messageResult";
		}
		
		// 2. POST : /menu/insert
		@RequestMapping(value="/menu/insert", method=RequestMethod.POST)
		public String postInsert(Model model) {
			String message = "POST : /menu/insert 으로 전송되었습니다.";
			
			model.addAttribute("message", message);
			return "messageResult";
		}
		
		// 3. GET : /menu/update (애너테이션 요청)
		@GetMapping("/menu/update")
		public String getUpdate(Model model) {
			String message = "GET : /menu/update 으로 전송되었습니다.";
			
			model.addAttribute("message", message);
			return "messageResult";
		}
		
		// 3. POST : /menu/update (애너테이션 요청)
		@PostMapping("/menu/update")
		public String postUpdate(Model model) {
			String message = "POST : /menu/update 으로 전송되었습니다.";
			
			model.addAttribute("message", message);
			return "messageResult";
		}
}

1. @RequestMapping(value="/menu/insert", method=RequestMethod.GET) 으로 애너테이션을 작성하였습니다

이뜻을 풀이 하자면 get방식으로 /menu/insert으로 요청이오면 아래의 메소드를 실행하라는 뜻입니다.

그리고 메소드 설명은 message의 값을 전달하라는뜻입니다.

서블릿좀 배웠거나하면  request.setAttribute("message", message) 와같은기능이고

return 부분은 포워딩처리하는거랑 비슷한 작동을 한다고 보면될것같습니다.

2. 1번과 기능은 비슷하고 post 방식은 처리합니다.

 

3,4. @GetMapping, @PostMapping

1,2,번과 같은기능이지만 애너테이션으로 직관적으로 이 메소드는 get방식만받는다 post방식만 받는다라고 

알수있고, 좀더 간결하게 처리가가능하여 많이사용된다.

간단하게 @GetMapping(*요청명), @PostMapping("요청명") 으로 작성이 가능합니다.

 

get, post 요청명을 나누어 클래스 매핑으로 요청하기

클래스 매핑은 매소드매핑과 사용방법이 동일합니다.

클래스에 URL의 공통 부분을 이용해 설정하고 나면 매번 핸들러 메소드에 URL의 중복 되는 내용을 작성하지 않아도되고 와일드 카드를 이용해서 조금더 포괄적인 URL 패턴을 설정할 수 있습니다.

 

한마디로 위의 메소드방식에는 메소드 매핑마다 /menu/ ?? 가들어갔는데

/menu/를 클래스 매핑에 설정해두고 

insert, update, delete 중복되지않는부분을 메소드 매핑에 작성하면 좀더 간결하게 코드를 작성할수 있습니다.

 

@RequestMapping, @GetMapping, @PostMapping 의 사용법은 메소드 매핑과 같습니다.

 

MenuClassController.java

package com.memory.mapping;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
@RequestMapping("/menu/*")
public class MenuClassController {

	@RequestMapping(value="/modify", method=RequestMethod.GET)
	public String getModify(Model model) {
		String message = "GET : /modify 으로 요청하였습니다.";
		
		model.addAttribute("message", message);
		return "messageResult";
	}
	
	@RequestMapping(value="/modify", method=RequestMethod.POST)
	public String postModify(Model model) {
		String message = "POST : /modify 으로 요청하였습니다.";
		
		model.addAttribute("message", message);
		return "messageResult";
	}
	
	@GetMapping("/delete")
	public String getDelete(Model model) {
		String message = "GET : /modify 으로 요청하였습니다.";
		
		model.addAttribute("message", message);
		return "messageResult";
	}
	
	@PostMapping("/delete")
	public String postDelete(Model model) {
		String message = "GET : /modify 으로 요청하였습니다.";
		
		model.addAttribute("message", message);
		return "messageResult";	
	}
	
}

 

후기

스프링을 사용하면할수록 뭔가좀 복잡한거같지만 

결론은 서블릿만 썻을때와 다르게 코드가 많이 줄어든다는것을 깨닳고있습니다.

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유