Recent Posts
Recent Comments
Link
11-21 14:38
Today
Total
관리 메뉴

삶 가운데 남긴 기록 AACII.TISTORY.COM

MVC 패턴 본문

DEV&OPS/Java

MVC 패턴

ALEPH.GEM 2022. 7. 21. 17:32

MVC패턴은 어플리케이션을 Model, View, Controller 으로 작업을 분리해서 모듈간 결합도를 최소화하여 각종 변화하는 상황에 대응하면서도 부작용을 줄이고, 유지보수성도 높일 수 있는 어플리케이션 개발 디자인 패턴을 말합니다.

작업을 모듈별로 나누어 작업하고 이를 결합해 주기 때문에 협업에도 유용하며, 협업시 개발자 자신이 맡은 역할에만 집중할 수 있도록 도와줍니다.

 

View는 클라이언트와 서버간 인터페이스 역할을 하며, 클라이언트 요청을 받고 서버로부터의 결과를 표시해주는 기능을 합니다.

Model은 비지니스 로직 서비스와 데이터베이스 처리를 담당합니다.

Controller는 View와 Model을 연결해주는 역할을 합니다.

 

우선 SQL Developer 같은 DB 툴을 이용하여 오라클DB에 접속한 후 예제에서 사용할 테이블을 생성해봅니다.

CREATE TABLE MEMBER(ID VARCHAR2(10) PRIMARY KEY, PASSWD VARCHAR2(10), NAME VARCHAR2(10), MAIL VARCHAR2(20));

 

net.aacii.beans 패키지에 Member.java 클래스를 생성합니다. 

이 beans 패키지에 생성하는 클래스들은 MVC 패턴에서 모델 역할(DTO 객체: getter/setter) 을 합니다.

beans 객체들은 멤버들을 private로 해서 외부에서 접근할 수 없도록 막고, getter와 setter 메소드를 public으로 구현해줘야 합니다.

package net.aacii.beans;

public class Member {
	private String id;
	private String passwd;
	private String name;
	private String mail;
	
	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 String getMail() {
		return mail;
	}
	public void setMail(String mail) {
		this.mail = mail;
	}
	
}

 

그 다음 View 역할을 하는 memberInput.jsp 을 작성합니다. 

회원 가입 정보를 <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>
<form action="memberProc.jsp" method="post">
ID: <input type="text" name="id" ><br>
PW: <input type="password" name="passwd"><br>
이름: <input type="text" name="name"><br>
mail: <input type="text" name="mail"><br>
<input type="submit" value="가입" >
</form>
</body>
</html>

View에서는 HTML, CSS, Javascript 등을 이용해서 서버와 독립적으로 UI/UX 작업을 View에서 할 수 있습니다.

 

그 다음 Model 처리를 위해 데이터베이스와 연결을 관리하는 DAO객체가 필요합니다.

net.aacii.dao 패키지를 만든 다음 MemberDAO.java 클래스를 작성합니다.

package net.aacii.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import net.aacii.beans.Member;

public class MemberDAO {
	
	//DBMS 연결
	public Connection getConnection() {
		Connection con = null;
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			con = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.6:1521:orcl", "aacii", "aacii");
		} catch (ClassNotFoundException | SQLException e) {
			e.printStackTrace();
		}
		
		return con;
	}

	//회원 정보 저장
	public void insertMember(Member member) {
		Connection con = this.getConnection();
		String sql = "INSERT INTO MEMBER VALUES(?,?,?,?)";
		try {
			PreparedStatement pstmt = con.prepareStatement(sql);
			pstmt.setString(1, member.getId());
			pstmt.setString(2, member.getPasswd());
			pstmt.setString(3, member.getName());
			pstmt.setString(4, member.getMail());
			pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

}

 

 

그 다음 역시 Model작업인 비지니스 로직 회원 가입에 관한 서비스 처리를 위한 Service객체가 필요합니다.

net.aacii.biz 패키지를 만든다음  MemberService.java 클래스를 작성합니다.

package net.aacii.biz;

import net.aacii.beans.Member;
import net.aacii.dao.MemberDAO;

public class MemberService {
	MemberDAO dao = new MemberDAO();
	
	public void memberInsert(Member member) {
		dao.insertMember(member);
	}
}

 

그 다음 Controller를 만들어야 하는데 memberProc.jsp 를 작성합니다.

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>
<%@ page import="net.aacii.biz.MemberService" %>
<%
	request.setCharacterEncoding("UTF-8");
%>
<jsp:useBean id="member" class="net.aacii.beans.Member" />
<jsp:setProperty property="*" name="member" />
<%
	MemberService service = new MemberService();
	service.memberInsert(member);
	
	RequestDispatcher rd = request.getRequestDispatcher("memberOutput.jsp");
	rd.forward(request, response);
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

컨트롤러는 View아 Service 를 연결하여 서비스의 흐름을 제어합니다.

이처럼 컨트롤러를 jsp로 작성하면 Model1 방식이라고 하며 컨트롤러를 servlet으로 작성하면 Model2 방식이라고 합니다.

model1은 jsp가 컨트롤러가 view 역할도 할 수 있지만 역할을 확실히 구분되지 않아 보통 model2방식으로 개발합니다.

 

회원 가입 처리 후 표시할 view 화면 memberOutput.jsp를 작성합니다.

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>가입 완료</title>
</head>
<body>
<h3> 가입이 완료되었습니다.</h3>
</body>
</html>

테스트를 시행해보고 DB툴로 정상적으로 데이터가 insert 되었는지 확인합시다.

 

 

3계층 아키텍처

프레젠테이션 계층(Presentation tier): 뷰와 컨트롤러가 있는 영역을 말합니다.

비즈니스 계층(Business tier): 서비스를 처리하는 영역을 말합니다.

영속 계층(Persistent tier): 데이터베이스 처리를 하는 영역을 말합니다.

 

프레임워크

일반적으로 어플리케이션을 개발할 때 프레임워크를 사용해서 개발합니다.

프레임워크는 이미 MVC패턴으로 디자인되어 어플리케이션의 뼈대가 완성된 상태를 말합니다.

개발자가 할일은 이 프레임워크을 이용해 비지니스 로직(서비스)을 채워 넣는 것입니다.

현실의 프로젝트는 비용과 시간을 줄여야 하기 때문입니다.

프레젠테이션 계층 프레임워크는 대표적으로 Struts, Spring 들이 있습니다.

비지니스 계층 프레임워크는 SpringIoC, AOP 들이 있습니다.

영속 계층 프레임워크는 myBatis나 Hibernate, JPA 들이 있습니다.

 

 front controller 디자인 패턴

서버 입장에서 수많은 뷰의 요청을 통제하기 어려우므로 front controller를 두어 뷰의 요청을 일괄적으로 처리하는 패턴을 프론트 컨트롤러 디자인 패턴이라고 합니다.

프런트 컨트롤러는 다음 두가지 작업이 선행되어야 합니다.

1. 클라이언트의 서비스 요청시 요청되는 URL 패턴의 규칙을 지정합니다. 일반적으로 URL의 끝에 ~.do 등으로 패턴을 지정해서 사용합니다.

2. 지정된 URL의 패턴과 프런트 컨트롤러를 연결합니다. 위에서 지정한 URL 패턴을 web.xml에 지정하여 컨트롤러랑 연결시킵니다.

 

web.xml에 컨트롤러와 URL패턴은 아래 처럼 연결시킵니다.

  <servlet>
  	<servlet-name>front</servlet-name>
  	<servlet-class>net.aacii.controller.FrontController</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>front</servlet-name>
  	<url-pattern>*.do</url-pattern>
  </servlet-mapping>

 

 

 

 

 

 

728x90

'DEV&OPS > Java' 카테고리의 다른 글

JAVA 보안 SQL Injection  (0) 2022.08.03
CRUD  (0) 2022.07.26
JSTL SQL  (0) 2022.07.20
JSTL Formatting  (0) 2022.07.20
JSTL Core  (0) 2022.07.08