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의 단점을 보완하기 위해 탄생했으며, 비교적 큰 프로젝트에 어울리고
설계 단계에서 비용이 많이 들어 개발 속도가 느리다는 단점이 있지만, 확장에 용이하고 유지보수가 수월하다는 것은
매우 큰 메리트가 될 수 있다.
'국비 과정 > JSP' 카테고리의 다른 글
| 국비 - 1018 ( JSTL 파일 올리기 ) (0) | 2022.10.18 |
|---|---|
| 국비 - 1017 ( 게시판 폼 만들기 ) (0) | 2022.10.17 |
| 국비 - 1011 ( javabeans , template ) (2) | 2022.10.11 |
| 국비 - 1006 ( response , page context , 액션태그) (0) | 2022.10.06 |
| 국비 - 1005 ( Implicit Object(내장객체) request , exception) (2) | 2022.10.05 |