개발자 미니민의 개발스터디

[spring] 컨트롤러 및 맵핑 (Controller, RequestMapping)

by mini_min
[spring] 컨트롤러 및 맵핑 (Controller, RequestMapping)

✔️ @Controller

대표적인 스트레어 타입 애노테이션

요청을 받으려면 무~조~건 컨트롤러 있어야함

: 컨트롤러의 역할을 한다고 명시한다.

컨트롤러는 필요한 비즈니스 로직을 호출하여 처리 결과 (model) 과 처리 결과를 출력할 view 정보를 DispatcherServlet 에 반환한다. 

: 빈으로 등록한다.

: @Component 의 구체화된 애노테이션으로 클래스에 붙인다.

: 빈 이름을 지정하지 않으면, 클래스의 첫 문자를 소문자로 바꾼것이 빈의 이름으로 빈을 등록한다. 

✨ 빈이름이 중복적이면 에러가 발생한다.

 

 

✔️ @RequestMapping

: 요청에 대해 어떤 Controller, 어떤 메소드가 처리할지를 매핑하기 위한 애노테이션이다.

url 을 클래스 또는 메소드와 맵핑 시켜주는 역할을 한다.

: 모든 HTTP Request method 를 매핑할 수 있다.

: 따로 HTTP Method 를 설정하지 않으면 모든 메소드를 허용한다.

: Ant 스타일의 패턴을 지원한다. (? : 1개의 문자와 매칭, * : 0개 이상의 문자와 매칭 등)

: 상위 클래스에서 정의되어 있는 경우, 하위 클래스에서 재정의하지 않으면 상위 클래스 것을 그대로 상속한다. 

✨ value 속성만 있으면 생략 가능하다.

✨ name 속성은 이름을 말하며, 주소가 아니다. 이름=주소 아님!!

 

📓 옵션

value = URL 값으로 매핑 조건을 부여한다.

method = HTTP Request 메소드 값을 매핑 조건으로 부여

params = HTTP Request 파라미터를 매핑 조건으로 부여

name = 매핑에 이름을 지정한다.

 

 

✔️ 컨트롤러 메소드의 리턴 타입 - ModelAndView 객체

: 처리 결과를 담은 model 객체와 View 정보를 해당 객체에 담아 반환한다.

해당 클래스는 컨트롤러의 처리 결과를 보여줄 뷰와 전달 값을 저장하는 용도로 사용한다. 

(String viewName) 을 쓰면 view 이름을 설정하여 객체를 생성한다. 

 

📓 주요 메소드

addObject() : 뷰에 전달할 값(모델) 설정

addAllObject() : 모델map 에 추가된 모든 속성을 모델로 설정

 

 

✔️ 컨트롤러 메소드의 리턴 타입 - String, Model 등

1) String

뷰의 이름을 반환한다.

 

2) Model, ModelMap

처리 결과를 Model 객체에 담아 반환한다. 

모델은 인터페이스이며, ModelMap 은 클래스로 사용방법은 유사하다.

URL 이 "/hello/main" 인 경우 뷰의 이름은 "hello/main" 이 된다.

 

3) void

메소드의 인수로 HttpServletResponse 파라미터가 존재하지 않는 경우

 

4) Map

처리 결과를 Map 객체에 담아 반환한다. 

 

5) view

View 객체를 직접 반환한다. 해당 뷰 객체를 이용하여 뷰를 생성한다. 

 


👩‍💻 ex01 예제

✨ Controller 의 빈 이름은 클래스의 첫문자만 소문자로 바꾼 "userController"

리턴타입 String인 경우 리턴값은 뷰의 이름이 된다.

✨ model 객체 : 인자 가로속에 Model model 인자 넣으면 알아서 객체 넘겨줘서 new 생성 안해도 괜찮음

@Controller		//빈이름 - userController
public class UserController {
	@RequestMapping("/ex01/main") //get과 post 방식 모두 처리
	public String main() {
		return "ex01/main"; //포워딩과 동일하다. 리턴타입 String인 경우 리턴값은 뷰의 이름이 된다.
	}
	
	//GET 방식만 처리~ 
	@RequestMapping(value="/ex01/request", method= RequestMethod.GET)
	public ModelAndView submit1(String name, int age) {
										//포워딩해야하는 jsp 이름
		ModelAndView mav = new ModelAndView("ex01/main");
		String s = "<p>GET 방식으로 접근</p>";
		String a = "<p>이름: " + name + ", 나이 : " + age + "</p>";
		
		
			//req.setAttribute("이름", 값) 역할!
			//req 는 톰캣에 의존. 아래는 자바기반
		mav.addObject("msg", s);
		mav.addObject("result", a);
		
		return mav;
	}
	
	//POST 방식만 처리 - 메소드가 위에 꺼랑 다르니까 주소 동일해도 괜찮음
	@RequestMapping(value="/ex01/request", method= RequestMethod.POST)
	public String submit2(User dto, Model model) {
		
		String s = "<p>POST 방식으로 접근</p>";
		String a = dto.getAge() >= 19? "성인" : "미성년자";
		
			//req.setAttribute("이름", 값) 역할!
			//가로속에 Model model 인자 넣으면 알아서 객체 넘겨줘서 new 생성 안해도 괜찮음
		model.addAttribute("msg", s);
		model.addAttribute("result", a);
		model.addAttribute("dto", dto);
		
		return "ex01/main";
	}
	
	
}

 

👩‍💻 ex02 예제

✨ 이름이 같은 빈 객체가 있으면, 앞에 패키지명 붙이면 구분이 쉽다 . @Controller("ex02.userController")

@Controller("ex02.userController")
@RequestMapping("/ex02/*")
public class UserController {
	
	//@RequestMapping(value="request", method = RequestMethod.GET)
	@GetMapping("request")
	public ModelAndView form() {
		return new ModelAndView("ex02/write"); //포워딩
	}
	
	//@RequestMapping(value="request", method = RequestMethod.POST)
	@PostMapping("request")
	public ModelAndView submit(String num) { //int num도 가능
		ModelAndView mav = new ModelAndView();
		
		String result = "";
		try {
			int n = Integer.parseInt(num);
			int s = 0;
			for(int i=1; i<=n; i++) {
				s += i;
			}
			
			result = "1~" + num + "까지의 합 : " + s;
			
			
		} catch (Exception e) {
			return new ModelAndView("redirect:/ex02/error"); //리다이렉트
		}
		
		mav.setViewName("ex02/result"); //뷰 이름 (jsp이름)
		mav.addObject("msg", result);
		
		return mav;
		
	}
	
	@RequestMapping("error")
	public ModelAndView error() {
		return new ModelAndView("ex02/error");
	}
	
}

 

👩‍💻 ex03 예제

✨ Map 객체로 반환하기

✨ Model 인터페이스를 리턴 타입으로 반환

✨ req.setAttribute()를 이용하여 값 전달

@Controller("ex03.userController")
@RequestMapping("ex03/*")
public class UserController {
	@RequestMapping("main")
	public String main() {
		return "ex03/hello";
	}
	
	@RequestMapping("hello")
	public void hello1(HttpServletResponse res) throws Exception {
		res.setContentType("text/html; charset=utf-8");
		
		PrintWriter out = res.getWriter();
		out.print("<html><body>");
		out.print("void 리턴 타입");
		out.print("</body></html>");
		
	}
	
	@RequestMapping("hello2")
	public Map<String, Object> hello2(){
		Map<String, Object> map = new HashMap<String, Object>();
		
		map.put("msg", "Map 인터페이스를 리턴 타입으로 반환");
		
		//뷰의 이름은 url 이 "/ex03/hello2" 이므로 "ex03/hello2"
		
		return map;
	}
	
	@RequestMapping("hello3")
	public Model result() {
		Model model = new ExtendedModelMap();
		
		//뷰의 이름은 url 이 "/ex03/hello3" 이므로 "ex03/hello3"
		
		model.addAttribute("msg", "Model 인터페이스를 리턴 타입으로 반환");
		return model;
	}
	
	@RequestMapping("hello4")
	public String test(HttpServletRequest req, HttpSession session) throws Exception {
		
		req.setAttribute("msg", "req.setAttribute()를 이용하여 값 전달");
		session.setAttribute("info", "session 값");
		
		return "ex03/hello4";
	}
	
	
	
	
}

 

 

 

'Spring' 카테고리의 다른 글

[spring] RequestParam  (0) 2022.11.14
[spring] REST 개념  (0) 2022.11.14
[spring] MVC 패턴 설정  (0) 2022.11.10
[spring] AOP 란?  (0) 2022.11.09
[spring] 자바 기반 Bean 설정 Configuration  (0) 2022.11.09

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기