본문 바로가기
Java

MVC Architecture Model 2 연습예제

by WaterPunch 2021. 4. 25.

1. SQL로 Table 생성 및 데이터 추가

//테이블 생성 SQL
CREATE TABLE member(
	id VARCHAR2(100) PRIMARY KEY,
	password VARCHAR2(100) NOT NULL,
	name VARCHAR2(100) NOT NULL,
	address VARCHAR2(100)
)

// 데이터 추가 SQL
INSERT INTO member(id,password,name,address) VALUES('logitech','m331','로지텍','강남');
INSERT INTO member(id,password,name,address) VALUES('samsung','galaxy','삼성','영통');

SELECT COUNT(*) FROM member; // 멤버 숫자 세는 SQL
SELECT * FROM member; // 모든 멤버 정보 조회 SQL

 

2. MVC 중 Model 부분 작성

package org.waterpunch.praticeMVC.model;

public class MemberVO {
	private String id;
	private String password;
	private String name;
	private String address;
	public MemberVO() {
		super();
		// TODO Auto-generated constructor stub
	}
	public MemberVO(String id, String password, String name, String address) {
		super();
		this.id = id;
		this.password = password;
		this.name = name;
		this.address = address;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "MemberVO [id=" + id + ", password=" + password + ", name=" + name + ", address=" + address + "]";
	}
	
}
package org.waterpunch.praticeMVCmodel1.model;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
// DAO : Data Access Object 데이터베이스 연동 로직을 정의한 객체
public class MemberDAO {
	private String driver="oracle.jdbc.OracleDriver";
	private String url="jdbc:oracle:thin:@127.0.0.1:1521:xe";
	private String user="scott";
	private String pass="tiger";
	public MemberDAO() throws ClassNotFoundException {
		Class.forName(driver);
	}
	public void closeAll(PreparedStatement pstmt,Connection con) throws SQLException {
		if(pstmt!=null)
			pstmt.close();
		if(con!=null)
			con.close();
	}
	//메서드 오버로딩 
	public void closeAll(ResultSet rs,PreparedStatement pstmt,Connection con) throws SQLException {
		if(rs!=null)
			rs.close();
		closeAll(pstmt, con);
	}
    // 멤버 숫자 세는 메서드
	public int getTotalMemberCount() throws SQLException {
		int count=0;
		Connection con=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		try {
			con=DriverManager.getConnection(url, user, pass);
			String sql="select count(*) from member";
			pstmt=con.prepareStatement(sql);
			rs=pstmt.executeQuery();
			if(rs.next())
				count=rs.getInt(1);
		}finally {
			closeAll(rs, pstmt, con);
		}
		return count;
	}
    // ID를 통해서 멤버 정보 찾는 메서드
	public MemberVO findMemberById(String id) throws SQLException{
		MemberVO vo=null;
		Connection con=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		try {
			con=DriverManager.getConnection(url, user, pass);
			String sql="select name,address from member where id=?";
			pstmt=con.prepareStatement(sql);
			pstmt.setString(1, id);
			rs=pstmt.executeQuery();
			if(rs.next()) {
				vo=new MemberVO(id,null,rs.getString(1),rs.getString(2));
			}
		}finally {
			closeAll(rs, pstmt, con);
		}
		return vo;
	}
}

 

3. VIew(JSP) 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Model2 MVC</title>
</head>
<body>
<h3>Model2 MVC Basic</h3>
<ul>
	<li><a href="AllMemberCountServlet">총회원수 조회</a></li>
	<li><a href="findMemberById-form.jsp">회원검색</a>
</ul>
<hr>
<img src="Model2-1.png"><br><br>
<img src="Model2-2.png"><br><br>
<img src="4_forward.png">
</body>
</html>
<!-- 아이디를 통해 그 아이디에 해당하는 정보를 검색하는 Form -->

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원검색화면</title>
</head>
<body bgcolor="lime">

<form action="FindMemberByIdServlet">
아이디 <input type="text" name="memberId" required="required">
<button type="submit">검색</button>
</form>
</body>
</html>

 

4. Controller 생성 (Servlet)

package org.waterpunch.praticeMVCmodel2.controller;

import java.io.IOException;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.kosta.webstudy13.model.MemberDAO;


@WebServlet("/AllMemberCountServlet")
public class AllMemberCountServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

    public AllMemberCountServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try {
			MemberDAO dao=new MemberDAO();
			int count=dao.getTotalMemberCount();
			
            //request 객체에 setAttribute를 이용해 count값을 "totalCount"에 회원수를 저장한다
            //view에서 getAttribute("totalCount") 를 통해 count값을 가져올 수 있다
			request.setAttribute("totalCount", count);  
			
            //forward방식으로 view를 선택하여 이동시켜 클라이언트에게 응답하게 한다 
			request.getRequestDispatcher("membercount-view.jsp").forward(request, response);
		} catch (ClassNotFoundException e) {			
			e.printStackTrace();
		} catch (SQLException e) {			
			e.printStackTrace();
		}
	}
}
package org.waterpunch.praticeMVCmodel2.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.kosta.webstudy13.model.MemberDAO;
import org.kosta.webstudy13.model.MemberVO;


@WebServlet("/FindMemberByIdServlet")
public class FindMemberByIdServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public FindMemberByIdServlet() {
		super();
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String id = request.getParameter("memberId"); 	// client로부터 검색할 회원의 아이디를 받아온다
		
        // Model과 연동, 연동 결과를 반환받는다
		try {
			MemberDAO dao = new MemberDAO();
			MemberVO vo = dao.findMemberById(id);
			String view=null;
			if(vo!=null) {		//회원이 존재하면 find-ok-view.jsp로 이동
				view="find-ok-view.jsp";
                
                //검색 결과를 setAttribue를 이용해 vo값을 "memberVO" 이름으로 저장한다 
                //view에서 getAttribute("memberVO") 를 통해 vo값을 가져올 수 있다
				request.setAttribute("memberVO", vo);  
                
			}else {				//회원이 존재하지 않으면 find-fail-view.jsp로 이동
				view="find-fail-view.jsp";
			}
			request.getRequestDispatcher(view).forward(request, response);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

 

5. 결과창(View) 생성 (JSP)

<!-- 모든 멤버수를 출력해주는 Form -->

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>membercount-view</title>
</head>
<body>
<%-- Controller가 request에 저장한 attribute 정보를 이용해 클라이언트에게 응답한다 --%>
총 회원수 <%=request.getAttribute("totalCount") %> 명 
</body>
</html>
<!-- 아이디에 대한 정보가 존재할 시 출력되는 Form -->

<%@page import="org.waterpunch.praticeMVCmodel2.model.MemberVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>find-ok-view</title>
</head>
<body>
<% MemberVO vo=(MemberVO)request.getAttribute("memberVO"); %>
<h3>검색결과</h3>
아이디 <%=vo.getId() %><br>
이름 <%=vo.getName() %><br>
주소 <%=vo.getAddress() %>
</body>
</html>
<!-- 아이디에 대한 정보가 존재하지 않을 때 출력 -->
<!-- alert을 통해 존재하지 않는다 표시해주고 findMemberById-form.jsp로 되돌아간다 -->

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>find-fail-view</title>
</head>
<body>
<%-- forward 방식이므로 request가 유지되므로 아래처럼 getParameter(name) 가 가능하다 --%>
<script type="text/javascript">
	alert("<%=request.getParameter("memberId")%>아이디에 대한 회원정보가 존재하지 않습니다");
	location.href="findMemberById-form.jsp";
</script>
</body>
</html>

 

 

- 웹브라우저 사용자의 요청을 Controller(Servlet)이 받음.

- VIew(JSP)는 사용자에게 보여주는 역할만 담당하고 실질적인 기능의 부분은 Model에서 담당

장점 : 협업과 유지보수에 유리하다 단점 : 개발시간이 오래걸린다
규모가 크고 개발 후에도 주기적으로 유지보수가 필요한 프로젝트에 적합

모델2 방식은 실질적으로 보여지는 HTML Java 소스를 분리해 놓았기 때문에 모델1 방식에 비해

개발을 확장시키기도 쉽고 유지보수도 쉬움 (좀 더 깔끔하게 코딩할 수 있음)

하지만 개발시간이 오래걸린다

반응형

'Java' 카테고리의 다른 글

[Spring] Spring MVC?  (0) 2021.06.02
DBCP (Database Connection Pool) 연습  (1) 2021.04.25
MVC Architecture Model 1 연습예제  (0) 2021.04.23
Singleton Design Pattern(싱글톤 디자인 패턴)  (0) 2021.04.23
MVC Architecture ( Model 1 / Model 2 )  (0) 2021.04.22

댓글