java,jsp,spring/Spring

Spring 기초 (5)

프루트 2022. 10. 11. 19:56

스프링 MVC(Model- View - Controller) 개요

  • 의미 : 사용자 인터페이스로부터 비지니스 로직을 분리하여 애플리케이션의 시각적 요소나 그 이면에서 실행되는 비지니스 로직을 서로 영향 없이 쉽게 고칠 수 있게 하기 위함
  • 모델 컴포넌트
    1. 데이터 저장소(ex:  데이터베이스 등)와 연동하여 사용자가 입력한 데이터나 사용자에게 출력할 데이터를 다루는 일은 함
    2. 여러 개의 데이터 변경 작업(추가, 변경, 삭제)을 하나의 작업으로 묶는 트랜잭션을 다루는 일도 함
    3. DAO클래스 Service 클래스에 해당
  • 뷰 컴포넌트
    1. 모델이 처리한 데이터나 그 작업 결과를 가지고 사용자에게 출력할 화면을 만드는 일을 함
    2. 생성된 화면은 웹 브라우저가 출력하고, 뷰 컴포넌트는 HTML/CSS/JS를 사용하여 웹 브라우저가 출력할 UI를 만듬
    3. HTML과 JSP를 사용하여 작성할 수 있음
  • 컨트롤러 컴포넌트
    1. 클라이언트의 요청을 받았을 때 그 요청에 대해 실제 업무를 수행하는 모델 컴포넌트를 호출하는 일을 함
    2. 클라이언트가 보낸 데이터가 있다면, 모델을 호출할 때 전달하기 쉽게 데이터를 적절히 가공하는 일을 함
    3. 모델이 업무 수행을 완료하면, 그 결과를 가지고 화면을 생성하도록 뷰에게 전달(클라이언트 요청에 대해 모델과 뷰를 결정하여 전달)
    4. Servlet 과 JSP를 사용하여 작성할 수 있음
  • 주요 구성 요소(주로 사용하는 클래스)
    • DispatcherServelt : 클라이언트의 요청을 받아서 Controller에게 클라이언트의 요청을 전달하고, 리턴한 결과값을 View에게 전달하여 알맞은 응답을 생성
    • Controller : 클라이언트의 요청을 처리한 뒤, Model를 호출하고 그 결과를 DispatcherServlet에게 알려줌
    • Model And View : Controller가 처리한 데이터 및 화면에 대한 정보를 보유한 객체
    • View : Controller의 처리 결과 화면에 대한 정보를 보유한 객체
    •  

  • 처리 과정
    1. 클라이언트의 요청이 Dispatcher Servlet에게 전달
    2. DIspatcheServlet은 HandlerMapping을 사용하여 클라이언트의 요청을 처리할 Controller를 획득
    3. DispatcherServlet은 Controller 객체를 이용하여 클라이언트의 요청을 처리
    4. Controller는 클라이언트 요청 처리 결과와 View페이지 정보를 담은 ModelAndView 객체를 반환
    5. DispatcherServlet은  ViewResolver로부터 응답 결과를 생성할 View 객체를 구함
    6. View는 클라이언트에게 전송할 응답을 생성

컨트롤러 클래스 제작

뷰페이지 이름 = prefix + 요청 처리 메소드 반환값 + suffix

뷰에 데이터 전달

  1. Model 객체를 파라미터로 받음
  2. Model 객체에 데이터를 담음 ex) model.addAttribute(”id”,30);
    • 컨트롤러에서 전달 받은 Model 객체의 속성을 이용 ex) id : ${id}

클래스에 @RequestMapping 적용

  • 클래스에 적용된 @RequestMapping과 메소드에 적용된 @RequestMapping이 합쳐짐 ex) 클래스 : /board , 메소드 : /write → 경로 : /board/write

url의 파라미터를 받아 처리하는 방법

1. HttpServletRequest 클래스

@RequestMapping("board/confirmId")
	public String confirmId(HttpServletRequest httpServletRequest, Model model) {
		String id = httpServletRequest.getParameter("id");
		String pw = httpServletRequest.getParameter("pw");
		
		model.addAttribute("id", id);
		model.addAttribute("pw", pw);
		
		return "board/confirmId";
	}

//confirmId.jsp
<body>
	ID : ${id }<br />
	PW : ${pw }
</body>

// 주소로 들어가면 파라미터 값을 받은게 없기 때문에 안뜨지만
// 파라미터 값을 입력해주면 값이 나타난다
// ex) http://localhost:8181/spring_13_1/board/confirmId?id=abcd&pw=1234

2. @RequestParam 어노테이션

@RequestMapping("board/checkId")
	public String confirmId(@RequestParam("id") String id, @RequestParam("pw") int pw, Model model) {
		model.addAttribute("identify", id);
		model.addAttribute("password", pw);
		
		return "board/checkId";
	}

3. 데이터(커맨드) 객체

  • 기존 방법은 파라미터의 값을 얻기 위한 코드의 양이 많아 개선한 방법
  • 기존 코드
@RequestMapping("member/join")
	public String joinData(@RequestParam("name") String name
			,@RequestParam("id") String id
			,@RequestParam("pw") String pw
			,@RequestParam("email") String email
			,Model model) {
		Member member = new Member(); // Member 클래스 생성 
		member.setName(name);
		member.setId(id);
		member.setPw(pw);
		member.setEmail(email);
		
		model.addAttribute("member", member);
		return "member/join";
	}
// join.jsp
<body>
	Name : ${member.name }<br/>
	ID : ${member.id }<br/>
	PW : ${member.pw }<br/>
	Email : ${member.email }
</body>
  • 개선 코드
@RequestMapping("member/join")
	public String joinData(Member member) {
		return "member/join";
	} 
// Member 클래스 생성은 필요, 스프링에서 알아서 member 객체에 set 해주기 때문에 매개변수에 member 객체를 넣음

4. @PathVariable

  • 경로에 참조값 형태로 값을 받는 방법
@RequestMapping("student/{studentId}")
	public String getStudent(@PathVariable String studentId, Model model) {
		model.addAttribute("studentId", studentId);
		
		return "student/studentView";
	}

// url : http://localhost:8181/spring_13_4/student/10

//studentView.jsp
<body>
	student : ${studentId }
</body>

// 결과
student : 10

@RequestMapping 파라미터

  • Get 방식, Post 방식이 있음 → 각각에 맞는 메소드를 생성해야 함
@RequestMapping("/index")
	public String goIndex() {
		return "index";
	}
	
	// @RequestMapping(value = "/student") // 전송방식을 지정하지 않아 get, post 방식이 받아짐 -> 지정한 후 전송방식이 다르면 405 ERROR 발생
	@RequestMapping(method= RequestMethod.GET, value = "/student") // get 방식으로 전송하면 데이터 전송 됨
	public String goStudent(HttpServletRequest httpServletRequest, Model model) {
		String id = httpServletRequest.getParameter("id");
		model.addAttribute("studentId", id);
		return "student/studentId";
	}

@RequestMapping(method= RequestMethod.POST, value = "/student") // 메소드를 오버로딩해 Model 대신 ModelAndView를 사용
	public ModelAndView goStudent(HttpServletRequest httpServletRequest) {
		String id = httpServletRequest.getParameter("id");
		ModelAndView mv = new ModelAndView();
		mv.addObject("studentId", id);
		mv.setViewName("student/studentId");
		return mv;
	}

// index.jsp
<body>
	<!-- <form method="post" action="student.jsp"> -->
	<!-- spring에서는 jsp -> jsp로 넘어가지 못하고 컨트롤러를 거쳐야함  -->
	<form method="post" action="student">
		student id :<input type="text" name="id" /><br />
		<input type="submit" value="전송" />
	</form>
</body>

//studentId.jsp
<body>
	student id : ${studentId }
</body>

@ModelAttribute

  • @ModelAttribute 어노테이션이 붙은 객체가 괄호안에 지정한 문자열의 이름으로 자동으로 Model 객체에 추가되고 HTTP에서 받은 파라미터 값들을 뷰단까지 전달
@RequestMapping("/index")
	public String index() {
		return "index";
	}
	@RequestMapping("/studentView")
	public String studentView(@ModelAttribute("studentInfo") StudentInformation studentInformation) {
  // studentInfo는 studentInformation 객체가 되는것
		return "studentView";
	}

Redirect

  • redirect:키워드 → 키워드에 맞는 페이지로 이동시킴