JAVA

MVC모델이란

docc 2021. 7. 25. 13:13

MVC모델

Login 전 페이지 1 - 게시물등록준비

// 게시물등록준비에서 게시물등록으로 갈지 로그인준비로 갈지..

요청1 -> 업무1 -> 뷰1 : 뷰1로 가거나 뷰2를 위한 업무2로 가거나
|
-(x)-> 뷰2 : 바로 다른 뷰로 가는건 안된다.
|
-(O)-> 업무2 -> 뷰2 : 업무검사로 간 후 뷰2가 나와야 한다.
요청받았을 때 업무하는 것은 업무처리가 아니라 요청제어라고 한다.
그래서 요청제어(= Control) 와 업무처리(= Model)로 나뉜다.

Model(업무처리) - View(뷰) - Control(요청제어)- : MVC 모델

View는 화면 출력하는 부분(디자인 부분)으로 칭하고,
Model은 데이터베이스와 연동하는 부분 등 로직의 부분을 칭한다.
Controller는 이 두 부분을 적절하게 연결시켜주는 역할을 한다. : 주로 Model의 데이터를 가져와 파일이동에 대해 제어(view갈지 다른 Model로 갈지)

>> ViewResolver.java

public class ViewResolver {
	private static String path = "WEB-INF/views/";
	
	public static String getJspViewName(String viewName) {
        // 또 다른 요청의 "업무처리" 로 가야하는 경우
		if(viewName.contains("forward:/")) {  // "forward:/" 단어가 포함되어 있다면.
            // subsstring(n) : index n번부터 끝까지를 가져옴
			return viewName.substring("forward:/".length()-1) +".jsp";
		}
	    // 이 업무의 "view" 를 보여주는 경우
		return path + viewName + ".jsp";
	}
}

>> 게시물등록준비.jsp

<% 
	// 업무처리

	// 1. 로그인 후 게시물등록이 가능
	// 로그인시 session 에 올린 회원 번호를 얻어와 만약 로그인을 안했다면 null상태이므로 로그인화면으로 보내버림
	boolean 로그인 = (session.getAttribute("no") == null) ? false:true;

	// 테스트용 - 삭제 요망
	로그인 = false; // 로그인된 것으로 간주
	
	// 실행 코드
	String viewName= null;
	if(!로그인){
		viewName="forward:/로그인준비";
		request.setAttribute("msg", "로그인 후 게시물 작성이 가능합니다.");
	}else{
		viewName = "게시물등록창";
	}
	
	// 포워드해줌
	RequestDispatcher rd = request.getRequestDispatcher(ViewResolver.getJspViewName(viewName));
	rd.forward(request,response);
%>

Login & Board

>> 로그인준비.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@page import="com.stone.board_member.util.ViewResolver"%>
<%
	//	1. 업무
	//	1.1 업무규칙
	
	//	1.2 DB
	
	//	2. 다음경로(다른 업무 또는 결과인 뷰) 지정
	
	String viewName = "로그인창";
	// 만약 게시물등록준비에서 넘어온 상태라면 거기에서 request.setAttribute 해온 값이 그대로 넘어와 또다시 넘긴다.
	RequestDispatcher rd = request.getRequestDispatcher(ViewResolver.getJspViewName(viewName));
	rd.forward(request,response);
%>

>> 로그인창.jsp

<body>
	${msg} <%= request.getAttribute("msg") %>
	
	<h1>로그인</h1>
	<form action="" method="post">
		id <input type="text" name="id" /><br>
		password <input type="password" name="password" /><br>
		<input type="submit" value="login"/> <input type="button" value="회원등록"/>
	</form>
	
</body>

>> 게시물등록준비.jsp (로그인 안되었다면 로그인준비로)

<% 
	// 업무처리

	// 1. 로그인 후 게시물등록이 가능
	// 로그인시 session 에 올린 회원 번호를 얻어와 만약 로그인을 안했다면 null상태이므로 로그인화면으로 보내버림
	boolean 로그인 = (session.getAttribute("no") == null) ? false:true;

	// 테스트용 - 삭제 요망
	로그인 = true; // true: 로그인, false: not 로그인
	
	// 실행 코드
	String viewName= null;
	if(!로그인){
		viewName="forward:/로그인준비";
		request.setAttribute("msg", "로그인 후 게시물 작성이 가능합니다.");
	}else{
		viewName = "게시물등록창";
	}
	
	// 포워드해줌
	RequestDispatcher rd = request.getRequestDispatcher(ViewResolver.getJspViewName(viewName));
	rd.forward(request,response);
%>

>> 게시물등록창.jsp

<body>
<h1>게시물등록</h1>
<form action="게시물등록.jsp" method="post">
제목 <input type="text" name="title" id="title"/><br>
내용 <input type="text" name="contents" id="contents"/><br>
<input type="submit" value="등록"/>
</form>
<%= (String)request.getAttribute("key1") %>
</body>

>> 게시물등록.jsp

<%
	// 요청 ===================
	String 제목 = request.getParameter("title");
	String 내용 = request.getParameter("contents");
	Board board = new Board();
	board.setTitle(제목);
	board.setContents(내용);
	
	// 업무  ===================
	boolean 로그인 = (session.getAttribute("no") == null) ? false:true;	
	// 테스트용 - 삭제 요망
	로그인 = true; // true: 로그인, false: not 로그인
	
	if(로그인){
		Member writer = new Member();
		// writer.setNo((Integer)session.getAttribute("no"));
        // 아직 로그인.jsp를 만들어서 session에 setAttribute를 하지 않았으니 인위로 넣었다.
        writer.setNo(1);
		board.setWriter(writer);
		BoardDAO dao = new BoardDAO();
		dao.save(board);
	}
	

	// 경로지정  ===================
	String viewName= null;
	if(!로그인){
		viewName="forward:/로그인준비";
		request.setAttribute("msg", "로그인 후 게시물 작성이 가능합니다.");
	}else{
		viewName = "게시물등록결과통보";
		request.setAttribute("board", board);
	}

	// 포워드해줌
	RequestDispatcher rd = request.getRequestDispatcher(ViewResolver.getJspViewName(viewName));
	rd.forward(request,response);
%>

업무

1. 로그인시 sesstion 공간에 작성자 번호를 넣어놓은 상태(그래야 로그인상태와 게시물작성시 작성자를 분별가능)

2. boolean 로그인 == null 값은 숫자형에는 들어가지 않기 때문에 아직 object 형일 때 비교


>> 게시물등록결과통보.jsp

<body>
<!-- getTitle() 메서드가 자동사용되어 title 을 가져올 수 있는 규칙이다.. -->
${board.title} 가 등록되었습니다.
<%=((Board)request.getAttribute("board")).getTitle() %>
</body>
// 위 아래 같은 결과값