Spring

Spring MVC. @RestController. @GetMapping @PostMapping @ReQuestMapping.

wintertreey 2024. 7. 16. 20:26

spring mvc 아키택쳐

 

①  웹브라우저에게 정보요청을 받은 디스패쳐서블릿은 어느 컨트롤러에 해당 요청을 전송할지 결정 

디스패쳐 서블릿핸들러 매핑에 어느 컨트롤러를 사용할건지 물어봄. (URL로 링크)

③ 결정된 컨트롤러는 해당요청을 수행하게 됨

④ 해당요청을 처리한 컨트롤러는 디스패쳐서블릿에 결과를 보냄. 이 과정에서 ModelandView 가 생성된다.

 

⑤ ModelAndView는 실제 JSP정보를 갖고 있지 않기 때문에 ViewResolver가 실제 JSP이름으로 변환하여 해당 view를 검색함.

⑥ 검색한 결과를 View에 전송

⑦ View는 모든 과정에서 처리된 결과를 화면으로 표현함

 

마지막으로 디스패쳐서블릿이 웹브라우저에 최종결과를 출력.

 

 

++ 동료 HS님께서 의문을 가지셨던 ModelAndView.

ModelandView란?


[Model]
MVC(Model-View-Controller) 아키텍처에서의 Model은 애플리케이션의 비즈니스 로직과 데이터를 나타내는 부분입니다.
Model은 보통 데이터베이스에서 데이터를 가져오거나, 데이터를 처리하는 메소드들을 포함합니다.
데이터베이스 쿼리, 데이터 처리 로직, 데이터 변경 및 유효성 검사 등을 수행합니다.
Controller는 Model에게 데이터를 요청하고, 받아온 데이터를 View에 전달합니다.

[ModelAndView의 Model]
ModelAndView는 Spring Framework에서 사용되는 클래스로, Controller가 처리한 데이터와 뷰의 이름을 함께 담고 있습니다.
ModelAndView 객체는 보통 Controller에서 View와 함께 클라이언트에게 반환됩니다.
ModelAndView는 데이터와 View의 정보를 담기 위해 사용되며, 이때의 Model 부분은 실제 데이터를 의미합니다.
즉, ModelAndView의 Model은 화면에 출력될 데이터를 저장하는 컨테이너 역할을 합니다.

요약
- Model은 MVC 아키텍처에서 비즈니스 로직과 데이터를 처리하는 부분을 의미하며, 주로 Controller와 함께 데이터를 처리하고 View에 전달합니다.
- ModelAndView의 Model은 Controller가 처리한 데이터를 담는 컨테이너 역할을 하며, 이 데이터는 실제로 View에서 사용되어 클라이언트에게 표시됩니다.

 


 

static에 html만들기. 이때 templates에는 안됨.

클라이언트를 통해 부를수없다. 외부에서 호출불가. 

전에 공부한 web-inf 랑 같다고 보면됨.

 

run as 해주고 

웹url상에 localhost:8080/까지만 적어도 해당 파일 불러서 띄워줌.

 

 

포트번호 바꾸기.

참고 : port 번호 변경 또는 충돌 시 resources/application.properites 파일에서 port 번호 수정 예

server.port = 80     번호는 임의적 1025 ~ 65535

 

소스를 보면 html을 리턴한게 아니라 글자만을 리턴햇음을 알수있다. 

 

 

 

참고 : 출력 결과를 jsp 파일로 출력하기 위한 환경 설정 : View page 생성하기

pom.xml 변경 : 아래와 같이 dependency(라이브러리) 추가

<!-- jsp  -->

<dependency>

           <groupId>javax.servlet</groupId>

           <artifactId>jstl</artifactId>

           <version>1.2</version>   

</dependency>

<dependency>

           <groupId>org.apache.tomcat.embed</groupId>

           <artifactId>tomcat-embed-jasper</artifactId>

</dependency>

 

 

@RestController, @Controller 

@RestController
public class TestController {
	@RequestMapping("test1")
	public String abc() { //test1 요청이 들어오면 abc를 수행해. 디스패처 서블릿이 핸들러매핑에게 시킴.
		return " 요청에 대한 반응 보이기 ";
	}
}

@Controller
public class TestController {
	@RequestMapping("test1") // get, post 모두 처리.
	public ModelAndView abc() {
		
//		System.out.println("abc 처리");
//		return null;
		// return new ModelAndView("list", "msg", "hihi jsp");
		

		ModelAndView modelAndView = new ModelAndView();
		modelAndView.setViewName("list");
		modelAndView.addObject("msg", "gogogo jsp");
		return modelAndView;
	}

 

@RestController란?

Restful Web Service에서 사용되는 컨트롤러 어노테이션.

@Controller + @ResponseBody가 합쳐진 형태로 JSON 형태의 객체 데이터를 반환해준다.

 

test1 요청이 들어오면 abc를 수행해. 디스패처 서블릿이 핸들러매핑에게 시킴.

 

@Controller란?

사용자의 요청을 받아 처리한 후 지정된 뷰(템플릿 엔진:jsp..)에 모델객체를 넘겨주는 역할.

 test1 요청이 들어오면 abc를 수행해, 디스패처 서블릿이 핸들러매핑에게 시킴.

디스패처 서블릿으로부터 위임받은 핸들러 매핑이 @RequestMapping을 찾아감.

 

return new ModelAndView("list", "msg", "hihi jsp");

모델엔뷰를 반환. "list" : 뷰파일명.

결과는 ${msg} > 여기서 그부분을 지칭

"hihi jsp": msg에 넣을 내용.

modelAndView.addObject("msg", "gogogo jsp");

equest.setAttribute("msg", "gogogo jsp");와 동일.

HttpSErvletRequest를 사용해 키, 값으로 jsp에 전송하는방식이라고 이해하면됨.

 

 

강제적 연결방법

 

 

 


 

요청방식(Get, Post)에 따른 컨트롤러 전달처리.

GET 방식

 

@RequestMapping(value = "test2", method = RequestMethod.GET) // get만 처리. 
	public ModelAndView abc2() {
		return new ModelAndView("list", "msg", "success2");
	}
	
	@GetMapping("test3") // get 요청 처리
	public ModelAndView abc3() { 
		return new ModelAndView("list", "msg", "success3");
	}
	
	@GetMapping("test4") // get 요청 처리
	public String abc4(Model model) { 
		model.addAttribute("msg", "success4");
		return "list";
	}
	// 3번과 동일. "list"는 문자열 list를 반환하는게아니라, 뷰파일 "list.jsp"를 반환하는것.

 

POST 방식

@RequestMapping(value = "test5", method = RequestMethod.POST) // post만 처리. 
	public ModelAndView abc5() {
		return new ModelAndView("list", "msg", "success5");
	}
	
	@PostMapping("test6") // post 요청 처리
	public ModelAndView abc6(Model model) { 
		return new ModelAndView("list", "msg", "success6");
	}
	
	@PostMapping("test7") // post 요청 처리
	public String abc7(Model model) { 
		model.addAttribute("msg", "success7");
		return "list";
	}
	// 6번과 동일

 

@ResponseBody

@GetMapping("test8")
	@ResponseBody
	public String abc8() { 
		String value = "일반데이터-String, Map, JSON 등을 전달가능";
		return value; // @ResponseBody: 문자열그대로 반환.
	}
	
	@GetMapping("test8_1")
	@ResponseBody
	public DataDto abc8_1() { 
		DataDto dto = new DataDto();
		dto.setCode(10);
		dto.setName("미스터톰");
		return dto; //@ResponseBody역할: JSON 형태로 반환(jackson라이브러리가 지원)
	}

 

 

 

 

두 메소드의 요청 value 값이 같을경우, 맨위로 올려주고 method부분만 적어준다.

 

 

여러개의 요청을 한개의 메소드와 매핑하는 방법도 있다. 

@GetMapping(value={"/java/good", "nice", "okk"})
	public String ghi2(Model model) {
		model.addAttribute("msg","여러개의 요청이 한개의 메소드와 매핑");
		return "list"; 
	}

 

 

라우팅이란?

@RequestMapping("/java/korea") 처럼 이런 식으로 경로를 설정해주는것.


 

매핑 

jsp의 경우, 해당 경로를 지정해준다. 

타임리프의 경우, 자동적으로 templates. 

 

쿼리스트링의 내용은 오직 서버사이드에서만 받을 수 있다. 클라이언트사이드에선 불가능.

 

JepumController.java

package pack.controller;

import org.springframework.beans.factory.annotation.Autowired;
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 pack.model.JepumModel;

@Controller
public class JepumController {
	@Autowired
	private JepumModel jepumModel;
	
	@GetMapping("insdata")
	public String method1() {
		return "redirect:input.html";
		
	}
	@PostMapping("insdata")
	public String method2(JepumBean bean, Model model) {
		model.addAttribute("data", jepumModel.computerPrice(bean));
		return "result";
		
	}
}

 

소소코드를 보면, 매핑방식만 다를뿐, ""안의 글자는 같다는것을 알수 있다.

어짜피 넘어오는 메소드방법이 다르기에 충돌이 일어나지 않는다.

 

제품 정보를 전달하고자, bean을 썼다.

 

LoginController.java

package pack.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.RequestParam;

import jakarta.servlet.http.HttpServletRequest;

@Controller
public class LoginController {
	//로그 정보 출력용 클래스 
	private final Logger logger = LoggerFactory.getLogger(this.getClass()); //현재클래스
	
	@GetMapping("login") 
	public String submitCall() {
		return "redirect:login.html";
	}

 

리다이랙트방식 

return"redirect:login.html";

redirect:http://localhost/login.html : 이게 오리지날 풀형식.

 

redirect는 클라이언트에게 새로운 URL로의 요청을 지시. 이 과정에서 클라이언트는 URL이 변경된다.

 

서버가 클라이언트에게 새로운 URL로 요청하라고 지시해준다.

클라이언트는 새로운 URL로 요청을 보내고, 그 URL에서 응답을 받게 된다. 

 

 

포워드방식

return "login.html"; 

forward는 서버 측에서 클라이언트의 요청을 다른 리소스(페이지)로 전달. 이 과정에서 클라이언트는 URL이 변경되지 않는다. 

서버가 클라이언트의 요청을 다른 서버의 리소스(예: JSP, HTML 페이지)로 전달해준다. 

클라이언트는 원래의 URL을 유지한 채 서버가 리소스를 가져와 응답.

 

 

 

 

로그인 링크를 누르면, login.html로 화면전환, 파일이동이 일어나게 하기 위해서, 리다이랙트형식을 사용.

 

LoginController.java

//클라이언트가 전달한 값 수신방법2: Spring 어노테이션 사용
	@PostMapping("login")
	public String submit(@RequestParam(value="id")String id, 
			@RequestParam(value="pwd", defaultValue="111")int pwd, //초기치주기. 값입력안하면 초기치로 값이 자동전달된다.
			Model model) { 
		
		String data = "";
		if(id.equals("sea") && pwd == 111)
			data = "로그인 성공";
		else
			data = "로그인 실패";
		model.addAttribute("data", data);
		return "result"; 
	}

 

pwd == 111.

앞에 폼에서도 텍스트타입에 number라고 했더라도 기본적으로 String으로 넘어온다.

 

 

 

로그인시도.

 

 

결과.

 

전체 소스코드는 깃허브 sprweb3,4,5를 참고하자. 

https://github.com/yoonah0327/spring_source.git

 

GitHub - yoonah0327/spring_source

Contribute to yoonah0327/spring_source development by creating an account on GitHub.

github.com

 


https://cafe.daum.net/flowlife/HrhB/20

 

Spring MVC 기본 이해

* Spring MVC 스프링 MVC 프레임워크는 스프링을 기반으로 하고 있기 때문에 스프링이 제공하는 트랜잭션 처리나 DI 및 AOP 적용 등을 손쉽게 사용할 수 있다는 장점이 있다. 1)  스프링 MVC의 주요

cafe.daum.net

https://m.blog.naver.com/dragoncastle11/222070148513

 

스프링 MVC 흐름 및 내용 정리

스프링 프레임워크를 왜 사용해야되고 공부해야 되는지 이유 JSP와 JavaBean만을 사용한 모델 : 개발...

blog.naver.com

https://velog.io/@alkwen0996/Spring-MVC-%ED%8C%A8%ED%84%B4%EC%9D%98-%ED%8A%B9%EC%A7%95%EA%B3%BC-%EC%9A%94%EC%B2%AD%ED%9D%90%EB%A6%84

 

[Spring] | MVC 패턴의 특징과 요청흐름

MVC(Model-View-Controller) Pattern > 어플리케이션의 구조를 Model, View, Controller 세가지 영역으로 분리한 개발 방법론을 말한다. 컴포넌트들의 변경이 다른 영역의 컴포넌트에 영향을 미치지 않고(유지보

velog.io