본문 바로가기
국비 과정/JSP

국비 - ( JSP MVC 패턴 )

by 코딩호야 2022. 10. 12.

MVC 패턴이란?

MVC 패턴은 소프트웨어 공학에서 사용하는 디자인 패턴 중 하나로 Model, View, Controller의 앞 글자를 따서 만든 디자인 패턴이다.

 

Model      : 백그라운드에서 동작하며, 사용자가 원하는 데이터나 정보를 제공한다.

View        : 사용자의 요청을 화면으로 출력한다.

Controller : 사용자의 요청을 처리하고, 그 요청에 따른 전체적인 흐름을 제어한다.

 

MVC 패턴은 크게  모델 1 과 모델 2 방식으로 나뉜다.

 

 모델 1방식 뷰와 컨트롤러의 역할이 합쳐져 있다.

흔히 웹 개발을 하면 Jsp가 뷰 역할을 하는데, MVC 1에서 Jsp는 뷰와 컨트롤러의 역할을 모두 감당한다.

 

모델 1 방식의 코드

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%@ page import = "java.sql.*" %>

<h2>데이터베이스 scott의 테이블 student 조회 프로그램</h2>

<hr>
<h2>학생정보 조회</h2>

<%
	Connection con = null;
	Statement stmt = null;
	ResultSet result = null;
	
	String driverName = "oracle.jdbc.driver.OracleDriver";
	String dbURL = "jdbc:oracle:thin:@localhost:1521:xe";
	
	
	try{
		Class.forName(driverName);
		con = DriverManager.getConnection(dbURL, "scott", "tiger");
		stmt = con.createStatement();
		
		// ResultSet은 Statement에서 executeQuery문을 받을 수 있음 테이블 형식으로
		result = stmt.executeQuery("select * from student");
		%>		

		
		<table border = "2">
			<tr>
				<td align = center><b>아이디</b></td>
				<td align = center><b>암호</b></td>
				<td align = center><b>이름</b></td>
				<td align = center><b>입학년도</b></td>
				<td align = center><b>학번</b></td>
				<td align = center><b>학과</b></td>
				<td align = center><b>휴대폰1</b></td>
				<td align = center><b>휴대폰2</b></td>
				<td align = center><b>주소</b></td>
				<td align = center><b>이메일</b></td>
			</tr>
			
			<%
				while(result.next()){
			%>
				<tr>
					<td align = center><%= result.getString(1) %></td>
					<td align = center><%= result.getString(2) %></td>
					<td align = center><%= result.getString(3) %></td>
					<td align = center><%= result.getInt(4) %></td>
					<td align = center><%= result.getString(5) %></td>
					<td align = center><%= result.getString(6) %></td>
					<td align = center><%= result.getString(7) %></td>
					<td align = center><%= result.getString(8) %></td>
					<td align = center><%= result.getString(9) %></td>
					<td align = center><%= result.getString(10) %></td>
				</tr>
		
		<% 
				}
			result.close();
	}catch(Exception e){
		out.println("Oracle 데이터베이스 scott의 student 조회에 문제가 있습니다. <hr>");
		out.println(e.toString());
		e.printStackTrace();
		
	}finally{
		if(stmt != null) stmt.close();
		if(con != null) con.close();
	}
	
	
%>
	</table>
</body>
</html>

 

위와 같이 Jsp가 뷰와 컨트롤러 역할을 모두 수행하면, Jsp에 Java 코드와 Html, css 등의 코드가 섞여 있어, 소스가 복잡해지고 읽기가 어려워져 유지보수가 힘들어 진다.

하지만 설계 자체가 모델 2 방식보다 간단하고 한페이지에 보여지기 때문에 간단한 프로젝트는 모델 2 방식보다 효율적이다.

 

 

모델 2 방식

모델 2은 모델 1에서 유지보수가 힘들다는 단점을 보완하기 위해 나온 모델이다.

기존에 뷰와 컨트롤러의 역할을 모두 수행하던 JSP는 뷰의 역할만 하게 하고, 대신 컨트롤러 역할을 Servlet이 수행한다.

모델은 기존 MVC 1 방식과 동일하다.

 

모델 2 방식 코드

selectStudentbean 페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>데이터베이스 자바빈즈 Test-Table Student 조회</title>
</head>
<body>
<%@ page import = "java.sql.*, javax.sql.DataSource, javax.naming.*" %>
<%@ page import = "java.util.ArrayList, univ.StudentEntity" %>


<h2> 자바	빈즈 StudentDatabase을 이용한 테이블 Student 조회 프로그램</h2>
<hr size = "5" color = "red">

<h2>학생 정보 조회</h2>
<jsp:useBean id ="stdtdb" class="univ.StudentDatabase" scope="page"/>
<%
	ArrayList<StudentEntity> list = stdtdb.getStudentList();
	int counter = list.size();
	
	if(counter > 0){
	%>
		<table border = "2">
			<tr>
				<td align="center"><b>아이디</b></td>
				<td align="center"><b>암호</b></td>
				<td align="center"><b>이름</b></td>
				<td align="center"><b>입학년도</b></td>
				<td align="center"><b>학번</b></td>
				<td align="center"><b>학과</b></td>
				<td align="center"><b>휴대폰1</b></td>
				<td align="center"><b>휴대폰2</b></td>
				<td align="center"><b>주소</b></td>
				<td align="center"><b>이메일</b></td>
			</tr>		
		<%
		for(StudentEntity stdt :list){
			%>
		<tr>
			<td align="center"><%=stdt.getId() %></td>
			<td align="center"><%=stdt.getPasswd() %></td>
			<td align="center"><%=stdt.getName() %></td>
			<td align="center"><%=stdt.getYear() %></td>
			<td align="center"><%=stdt.getSnum() %></td>
			<td align="center"><%=stdt.getDepart() %></td>
			<td align="center"><%=stdt.getMobile1() %></td>
			<td align="center"><%=stdt.getMobile2() %></td>
			<td align="center"><%=stdt.getAddress() %></td>
			<td align="center"><%=stdt.getEmail() %></td>
		</tr>
		<% 
		}
	}
%>
</table>
<p>
<hr size="5" color="green">
조회된 학생수가 <%= counter %> 명 입니다.
<hr size ="5" color="green">
</body>
</html>

 

StudentEntity 페이지

package univ;

public class StudentEntity {
	
	
	private String id;
	private String passwd;
	private String name;
	private int year;
	private String snum;
	private String depart;
	private String mobile1;
	private String mobile2;
	private String address;
	private String email;

	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPasswd() {
		return passwd;
	}
	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getYear() {
		return year;
	}
	public void setYear(int year) {
		this.year = year;
	}
	public String getSnum() {
		return snum;
	}
	public void setSnum(String snum) {
		this.snum = snum;
	}
	public String getDepart() {
		return depart;
	}
	public void setDepart(String depart) {
		this.depart = depart;
	}
	public String getMobile1() {
		return mobile1;
	}
	public void setMobile1(String mobile1) {
		this.mobile1 = mobile1;
	}
	public String getMobile2() {
		return mobile2;
	}
	public void setMobile2(String mobile2) {
		this.mobile2 = mobile2;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
	
	

}

 

StudentDatabase 페이지

import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.util.ArrayList;

public class StudentDatabase {

	// 테이블 Student 데이터베이스 연동을 위한 자바빈즈 프로그램

	private static final String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";
	private static final String JDBC_URL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
	private static final String USER = "scott";
	private static final String PASSWORD = "tiger";

	private Connection conn = null;
	private Statement stmt = null;

	public StudentDatabase() {
		try {
			Class.forName(JDBC_DRIVER); // 객체 생성시 드라이버 로드

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void connect() {
		// 데이터베이스 연결
		try {
			conn = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 데이터베이스 연결 해체 메서드
	public void disConnect() {
		if (stmt != null) {
			try {
				stmt.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		if (conn != null) {
			try {
				conn.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	// 모든 레코드를 반환하는 메서드

	public ArrayList<StudentEntity> getStudentList() {
		connect();

		// 질의 결과를 저장할 ArrayList 객체 생성
		// ArrayList 내부에 학생 정보를 저장한 StudentEntity 가 삽입

		ArrayList<StudentEntity> list = new ArrayList<>();

		String SQL = "SELECT * FROM student";

		try {

			stmt = conn.createStatement();
			ResultSet rs = stmt.executeQuery(SQL);

			// ResultSet 의 모든 행을 각각의 StydentEntity 에 저장
			while (rs.next()) {
				// 한 학생 정보를 저장할 빈즈 객체 생성
				StudentEntity stu = new StudentEntity();

				// 자바빈즈 객체에 저장

				stu.setId(rs.getString("id"));
				stu.setPassword(rs.getString("password"));
				stu.setName(rs.getString("name"));
				stu.setYear(rs.getInt("year"));
				stu.setSnum(rs.getString("snum"));
				stu.setDepart(rs.getString("depart"));
				stu.setMobile1(rs.getString("mobile1"));
				stu.setMobile2(rs.getString("mobile2"));
				stu.setAddress(rs.getString("address"));
				stu.setEmail(rs.getString("email"));

				// ArrayList 의 학생 정보를 StudentEntity 에 추가

				list.add(stu); 
			}
			rs.close();
		} catch (Exception e) {
		} finally {
			disConnect(); // 연결객체 close
		}

		// 완성된 ArrayList 객체를 반환

		return list;

	}

}

 

 

MVC 1에서는 Jsp가 사용자의 호출을 받아줬는데 MVC 2에서는 컨트롤러 역할을 수행하는 Servlet이 요청을 받아준다.

Servlet이 비즈니스 로직을 수행하며 모델을 호출하여 데이터를 요청하며, 최종적으로 뷰 역할인 Jsp를 제어하여 화면을 출력한다.

MVC 2로 개발하게 되면 Html과 Java 코드가 분리되어 확장에 용이하고 유지보수가 수월해진다.

Jsp는 Java 코드를 안 쓰는 대신 JSTL을 사용하여 결과 화면을 보여준다.

하지만 초기 설계단계에 비용이 많이 들어 개발 시간이 오래 걸린다는 단점이 있다.

 

 

 

 

 

MVC 1 과 MVC 2 차이점 정리

MVC 1은 설계가 간단하여 작은 프로젝트에 어울리며, 개발 속도가 빠른 대신 소스가 복잡해져 유지보수가 어렵다.

MVC 2는 소스가 복잡하다는 MVC 1의 단점을 보완하기 위해 탄생했으며, 비교적 큰 프로젝트에 어울리고

설계 단계에서 비용이 많이 들어 개발 속도가 느리다는 단점이 있지만, 확장에 용이하고 유지보수가 수월하다는 것은 

매우 큰 메리트가 될 수 있다.