[JSP] MVC 디자인 패턴

2022. 2. 8. 17:55·Back/JSP

MVC란 Model - View - Controller 의 약자로, 일반 PC 프로그램 개발에 사용되는 디자인 채턴을 웹 어플리케이션에 도입한 것. 즉, 웹 어플리케이션을 화면 부분, 요청 처리부분, 로직 처리 부분으롤 나누어 개발하는 방법

 

MVC 특징

∙ 각 기능이 분리되어 있어 개발 및 유지보수가 편하다.

∙ 각 기능의 재사용성이 높아진다.

∙ 디자이너와 개발자의 작업을 분업화해섯 쉽개 개발할 수 있다.

 

MVC 구성요소

∙ Model : 비즈니스 로직을 처리한다.

∙ Controller : 사용자의 요청 및 흐름 제어를 담당한다.

∙ View : 사용자에게 보여줄 화면을 담당한다.

 

컨트롤러는 사용자로부터 요청을 받아 어떤 비즈니스 로직을 처리해야 할 지 제어한다.

모델은 데이터베이스 연동 같은 비즈니스 로직을 처리하고, 뷰는 모델에서 처리한 결과를 화면에 구현하여 클라이언트로 전송한다.

 

 

MVC 기능

Controller

   ∙ 서블릿이 컨트롤러의 역할을 한다.

   ∙ 클라이언트의 요청을 분석한다.

   ∙ 요청에 대해서 필요한 모델을 호출한다.

   ∙ Model에서 처리한 결과를 보여주기 위해 JSP를 선택한다.

 

Model

   ∙ 데이터베이스 연동과 같은 비즈니스 로직을 수행한다.

   ∙ 일반적으로 DAO와 VO 클래스로 이루어져 있다.

 

View

   ∙ JSP가 화면 기능을 담당한다.

   ∙ Model에서 처리한 결과를 화면에 표시한다.


회원 정보 조회 기능 구현

회원 조회 기능 흐름도

1) 브라우저에서 /mem.do로 요청한다.

2) 서블릿 MemberController가 요청을 받아 MemberDAO의 listMembers()메소드를 호출한다.

3) MemberDAO의 listMembers() 메소드에서 SQL문으로 회원 정보를 조회한 후 회원 정보를 MemberVO에 설정하여 반환한다.

4) 다시 MemberController에서는 조회한 회원 정보를 회원 목록창으로 포워딩 한다.

5) 회원 목록창에서 포워딩한 회원 정보를 목록으로 출력한다.


회원 정보 조회 기능 구현해보기

[WebContent]-[WEB-INF]-[lib]에 jstl-12.jar을 추가해준다.

listMember.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" import="java.util.*,ex01.*" pageEncoding="UTF-8" isELIgnored="false" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<% request.setCharacterEncoding("UTF-8"); %>

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>회원정보</title>
		
		<style>
			.cls1{ font-size: 40px; text-align: center; }
			.cls2{ font-size: 20px; text-align: center; }
			
			table, td, th {
			  border : 1px solid black;
			  border-collapse : collapse;
			};
		</style>
	</head>
	
	<body>
	
		<p class="cls1">회원정보</p>
		
		<table align="center" border="1">
		
			<tr align="center" bgcolor="lightgray">
				<td width="7%">아이디</td>
				<td width="7%">비밀번호</td>
				<td width="7%">이름</td>
				<td width="7%">이메일</td>
				<td width="7%">가입일</td>
			</tr>
			
			<c:choose>
			
				<c:when test="${empty membersList}">
					<tr>
						<td colspan=5>
							<b>등록된 회원이 없습니다.</b>
						</td>
					</tr>
				</c:when>
				
				<c:when test="${!empty membersList }">
					<c:forEach var="man" items="${membersList}">
						<tr align="center">
							<td>${mem.id}</td>
							<td>${mem.pwd}</td>
							<td>${mem.name}</td>
							<td>${mem.email}</td>
							<td>${mem.joinDate}</td>							
						</tr>						
					</c:forEach>
				</c:when>			
			</c:choose>	
			
		</table>
		
		<a href="#">
			<p class="cls2">회원가입하기</p>
		</a>
		
	</body>
</html>

실행하면 다음과 같은 화면

MemberVO.java

package ex01;

import java.sql.Date;

public class MemberVO 
{
	//필드
	String id;
	String pwd;
	String name;
	String email;
	Date joinDate;
	
	//생성자
	public MemberVO()
	{
		System.out.println("MemberVO 생성자 호출");
	}
	
	//인자 4개를 갖는 생성자
	public MemberVO(String id, String pwd, String name, String email)
	{
		this.id = id;
		this.pwd = pwd;
		this.name = name;
		this.email = email;
	}
	
	//인자 5개를 갖는 생성자
	public MemberVO(String id, String pwd, String name, String email, Date joinDate2)
	{
		this.id = id;
		this.pwd = pwd;
		this.name = name;
		this.email = email;
		this.joinDate = joinDate2;
	}

	//각 속성에 대한 getter/setter
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Date getJoinDate() {
		return joinDate;
	}

	public void setJoinDate(Date joinDate) {
		this.joinDate = joinDate;
	}
}

MemberDAO.java

package ex01;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class MemberDAO 
{
	//필드
	private DataSource dataFactory;
	private Connection conn;
	private PreparedStatement pstmt;
	
	//생성자
	public MemberDAO()
	{
		try
		{
			Context ctx = new InitialContext();
			Context envContext = (Context) ctx.lookup("java:/comp/env");
			dataFactory = (DataSource) envContext.lookup("jdbc/oracle");
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	//listMembers 메소드
	public List<MemberVO> listMembers()
	{
		//membersList 객체 생성
		List<MemberVO> membersList = new ArrayList<MemberVO>();
		
		try
		{
			conn = dataFactory.getConnection();
			//SQL문 작성
			String query = "select * from t_member order by joinDate desc"; //가입한 날짜 내림차순으로
			System.out.println(query);
			
			//PrepareStatement 객체를 생성하면서 SQL문을 인자로 전달한다.
			pstmt = conn.prepareStatement(query);
			ResultSet rs = pstmt.executeQuery();
			
			while(rs.next())
			{
				String id = rs.getString("id");
				String pwd = rs.getString("pwd");
				String name = rs.getString("name");
				String email = rs.getString("email");
				Date joinDate = rs.getDate("joinDate");
				
				//조회한 회원 정보를 레코드별로 MemberVO 객체의 속성에 저장
				MemberVO memberVO = new MemberVO(id, pwd, name, email, joinDate);
				
				//membersList에 MemberVO 객체들을 차례대로 저장
				membersList.add(memberVO);				
			}
			rs.close();
			pstmt.close();
			conn.close();
		}
		catch (SQLException e) 
		{
			e.printStackTrace();
		}
		
		return membersList;
	}
	
	//addMember 메소드
	public void addMember(MemberVO m)
	{
		try
		{
			conn = dataFactory.getConnection();
			
			String id = m.getId();
			String pwd = m.getPwd();
			String name = m.getName();
			String email = m.getEmail();
			String query = "INSERT INTO t_member(id, pwd, name, email)" + "VALUES(?,?,?,?)";
			
			System.out.println(query);
			
			pstmt = conn.prepareStatement(query);
			
			pstmt.setString(1, id);
			pstmt.setString(2, pwd);
			pstmt.setString(3, name);
			pstmt.setString(4, email);
			
			//SQL문 실행
			pstmt.executeUpdate();
			
			pstmt.close();
			conn.close();		
		}
		catch (SQLException e) 
		{
			e.printStackTrace();
		}		
	}	
}
저작자표시 (새창열림)

'Back > JSP' 카테고리의 다른 글

[JSP] scope란?  (0) 2023.05.17
바인딩(Binding)  (0) 2022.02.11
세션을 이용한 웹페이지 연동기능  (0) 2022.02.05
DataSource 이용해 데이터베이스 연동하기  (0) 2022.02.05
서블릿의 비즈니스 로직 처리 방법  (0) 2022.01.31
'Back/JSP' 카테고리의 다른 글
  • [JSP] scope란?
  • 바인딩(Binding)
  • 세션을 이용한 웹페이지 연동기능
  • DataSource 이용해 데이터베이스 연동하기
soyeon26
soyeon26
  • soyeon26
    개발 일지
    soyeon26
  • 전체
    오늘
    어제
    • 분류 전체보기 (107)
      • Web (22)
        • Web (1)
        • HTTP (0)
      • Language (29)
        • Java Script (3)
        • Type Srcipt (1)
        • Java (25)
      • Front (19)
        • HTML+CSS (4)
        • React (15)
      • Back (41)
        • Spring(Springboot) (9)
        • JSP (21)
        • Database (5)
        • NestJS (6)
      • Devops (6)
        • Docker (1)
        • Git & SVN (5)
      • App (7)
        • Android (7)
      • IT 정보 (3)
  • 블로그 메뉴

    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Java
    과학기술인등록번호 조회
    서블릿
    React Next.js
    과학기술인 등록
    인프런
    csr과ssr의 차이
    프론트엔드
    김영한
    csrvsssr
    Next.js
    java의 정석
    스프링부트
    강의후기
    과학기술인 등록번호 발급
    데이터베이스 강의
    과학기술인 번호 발급
    SQL강의 추천
    강의 후기
    sql강의
    중복제거
    springboot
    Next.js 필요성
    자바스크립트set
    백엔드
    React
    Spring
    과학기술인번호 조회
    javascript
    SSR
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
soyeon26
[JSP] MVC 디자인 패턴
상단으로

티스토리툴바