java,jsp,spring/Spring
Spring 기초 (5)
프루트
2022. 10. 11. 19:56
스프링 MVC(Model- View - Controller) 개요
- 의미 : 사용자 인터페이스로부터 비지니스 로직을 분리하여 애플리케이션의 시각적 요소나 그 이면에서 실행되는 비지니스 로직을 서로 영향 없이 쉽게 고칠 수 있게 하기 위함
- 모델 컴포넌트
- 데이터 저장소(ex: 데이터베이스 등)와 연동하여 사용자가 입력한 데이터나 사용자에게 출력할 데이터를 다루는 일은 함
- 여러 개의 데이터 변경 작업(추가, 변경, 삭제)을 하나의 작업으로 묶는 트랜잭션을 다루는 일도 함
- DAO클래스 Service 클래스에 해당
- 뷰 컴포넌트
- 모델이 처리한 데이터나 그 작업 결과를 가지고 사용자에게 출력할 화면을 만드는 일을 함
- 생성된 화면은 웹 브라우저가 출력하고, 뷰 컴포넌트는 HTML/CSS/JS를 사용하여 웹 브라우저가 출력할 UI를 만듬
- HTML과 JSP를 사용하여 작성할 수 있음
- 컨트롤러 컴포넌트
- 클라이언트의 요청을 받았을 때 그 요청에 대해 실제 업무를 수행하는 모델 컴포넌트를 호출하는 일을 함
- 클라이언트가 보낸 데이터가 있다면, 모델을 호출할 때 전달하기 쉽게 데이터를 적절히 가공하는 일을 함
- 모델이 업무 수행을 완료하면, 그 결과를 가지고 화면을 생성하도록 뷰에게 전달(클라이언트 요청에 대해 모델과 뷰를 결정하여 전달)
- Servlet 과 JSP를 사용하여 작성할 수 있음
- 주요 구성 요소(주로 사용하는 클래스)
- DispatcherServelt : 클라이언트의 요청을 받아서 Controller에게 클라이언트의 요청을 전달하고, 리턴한 결과값을 View에게 전달하여 알맞은 응답을 생성
- Controller : 클라이언트의 요청을 처리한 뒤, Model를 호출하고 그 결과를 DispatcherServlet에게 알려줌
- Model And View : Controller가 처리한 데이터 및 화면에 대한 정보를 보유한 객체
- View : Controller의 처리 결과 화면에 대한 정보를 보유한 객체
- 처리 과정
- 클라이언트의 요청이 Dispatcher Servlet에게 전달
- DIspatcheServlet은 HandlerMapping을 사용하여 클라이언트의 요청을 처리할 Controller를 획득
- DispatcherServlet은 Controller 객체를 이용하여 클라이언트의 요청을 처리
- Controller는 클라이언트 요청 처리 결과와 View페이지 정보를 담은 ModelAndView 객체를 반환
- DispatcherServlet은 ViewResolver로부터 응답 결과를 생성할 View 객체를 구함
- View는 클라이언트에게 전송할 응답을 생성
컨트롤러 클래스 제작
뷰에 데이터 전달
- Model 객체를 파라미터로 받음
- 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:키워드 → 키워드에 맞는 페이지로 이동시킴