Model-View-Control 패턴(MVC)

1. MVC 패턴 아키텍쳐 구성


Model : 데이터를 처리하는 모듈이고 자바빈즈로 구성 (GuestbookDao,GuestbookVo)
View : 사용자 인터페이스 요소 (ex: 입력창,체크박스)
Controller : 요청받은것을 전달하고 View를 선택하는 역할

2. MVC 패턴 사용이유

복잡한 요구사항 처리

3. 장점

코딩과 유지보수가 쉬움

이클립스 기본 설정

  • 메이븐 프로젝트 생성 : 이름 servlet-practices
  • pom.xml 수정
    pom.xml의 properties태그 , depencdencies태그, build 태그 복사
  • 메이븐 모듈 생성 : 이름 guestbook02
    web.xml 생성(Java EE Tools - Generate Deployment Descripotr Stub)
    web.xml에 xmlns ="http://java -> xmlns="http://JAVA로 변경 * xmlns:xsi아님
    web.xml에 url 패턴 매핑하기 (/gb) : 서블릿 사용시 주소에 경로가보이는 보안에 취약점을 개선
    마리아db dependecy 추가, build부분(tomcat관련) 복사해서 붙여넣기
  • 서버 Targeted Runtime 설정하기
  • 서버 Add and Remove로 guestbook02 추가하기

방명록 애플리케이션 구성 (MVC 패턴 적용)

Model

데이터를 처리하는 모듈

- GuestbookDao 클래스

  1. getConnection()
//JDBC Driver 로딩
Class.forName("org.mariadb.jdbc.Driver");

//연결하기
String url = "jdbc:mysql://127.0.0.1:3306/DB이름?charset=utf8";
conn = DriverManager.getConnection(url, "DB계정", "계정비번");
  1. findAll()
- DB에 저장돼있는 방명록 리스트들을 조회하는기능
- select 쿼리문을 prepareStatement객체로 sql 실행
- resultset에서 제공하는 next()메소드로 select쿼리 결과가 존재하는지 확인
*resultset은 쿼리 결과를 행단위로 저장한다.

- 존재한다면 그 행의 값들(방명록 홈페이지에 표시해야할 정보들 : no,name,regDate,message)을 resultset에서 제공하는 getter메소드(ex:getLong())로 자료형에 맞게 변수에 저장
- 저장한 값들은 List 컬렉션 인터페이스를 구현한 ArrayList에 추가한다.
  1. insert(), delete()
insert와 delete 메소드는 findall 메소드와 전체적인 구성은 비슷하다
- 차이점 
sql문에 바인딩하는 것 추가
데이터를 getter메소드로 얻어오거나 Arraylist에 저장하는 부분은 제거

- GuestbookVo

getters and setters메소드로 구성됨

View

애플리케이션 화면

index.jsp

  • 아직 진도가 나가지 않아서 완전한 MVC는 아님
    그러므로 index.jsp 맨위에 View에서 표시해야할 정보들을 java 코드로 얻어옴
<%
	List<GuestbookVo> list = (List<GuestbookVo>)request.getAttribute("list");
%>
홈페이지 접속시 요청 (http://localhost:8080/guestbook02/gb) 이 
들어왔을 때 컨트롤러에서 조회를 하고
응답된 결과인 DB의 정보를 index.jsp에 보내줘서 list에 담는다

- Control로 넘겨줘야하는 부분

  1. 방명록 추가
    post방식 사용

  2. 방명록 삭제
    개인이 설정한 비밀번호를 새창에서 확인하는 방식
    그러므로 a태그의 속성인 href로 넘긴다

<td><a href="<%=request.getContextPath()%>/gb?a=deleteform&no=<%=vo.getNo()%>">삭제</a></td>

- getContextPath() 는 http://localhost:8080/guestbook02/delteform.jsp에서 /guestbook02를 가져온다
	즉, 상대 경로를 가져오므로 이식성에 장점이 있다.
- 경로에서 &는 다중파라미터를 넘길 때 사용
- 삭제할 게시물은 번호로 구분해야하므로 요청에 no파라미터로 같이 넘겨준다.

나머지는 html 코드로 구성

deleteform.jsp

  1. 방명록 삭제
    post방식 사용

- index.jsp에서 보낸 요청(http://localhost:8080/guestbook02/gb?a=deleteform&no=삭제할게시물넘버)
을 컨트롤러에서 요청의 파라미터(a=~~~) 구분해서 
View 선택(deleteform.jsp)
- 이때 요청도 전달되므로 getparameter로 삭제할 게시물 번호를 얻어와서
post로 다시 전달
<form method="post" action="<%=request.getContextPath()%>/gb?a=delete">
		<input type="hidden" name="no" value="<%=request.getParameter("no") %>">
		<input type="password" name="password" >
		<input type="submit" value="확인">
</form>

나머지는 html 코드

Control

파라미터 구분해서 View 선택, 요청 전달

요청 종류

1. <form action="/guestbook02/gb" method="post">
	<input type = "hidden" name = "a" value = "add">
2. "http://localhost:8080/guestbook02/gb"
3. "http://localhost:8080/guestbook02/gb?a=deleteform&no=삭제할게시물넘버"
4. "http://localhost:8080/guestbook02/gb?a=delete"

동작 과정

1번 요청일 때 (추가기능)

index에서 방명록 작성(확인버튼)시 넘어오는 값

  • a의 add
    name파라미터와 값
    password파라미터와 값
    message 파라미터와 값

add파라미터일 때 같이 넘어온 정보들을 getparameter로 각변수에 저장
vo객체를 생성해서 값들을 저장하고 dao객체의 insert메소드를 통해 DB에 insert 시킨다
★ response.sendRedirect("/guestbook02/gb");
추가기능이나 삭제기능은 새로고침시 데이터가 중복돼서 추가되거나 삭제될 수 있으므로 위 구문을 추가해서 메인 페이지로 이동 시킨다.

2번 요청일 때 (조회기능)

  1. GuestbookDao 객체의 findAll 메소드의 리턴값을 List객체에 저장한다. * dao객체의 findAll()은 ArrayList값(DB정보들)을 리턴한다.
    request.setAttribute("list", list);
    // 이름이 "list"인 속성의 값 list를 내장객체인 request의 setAttribute메소드로 저장한다

  2. RequestDispatcher객체의 getRequestDispatcher()를 통해 index.jsp로 View를 선택

  3. RequestDispatcher객체의 forward로 요청과 응답을 전달
    전달된 요청은 추후 View인 index.jsp에서 request.getAttribute("list")로 값을 가져온다

3번 요청일 때 (삭제폼으로 이동)

  1. RequestDispatcher객체의 getRequestDispatcher()를 통해 delteform.jsp로 View선택
  2. RequestDispatcher객체의 forward로 요청과 응답을 전달

4번 요청일 때 (삭제)

  1. getparameter로 삭제할 게시물의 번호(no)와 패스워드(password)를 가져온다
  2. new GuestbookDao().delete(가져온넘버,비번);
    GuestbookDao의 delete메소드로 삭제할 게시물의 번호와 비밀번호를 보낸다.

0개의 댓글